搜索
查看: 1517|回复: 2

[原创] 【STM32G4 NUCLEO G431RB】+ AT24C32驱动成功

[复制链接]

该用户从未签到

26

主题

1127

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-7-29
发表于 2019-9-17 12:50:21 | 显示全部楼层 |阅读模式
    我购买的日历模块上除了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. }

复制代码





回复

使用道具 举报

该用户从未签到

3

主题

122

帖子

0

蝴蝶豆

高级会员

最后登录
2022-7-6
发表于 2019-9-17 13:02:04 | 显示全部楼层
^^^^^^^^^^^^^^^^^^^^^^^^^
回复 支持 反对

使用道具 举报

该用户从未签到

26

主题

1127

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-7-29
 楼主| 发表于 2019-9-17 15:52:18 | 显示全部楼层
项目的压缩文件(不含固件库等)。
project.rar (8.8 MB, 下载次数: 59)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-2 07:49 , Processed in 0.167634 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表