1.IIC介绍
IIC属于半双工同步通讯方式。IIC总线上可以管多个器件,每个器件都有唯一的地址,这样可以标记通讯目标,数据的通讯采用主从方式,主机负责发送数据,而从机被动回应数据。两根信号线一个是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。
2.EEPROM
(1)器件型号M24128-BRMN6P
(2)器件读写地址
查看手册器件地址和E0、E1、E2管脚输入电平有关。
写地址:0xA0
读地址:0xA1
WC管脚低电平允许写入
3.具体配置
4.代码编写
(1)main.c 部分修改
#define WRITE_ADDR 0xA0
#define READ_ADDR 0xA1
void eeprom_write_read_test(void)
{
uint8_t write_buf[256];
uint8_t read_buf[256];
int i=0;
int count = 0;
for(i=0;i<256;i++)
{
write_buf[i] = i;
}
HAL_Delay(50);
//
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2,GPIO_PIN_RESET);
for(i=0;i<256;i=i+8)
{
if(HAL_I2C_Mem_Write(&hi2c2, WRITE_ADDR,i,I2C_MEMADD_SIZE_16BIT,write_buf+i,8,10000)==HAL_OK)
{
HAL_Delay(10);
}
else
{
printf("write fail\r\n");
HAL_Delay(10);
}
}
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(150);
if(HAL_I2C_Mem_Read(&hi2c2, READ_ADDR, 0, I2C_MEMADD_SIZE_16BIT, read_buf,256,1000)!=HAL_OK)
{
}
/*
for(i=0;i<256;i++)
{
printf("%d\r\n",read_buf[i]);
}
*/
//读出的数据和写入的数据比较,统计不同的个数
for(int i=0;i<256;i++)
{
if(read_buf[i] != write_buf[i])
{
count++;
}
}
if(count == 0)
{
printf("EEPROM OK\r\n");
}
else if(count > 0)
{
printf("EEPROM FAIL\r\n");
}
}
4.测试结果
写入和读取正常