STM32-使用软件模拟I2C读写外部EEPROM(AT24C02)
一、硬件电路
二、代码实现
I2C驱动程序链接:https://www.cnblogs.com/wenhao-Web/p/14151229.html
1、软件延时
void at24cxx_delay(uint32_t t) { uint32_t i, j;
for(i = 0; i < t; i++) { for(j = 100; j > 0; j--); } }
2、初始化
void at24cxx_init(void) { bsp_analog_i2c_init(); }
3、写一个字节
int8_t at24cxx_write_one_byte(uint8_t reg, uint8_t data) { bsp_analog_i2c_start(); /* 发送设备地址 */ bsp_analog_i2c_send_byte(0xA0); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -1; } /* 发送寄存器地址 */ bsp_analog_i2c_send_byte(reg); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -2; } /* 发送数据 */ bsp_analog_i2c_send_byte(data); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -3; } bsp_analog_i2c_stop(); at24cxx_delay(0xFFFF); return 0; }
4、读多个字节
int8_t at24cxx_read_byte(uint8_t reg, uint8_t *pdata, uint16_t size) { uint16_t i; bsp_analog_i2c_start(); /* 发送设备地址 */ bsp_analog_i2c_send_byte(0xA0); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -1; } /* 发送寄存器地址 */ bsp_analog_i2c_send_byte(reg); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -1; } bsp_analog_i2c_start(); /* 发送设备地址 */ bsp_analog_i2c_send_byte(0XA1); if(bsp_analog_i2c_wait_ack() == 0) { bsp_analog_i2c_stop(); return -1; } /* 接收数据 */ for(i = 0; i < size; i++) { pdata[i] = bsp_analog_i2c_read_byte(); if(i != size - 1 ) { bsp_analog_i2c_ack(); } else { bsp_analog_i2c_nack(); } } bsp_analog_i2c_stop(); return 0; }
5、写多个字节
int8_t at24cxx_write_byte(uint8_t reg, uint8_t *pdata, uint16_t size) { int8_t ret = 0 ; uint16_t i; for(i = 0; i < size; i++) { ret = at24cxx_write_one_byte(reg+i, pdata[i]); if(ret < 0) break; } return ret; }
#endif