mlxy123xy 发表于 2015-1-14 00:21:19

24c系列最高读写速度400k,一般都达不到的。肯定要延时。

拼命三郎 发表于 2015-1-14 08:06:57

muyou xueguo

yyblike-263448 发表于 2015-5-14 08:56:37

本帖最后由 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);
      }
}


lcdi 发表于 2015-5-14 10:04:21

看样子HAL库设计的还是不方便啊

yyblike-263448 发表于 2015-5-17 09:23:07

lcdi 发表于 2015-5-14 10:04
看样子HAL库设计的还是不方便啊

在这里和HAL库没有任何关系,HAL库为你实现了读写多个字符的操作,这个主要还是和EEPROM器件有关,在读的过程中,可以直接调用读方法读任意的字节,但是写的过程中EEPROM规定是一页一页的写的,比如你一页16字节,你从0地址开始写17个字节,第0个地址会被第17个字节替换,为了防止替换才需要换页操作了,在其他库的操作中也同样需要这样,只不过在写一个字节的操作可能换页判断会简单点。

wtliu 发表于 2015-5-17 13:57:53

create_ce 发表于 2014-11-4 13:51
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{


I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。

yyblike-263448 发表于 2015-5-18 09:59:07

wtliu 发表于 2015-5-17 13:57
I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。 ...

I2C总线的速度是慢,EEPROM读写最快也就400K,但是你要一个字节一个字节的写那就1K的速度都达不到了。建议查看下EEPROM的分页和页写延时。如果你一个字节一个字节写,要保证第一个字节写进去了然后再写第二个字节,那必须等5ms的延时,才能写下一个,但是处理好了分页操作之后,可以在写入N个字节之后再等待一个5ms的写操作延时。

慧创使者 发表于 2015-7-20 00:52:38

create_ce 发表于 2014-11-3 15:13
我写正常,就是读多字节的时候不太正常

我的读好像也不正常。你怎么解决的?

慧创使者 发表于 2015-7-20 00:56:23

create_ce 发表于 2014-11-4 13:51
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{


我现在按照你的程序,每次都32字节还是异常,每次读出来不一样,太奇怪了

Tony_Duan 发表于 2015-8-26 09:24:06

我的在这里就已经死掉了,单片机为是stm32f103zet6,eeprom是at24c512c. while(HAL_I2C_IsDeviceReady(&hi2c1,0x00A0,10,1000)!=HAL_OK)

读写也全都得不到HAL_OK,请大家帮忙分析,另外板子是自己做的。

谢谢
页: 1 [2] 3
查看完整版本: 关于STM32F4 HAL库操作外部EEPROM的疑惑