首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EEPROM协议误解

EEPROM协议误解
EN

Stack Overflow用户
提问于 2021-03-09 21:28:48
回答 1查看 94关注 0票数 1

我目前使用的是michrochip的eeprom ( 24cw160 ),通过i2c连接到stm32f4 (11RET)。当我的逻辑分析器打印一些i2c消息(带有确认)时,配置和连接似乎正常工作,我可以发送数据和接收数据。在阅读了reference manual(特别是第13页和第18页,其中包含我正在进行的两个操作的原理图)之后,我期望下面的代码发送数据0,1,2……发送到x10之后的地址,然后接收回相同的数据并打印:

代码语言:javascript
复制
while(true){

    HAL_Delay(1000);
    std::array<uint8_t,100> arr{};
    int counter=0;
    for(auto&i :arr){
      i=counter;
      counter++;
    }
    auto ret1 = HAL_I2C_Mem_Write_DMA(&hi2c1 , 0xa0 , 0x10 , 1 ,arr.data() , arr.size());
    HAL_Delay(1000);
    std::array<uint8_t,100> arr2{};
    arr2.fill(1);
    auto ret2 = HAL_I2C_Mem_Read( &hi2c1 , 0xa1 , 0x10 , 1 , arr2.data() , arr2.size(),100);
    printf("arr2:\n");
    for(auto i:arr2){
      printf("%d,",(int)i);
    }
    printf("\nWrite ret status: %d\nRead ret status: %d\n",ret1,ret2);
  }

相反,我在我的终端上得到的是:

代码语言:javascript
复制
arr2:
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
Write ret status: 0
Read ret status: 0
arr2:
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
Write ret status: 0
Read ret status: 0

注意,打印的第一行和第二行有一些不同,第二行是重复的(所以虽然第一次打印的东西和其他的有点不同),但老实说,我认为我把自己和我给HAL_I2C_Mem_Writeread的常量参数搞混了,我也想要一些解释。有关更多信息,请评论我,我将提供所有必要的诊断/初始化等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 15:53:53

多亏了这些评论,我成功地将一个字节发送到了我想要的任何地址。前面代码的一个值得注意的错误是MemAddress参数(HAL_I2C_Write_Mem的第三个参数),因为我的eeprom是11位可寻址的,所以我应该向hal声明它是16而不是8,因为5个额外的位被忽略,但小于11可能会发生故障。

第二个问题是,我试图写入超过32个字节,并且我只读取前32个字节,因为协议不接受一次写入或读取超过一个32字节的页面。因此,以下是修改后的代码,其中包含对更改的一些注释:

代码语言:javascript
复制
std::array<uint8_t,32> arr{0}; //32 bytes instead of something silly
unsigned counter=0;
for(auto&i :arr){
    i=counter;
    counter++;
}
// 0x20 is a start of a page so it can write all 32 bits
// I2C_MEMADD_SIZE_16BIT is the value 2 instead of 1 I had
// The extra 5 bits are ignored
// For the testing I call the blocking write
auto ret1 = HAL_I2C_Mem_Write(&hi2c1 , 0xa0 , 0x20 , I2C_MEMADD_SIZE_16BIT , arr.data() , arr.size(),4);
HAL_Delay(4);
std::array<uint8_t,32> arr2{0};
arr2.fill(1);
auto ret2 = HAL_I2C_Mem_Read( &hi2c1 , 0xa1 , 0x20 , I2C_MEMADD_SIZE_16BIT , arr2.data() ,arr2.size(),4);
HAL_Delay(4);
printf("arr2: ");
for(auto i:arr2)
   printf(" %d,",(int)i);
printf("\nWrite ret status: %d\nRead ret status: %d\n",ret1,ret2);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66547830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档