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

【STM32G4 NUCLEO G431RB】+ AT24C32驱动成功

[复制链接]
hujjj 发布时间: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
^^^^^^^^^^^^^^^^^^^^^^^^^
hujjj 回答时间:2019-9-17 15:52:18
项目的压缩文件(不含固件库等)。
project.rar (8.8 MB, 下载次数: 29)

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

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