STM32F4 HAL库操作外部EEPROM读写不稳定

2019-07-14 15:32发布

关于STM32F4 HAL库操作外部EEPROM的疑惑

最近在搞24C16存储器,用的是STM32F429,工程使用CUBEMX工具生成的,因此使用的是HAL库,
但是发现HAL库提供存储器的函数就两个HAL_I2C_Mem_Write和HAL_I2C_Mem_Read,HAL库已经没有了原来DSP库的那么多函数了
我的代码如下,
static void I2Cx_Init(void)
{
  if(HAL_I2C_GetState(&heval_I2c) == HAL_I2C_STATE_RESET)
  {
    heval_I2c.Instance = I2C2;                        //I2C1
    heval_I2c.Init.ClockSpeed      = I2C_SPEED;
    heval_I2c.Init.DutyCycle       = I2C_DUTYCYCLE_2;
    heval_I2c.Init.OwnAddress1     = 0;
    heval_I2c.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
    heval_I2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
    heval_I2c.Init.OwnAddress2     = 0;
    heval_I2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
    heval_I2c.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLED;  

    /* Init the I2C */
    I2Cx_MspInit();
    HAL_I2C_Init(&heval_I2c);   
  }
}

void Delayiic()
{
        unsigned int i;
        for(i=0;i<500000;i++);
}



void EEPROM_WriteByte(uint16_t addr,uint8_t dat)
{
   HAL_I2C_Mem_Write(&heval_I2c,0xA0,addr,I2C_MEMADD_SIZE_8BIT,&dat,1,1000);
         Delayiic();        
}
uint8_t EEPROM_ReadByte(uint16_t addr)
{
        uint8_t dat;
   HAL_I2C_Mem_Read(&heval_I2c, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, &dat, 1,1000);
         Delayiic();        
        return dat;
}

void TestIIC(void)
{
           unsigned int i=0;

          tmp12= HAL_I2C_IsDeviceReady(&heval_I2c,0xA0,3000,1000);  //检查器件准备好
    for(i=0;i<100;i++)
                  EEPROM_WriteByte(i,0x77);
                for(i=0;i<100;i++)
                  {
                                IIC_DAT=EEPROM_ReadByte(i);
                                if(IIC_DAT!=0x77)
                                        err++;
                        }
                        while(1);        
}

经过测试,读写极不稳定,有时候对,有时候不对。
坛子里有用HAL库IIC的吗,或者版主来一下,帮忙解决一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
szoldman
1楼-- · 2019-07-16 15:41
vyywywew 发表于 2018-12-3 19:46
看样子HAL库设计的还是不方便啊

在这里和HAL库没有任何关系,HAL库为你实现了读写多个字符的操作,这个主要还是和EEPROM器件有关,在读的过程中,可以直接调用读方法读任意的字节,但是写的过程中EEPROM规定是一页一页的写的,比如你一页16字节,你从0地址开始写17个字节,第0个地址会被第17个字节替换,为了防止替换才需要换页操作了,在其他库的操作中也同样需要这样,只不过在写一个字节的操作可能换页判断会简单点。
jfdgs
2楼-- · 2019-07-16 17:34
xiuzhen122 发表于 2018-12-3 18:04
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{

I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。
szoldman
3楼-- · 2019-07-16 21:40
jfdgs 发表于 2018-12-3 20:02
I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。

I2C总线的速度是慢,EEPROM读写最快也就400K,但是你要一个字节一个字节的写那就1K的速度都达不到了。建议查看下EEPROM的分页和页写延时。如果你一个字节一个字节写,要保证第一个字节写进去了然后再写第二个字节,那必须等5ms的延时,才能写下一个,但是处理好了分页操作之后,可以在写入N个字节之后再等待一个5ms的写操作延时。
btvwerwer
4楼-- · 2019-07-17 02:35
xiuzhen122 发表于 2018-12-3 17:02
我写正常,就是读多字节的时候不太正常

我的读好像也不正常。你怎么解决的?
btvwerwer
5楼-- · 2019-07-17 04:52
 精彩回答 2  元偷偷看……
阿什顿信道
6楼-- · 2019-07-17 06:32
我的在这里就已经死掉了,单片机为是stm32f103zet6,  eeprom是at24c512c. while(HAL_I2C_IsDeviceReady(&hi2c1,0x00A0,10,1000)!=HAL_OK)

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

谢谢

一周热门 更多>