#申请原创#
@21小跑堂
AT24C02C 是一款由 MicrochipTechnology 生产的串行EEPROM(电可擦可编程只读存储器)芯片,是属于 I²C 接口的非易失性存储器件,可以用来存储需要掉电保存的数据,包括设备配置参数、校准数据和日志记录等。因为手里正好有一块带极海MCU APM32F003F6P6和AT24C02C的小板子,就抽空尝试用模拟I2C的方法实现了对AT24C02C芯片的数据写入和读取操作,下面就给大家分享一下基于模拟I2C的AT24C02C驱动代码及实测仿真结果。 硬件原理图部分如下所示:
对应的引脚是PB4接I2C的CLK时钟信号,PB5接I2C的DAT数据信号,首先需要对两个引脚进行初始化配置,这里需要注意,一般情况下,I2C的两个信号脚尽量配置为开漏输出模式,至于为什么要这么做,有兴趣的可以看下作者发的一篇文章(链接:https://bbs.21ic.com/icview-3464630-1-1.html)。以下便是引脚初始化配置代码: - static void i2c_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
- gpioConfig.mode = GPIO_MODE_OUT_OD; //open drain output
- gpioConfig.speed = GPIO_SPEED_10MHz;
- gpioConfig.intEn = GPIO_EINT_DISABLE;
- gpioConfig.pin = I2C_CLK_PIN | I2C_DATA_PIN ;
- GPIO_Config(I2C_GPIO, &gpioConfig);
- I2C_CLK_SET; //init high
- I2C_DATA_SET; //init high
- }
其中为了增加可读性和移植性,用宏定义实现相关配置,代码如下: - #define I2C_GPIO GPIOB
- #define I2C_CLK_PIN GPIO_PIN_4
- #define I2C_DATA_PIN GPIO_PIN_5
- #define I2C_CLK_SET GPIO_SetBit(I2C_GPIO, I2C_CLK_PIN)
- #define I2C_CLK_RESET GPIO_ClearBit(I2C_GPIO, I2C_CLK_PIN)
- #define I2C_DATA_SET GPIO_SetBit(I2C_GPIO, I2C_DATA_PIN)
- #define I2C_DATA_RESET GPIO_ClearBit(I2C_GPIO, I2C_DATA_PIN)
- #define I2C_DATA_MODE_IN GPIOB->MODE &= 0XFFFFFFDF;
- #define I2C_DATA_MODE_OUT GPIOB->MODE |= (1<<5);
- #define READ_I2C_DATA() GPIO_ReadInputBit(I2C_GPIO,I2C_DATA_PIN)
接着就是通过模拟I2C方法实现AT24C02C的驱动代码,所谓的模拟I2C,也就是通过写入GPIO口输出高低电平信号及读取GPIO高低电平信号的方法来模拟标准I2C的通信时序,类似的还有模拟UART和模拟SPI等。 以下即为AT24C02C的驱动代码,每个函数接口都加了注释说明: 其中Delay_us为非精准延时函数,对通信实时性要求不高的场景,可以将延时基准加长。write_24c02函数和read_24c02函数为写入指定长度数据和读取指定长度数据的接口;write_24c02_byte函数和read_24c02_byte函数为写入一个字节数据到指定地址和从指定地址读取一个字节数据的接口,实际使用时根据需求可自行选择。 接下来通过使用write_24c02_byte函数和read_24c02_byte函数编写测试代码实测一下写入和读取功能,测试代码为循环写入10个数据,写入的起始地址为1;写入完成后,再循环读取出来并保存到一个全局数组里,通过查看全局数组的值即可知道写入和读取是否成功。测试代码如下; - #define EEPROM_DATA_LEN (10)
- uint8_t i2c_data[EEPROM_DATA_LEN];
- for(uint8_t i=0; i< EEPROM_DATA_LEN; i++)
- {
- write_24c02_byte(i+1,i+0x55);
- }
-
- for(uint8_t i=0; i< EEPROM_DATA_LEN; i++)
- {
- i2c_data[i]= read_24c02_byte(i+1);
- }
将GPIO初始化接口和测试代码一起,放到main初始化位置即可: 使用jlink仿真器+Keil IDE进入Debug运行测试,并使用Watch窗口监控i2c_data全局数组的值,实测结果如下图所示: 从以上结果可以看出,已成功完成对EEPROM芯片的数据写入和读取操作,但是在通信稳定性方面,当然也需要通过编写测试程序来验证,比如可以写入一定量的数据到不同的地址,然后将读取出来的数据与写入的数据逐一进行比较,如果出现不相等的情况,串口打印相关日志信息以记录,以此来判断通信稳定性,有兴趣的坛友如有条件,可以实测一下,顺带帮作者验证一下驱动代码是否存在Bug~~。
|