你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
kgq398 提问时间:2014-11-3 10:58 /
阅读主题, 点击返回1楼
收藏 评论22 发布时间:2014-11-3 10:58
22个回答
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的写周期延时。

  1. void I2C2_WriteBuff16(uint8_t deviceAddr,uint16_t writeAddr,uint8_t *pData,uint8_t size)
  2. {
  3.         uint8_t temp;
  4.         if (HAL_I2C_Mem_Write(&hi2c2,deviceAddr,writeAddr,I2C_MEMADD_SIZE_16BIT,pData,size,I2C_TIMEOUT)!= HAL_OK)
  5.         {}
  6.         while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY);
  7. }
复制代码

  1. /* EEPROM写数据 */
  2. void EE_WriteBuff(uint8_t deviceAddr,uint16_t writeAddr,uint8_t *pData,uint8_t size)
  3. {
  4.         uint8_t index;
  5.         uint8_t temp1,temp2,temp3;
  6.         uint16_t addrTemp = writeAddr;

  7.         temp1 = EE_PAGE_SIZE - writeAddr % EE_PAGE_SIZE;
  8.         if(size > temp1)                                //写数据超过当前页能写数据
  9.         {
  10.                 temp2 = (size-temp1) / EE_PAGE_SIZE;        //整页数
  11.                 temp3 = (size-temp1) % EE_PAGE_SIZE;        //最后页写字节数
  12.         }
  13.         else                                                                                //写数据不跨页
  14.         {
  15.                 temp1 = size;                                        //单页
  16.                 temp2 = 0;
  17.                 temp3 = 0;
  18.         }
  19.         if(temp1)                                                                //写开始页
  20.         {
  21.                 I2C2_WriteBuff16(deviceAddr,addrTemp,pData,temp1);
  22.                 pData = pData+temp1;        //数据指针偏移
  23.                 addrTemp += temp1;
  24.                 DelayMs(8);                                        //必须,5ms写周期,否则写出错
  25.         }
  26.         if(temp2)                                                                //写整数页
  27.         {
  28.                 for(index = 0;index<temp2;index++)
  29.                 {
  30.                         I2C2_WriteBuff16(deviceAddr,addrTemp,pData,EE_PAGE_SIZE);
  31.                         pData = pData+EE_PAGE_SIZE;
  32.                         addrTemp += EE_PAGE_SIZE;
  33.                         DelayMs(8);
  34.                 }
  35.         }
  36.         if(temp3)                                                                //写最后剩余数据
  37.         {
  38.                 I2C2_WriteBuff16(deviceAddr,addrTemp,pData,temp3);
  39.                 DelayMs(8);
  40.         }
  41. }
复制代码



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,请大家帮忙分析,另外板子是自己做的。

谢谢
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版