#include <AT24C02.h>
#include <i2c.h>
#include <string.h>
#include <usart.h>
#include <tim.h>
//第一个参数 起始地址 第二个参数 写入的数组 第三个参数 数据长度
void WriteDataToAT24C02(uint16_t addr,uint8_t *writbuffer,uint16_t DataSize)
{
if (addr > 255 || DataSize == 0) //无效数据处理
{
// HAL_UART_Transmit(&huart1,"read addr error\r\n",strlen(" read addr error\r\n"),0xFFFF);
}
// 写入指定长读=度数据到AT24C02
for (uint16_t i = 0; i < DataSize; i++)
{ //iic句柄, 写地址0xA0, 从机寄存器地址, 从机寄存器地址长度,发送数据的起始地址,发送数据的大小(byte),操作时间
if (HAL_I2C_Mem_Write(&hi2c2, AT24C02_ADDR_WRITE, addr + i, I2C_MEMADD_SIZE_8BIT, writbuffer + i, 1, 1000) != HAL_OK)
{
// HAL_UART_Transmit(&huart1,"EEPROM write fail\r\n",strlen("EEPROM write fail\r\n"),0xFFFF);
}
delay_us(10000); // AT24C02内部写数据最大5ms就行 因此这个延时大于5ms即可 ms级延时直接用hal库的delay
}
}
void ReadDataFromAT24C02(uint16_t addr, uint8_t *readbuffer, uint16_t DataSize)
{
if(addr > 255 || DataSize == 0)//无效数据处理
{
// HAL_UART_Transmit(&huart1,"write addr error\r\n",strlen(" write addr error\r\n"),0xFFFF);
}
if (HAL_I2C_Mem_Read(&hi2c2, AT24C02_ADDR_READ, addr, I2C_MEMADD_SIZE_8BIT, readbuffer, DataSize, 1000) != HAL_OK)
{
// 处理读取失败
// HAL_UART_Transmit(&huart1,"EEPROM read fail\r\n",strlen("EEPROM read fail\r\n"),0xFFFF);
}
}
delay_us()很重要 要给iic操作的时间 AT24C02数据手册里边有 应该是5ms左右 本代码delay函数是自己用timer写的 做项目的时候遇到了一点问题 HAL_Delay()这个函数 用在串口中断还是iic中会卡死 具体是哪个记不太清楚了 有空解决一下
另外 插入一张iic读eeprom(eeprom器件地址 000 要读的内部地址addr0-3 数据 0x11 0x22 0x33 0x44 )的时序图 ,由于示波器太老了 我不会导出图片 我自己画了一个。。。