24c系列最高读写速度400k,一般都达不到的。肯定要延时。
muyou xueguo
本帖最后由 yyblike-263448 于 2015-5-14 08:58 编辑
看了大家在写的时候是一个字节一个字节的写,按照EEPROM的写要求,写数据需要5ms的延时,那么我写200个字节的硬件延时就1s了,我的方法是这样的,能正常写数据。初始化和读直接调用的库。每次跨页的时候才有一个5ms的写周期延时。
void I2C2_WriteBuff16(uint8_t deviceAddr,uint16_t writeAddr,uint8_t *pData,uint8_t size)
{
uint8_t temp;
if (HAL_I2C_Mem_Write(&hi2c2,deviceAddr,writeAddr,I2C_MEMADD_SIZE_16BIT,pData,size,I2C_TIMEOUT)!= HAL_OK)
{}
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY);
}
/* EEPROM写数据 */
void EE_WriteBuff(uint8_t deviceAddr,uint16_t writeAddr,uint8_t *pData,uint8_t size)
{
uint8_t index;
uint8_t temp1,temp2,temp3;
uint16_t addrTemp = writeAddr;
temp1 = EE_PAGE_SIZE - writeAddr % EE_PAGE_SIZE;
if(size > temp1) //写数据超过当前页能写数据
{
temp2 = (size-temp1) / EE_PAGE_SIZE; //整页数
temp3 = (size-temp1) % EE_PAGE_SIZE; //最后页写字节数
}
else //写数据不跨页
{
temp1 = size; //单页
temp2 = 0;
temp3 = 0;
}
if(temp1) //写开始页
{
I2C2_WriteBuff16(deviceAddr,addrTemp,pData,temp1);
pData = pData+temp1; //数据指针偏移
addrTemp += temp1;
DelayMs(8); //必须,5ms写周期,否则写出错
}
if(temp2) //写整数页
{
for(index = 0;index<temp2;index++)
{
I2C2_WriteBuff16(deviceAddr,addrTemp,pData,EE_PAGE_SIZE);
pData = pData+EE_PAGE_SIZE;
addrTemp += EE_PAGE_SIZE;
DelayMs(8);
}
}
if(temp3) //写最后剩余数据
{
I2C2_WriteBuff16(deviceAddr,addrTemp,pData,temp3);
DelayMs(8);
}
}
看样子HAL库设计的还是不方便啊
lcdi 发表于 2015-5-14 10:04
看样子HAL库设计的还是不方便啊
在这里和HAL库没有任何关系,HAL库为你实现了读写多个字符的操作,这个主要还是和EEPROM器件有关,在读的过程中,可以直接调用读方法读任意的字节,但是写的过程中EEPROM规定是一页一页的写的,比如你一页16字节,你从0地址开始写17个字节,第0个地址会被第17个字节替换,为了防止替换才需要换页操作了,在其他库的操作中也同样需要这样,只不过在写一个字节的操作可能换页判断会简单点。
create_ce 发表于 2014-11-4 13:51
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{
I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。
wtliu 发表于 2015-5-17 13:57
I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。 ...
I2C总线的速度是慢,EEPROM读写最快也就400K,但是你要一个字节一个字节的写那就1K的速度都达不到了。建议查看下EEPROM的分页和页写延时。如果你一个字节一个字节写,要保证第一个字节写进去了然后再写第二个字节,那必须等5ms的延时,才能写下一个,但是处理好了分页操作之后,可以在写入N个字节之后再等待一个5ms的写操作延时。
create_ce 发表于 2014-11-3 15:13
我写正常,就是读多字节的时候不太正常
我的读好像也不正常。你怎么解决的?
create_ce 发表于 2014-11-4 13:51
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{
我现在按照你的程序,每次都32字节还是异常,每次读出来不一样,太奇怪了
我的在这里就已经死掉了,单片机为是stm32f103zet6,eeprom是at24c512c. while(HAL_I2C_IsDeviceReady(&hi2c1,0x00A0,10,1000)!=HAL_OK)
读写也全都得不到HAL_OK,请大家帮忙分析,另外板子是自己做的。
谢谢