你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32G4 NUCLEO G431RB】+ AT24C32驱动成功

[复制链接]
老牛洋车 发布时间:2019-9-17 12:50
    我购买的日历模块上除了DS1307外,还有一块AT24C32EEPROM,在DS1307成功驱动后,继续驱动AT24C32就顺理成章了。
    因为软件I2C在驱动DS1307时已经调试好了,所以AT24C32的驱动就异常顺利,加上我之前就有驱动AT24C02的代码,而AT24C32仅仅是地址比AT24C02多一个字节,复制过来后,只要稍作修改,并写单字节地址改为写双字节地址,整个驱动就算完成了。
    下面是AT24C32的驱动代码,其实就是四个函数,分别是读写单个字节,读写连续的多个字节(此处没有考虑跨页处理)。

  1. #include "i2c.h"
  2. #include "at24c32.h"

  3. /*************************************************************
  4. * 函数名:  at24cxx_Wite_Data(uint8_t addr,uint8_t data)
  5. * 输入参数:addr = 要写入的地址
  6. *           data = 要写入的数据
  7. * 输出参数:无
  8. *************************************************************/
  9. void at24cxx_Write_Data(uint16_t addr,uint8_t data) // 将数据data写入指定地址Addr
  10. {

  11.     SI2C_Start();                //开始I2C通讯
  12.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址
  13.     SI2CIsAck();                 //等待应答
  14.     SI2C_Send(addr>>8);          //发送高8位地址
  15.     SI2CIsAck();                 //等待应答
  16.     SI2C_Send(addr%256);         //发送低8位地址
  17.     SI2CIsAck();                 //等待应答
  18.     SI2C_Send(data);             //发送数据
  19.     SI2CIsAck();                 //等待应答
  20.     SI2C_Stop();                 //结束I2C通讯
  21.     delay_us(4);
  22. }

  23. /*************************************************************
  24. * 函数名:  at24cxx_Read_Data(uint8_t addr)
  25. * 输入参数:addr = 要读取的地址
  26. * 输出参数:data = 读出的数据
  27. *************************************************************/
  28. uint8_t at24cxx_Read_Data(uint16_t addr)            // 读指定地址Addr里的数据Data
  29. {
  30.     uint8_t data=0x00;
  31.    
  32.     SI2C_Start();                //开始I2C通讯
  33.     SI2C_Send(0xA0);             //发送EEPROM器件地址
  34.     SI2CIsAck();                 //等待应答
  35.     SI2C_Send(addr>>8);          //发送高8位地址
  36.     SI2CIsAck();                 //等待应答
  37.     SI2C_Send(addr%256);         //发送低8位地址
  38.     SI2CIsAck();                 //等待应答

  39.     SI2C_Start();
  40.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
  41.     SI2CIsAck();
  42.    
  43.     data = SI2C_Receive();       //读一字节数据
  44.     SI2CDoAck();
  45.     SI2C_Stop();
  46.     delay_us(4);
  47.     return data;
  48. }

  49. /*************************************************************
  50. * 函数名:  at24cxx_Page_Write(uint8_t addr,uint8_t *buff,uint8_t size)
  51. * 输入参数:addr = 要写入的起始地址
  52. *           *buff= 要写入的数组指针
  53. *           size = 数组的长度
  54. * 输出参数:无
  55. *************************************************************/
  56. void at24cxx_Page_Write(uint16_t addr,uint8_t *buff,uint8_t size) // 将数据buff数组写入指定起的始地址Addr
  57. {
  58.     uint8_t i;
  59.        
  60.     SI2C_Start();                //开始I2C通讯
  61.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址
  62.     SI2CIsAck();                 //等待应答
  63.     SI2C_Send(addr>>8);          //发送高8位地址
  64.     SI2CIsAck();                 //等待应答
  65.     SI2C_Send(addr%256);         //发送低8位地址
  66.     SI2CIsAck();                 //等待应答       
  67.         for(i=0; i<size; i++){
  68.         SI2C_Send(buff[i]);      //发送数据
  69.         SI2CIsAck();             //等待应答
  70.     }
  71.         SI2C_Stop();                 //结束I2C通讯
  72.     delay_us(4);
  73. }

  74. /*************************************************************
  75. * 函数名:  at24cxx_Page_Read(uint8_t addr)
  76. * 输入参数:addr = 要读取的地址
  77. * 输出参数:data = 读出的数据
  78. *************************************************************/
  79. uint8_t at24cxx_Page_Rea(uint16_t addr,uint8_t size)// 读指定起始地址Addr里的数据到buff
  80. {
  81.     uint8_t i,buff[size];
  82.    
  83.     SI2C_Start();                //开始I2C通讯
  84.     SI2C_Send(0xA0);             //发送EEPROM器件地址
  85.     SI2CIsAck();                 //等待应答
  86.     SI2C_Send(addr>>8);          //发送高8位地址
  87.     SI2CIsAck();                 //等待应答
  88.     SI2C_Send(addr%256);         //发送低8位地址
  89.     SI2CIsAck();                 //等待应答

  90.     SI2C_Start();
  91.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
  92.     SI2CIsAck();
  93.     for(i=0; i<size; i++){
  94.         buff[i] = SI2C_Receive();//读一字节数据
  95.         SI2CDoAck();
  96.     }
  97.         SI2C_Stop();
  98.     delay_us(4);
  99.     return *buff;
  100. }

复制代码





收藏 评论2 发布时间:2019-9-17 12:50

举报

2个回答
jxchen 回答时间:2019-9-17 13:02:04
^^^^^^^^^^^^^^^^^^^^^^^^^
老牛洋车 回答时间:2019-9-17 15:52:18
项目的压缩文件(不含固件库等)。
project.rar (8.8 MB, 下载次数: 31)

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版