了解I2C协议,并能够使用I2C将数据写入和读出,
I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。
由于它引脚少,硬件 实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛 地使用在系统内多个集成电路(IC)间的通讯。
Address为器件内部存储器地址,00-0XFF。连续写入时,器件内部地址会自动加1(地址低3位),一次写入数据超过8个会覆盖原来数据
字节写(1次连续写入8个字节)
读出:当前地址读、随机地址读和连续读
硬件电路
当 R/W 位为 0 时,表示写方向,所以加上 7 位地址,其值为“0xA0”,称 I2C 设备 的“写地址”;
当 R/W位为 1时,表示读方向,加上 7 位地址,其值为“0xA1”,称为“读地址”。
使用CubeMx配置
使用 CubeMX 生成工程(初始化)
首先在main.c文件前面声明两个输出存储读写数据,宏定义EEPROM读写地址以及缓存数据长度。
#define ADDR_AT24C02_Write 0xA0//写地址
#define ADDR_AT24C02_Read 0xA1//读地址
#define BufferSize 0x100
uint8_t I2C_Buffer_Write[BufferSize];
uint8_t I2C_Buffer_Read[BufferSize];
uint16_t i;
(参考函数)
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
含义如下:
I2C_HandleTypeDef *hi2c --IIC的句柄,本例使用芯片有2个I2C接口,可以选择参数:&hi2c1,&hi2c2
uint16_t DevAddress – IIC设备的外部地址,本例可以选择:写地址0xA0,读地址0xA1
uint16_t MemAddress --IIC设备的内部地址,本例可以选择:0x00—0xFF
uint16_t MemAddSize --读写内部地址的方式,只有两种选择:I2C_MEMADD_SIZE_8BIT 或者 I2C_MEMADD_SIZE_16BIT
uint8_t *pData --写入的数组或者指针
uint16_t Size --写入的字节数
uint32_t Timeout – 超时时间
使用如下函数对24C02进行写入
HAL_I2C_Mem_Write(&hi2c2, ADDR_AT24C02_Write, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000)
读取就没有页的限制,我们可以一次全部读取256个字节。读取使用如下函数:
HAL_I2C_Mem_Read(&hi2c2, ADDR_AT24C02_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,256, 1000);
举例
写入和读取三个参数函数
int8_t params[3]={25,20,15};
uint8_t WriteParam(void)
{
return(HAL_I2C_Mem_Write(&hi2c2, ADDR_AT24C02_Write,16,I2C_MEMADD_SIZE_8BIT,(uint8_t *)params,3,10000)==HAL_OK);
}
uint8_t ReadParam(void)
{
return(HAL_I2C_Mem_Read(&hi2c2, ADDR_AT24C02_Read,16,I2C_MEMADD_SIZE_8BIT,(uint8_t *)params,3,10000)==HAL_OK);
}

编译 烧入就可以了 最好加上写验证代码 确定是否读取 和写入成功
下面一篇文章 以一个实际应用
联合 数码管 键盘 串口通信 和I2C的应用。