OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3295|回复: 11

新手求助!!!!关于EEPROM读写问题

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
发表于 2018-1-24 18:12:16 | 显示全部楼层 |阅读模式
5金钱


用HAL库通过I2C总线对EEPROM进行读写操作时,写入256个字节成功,但是只能读取后面的16个字节,为什么呀!!!!

main.c部分如下:
/* USER CODE BEGIN 2 */
printf("\r\n***************I2C Example*******************************\r\n");
for(i=0; i<256; i++)
    WriteBuffer=i;    /* WriteBuffer init */

/* wrinte date to EEPROM */
if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0x1000) == HAL_OK)
    printf("\r\n EEPROM 24C02 Write Test OK \r\n");
else
    printf("\r\n EEPROM 24C02 Write Test False \r\n");
Delay_MS(5000);
/* read date from EEPROM */
HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 0x1000);
for(i=0; i<256; i++)
    printf("0x%02X  ",ReadBuffer);

if(memcmp(WriteBuffer,ReadBuffer,BufferSize) == 0 ) /* check date */
    printf("\r\n EEPROM 24C02 Read Test OK\r\n");
else
    printf("\r\n EEPROM 24C02 Read Test False\r\n");
  /* USER CODE END 2 */



i2c.c部分如下:
#include "i2c.h"

#include "gpio.h"

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */

I2C_HandleTypeDef hi2c2;

/* I2C2 init function */
void MX_I2C2_Init(void)
{

  hi2c2.Instance = I2C2;
  hi2c2.Init.ClockSpeed = 100000;
  hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(i2cHandle->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */


  /* USER CODE END I2C2_MspInit 0 */
  
    /**I2C2 GPIO Configuration   
    PB10     ------> I2C2_SCL
    PB11     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* I2C2 clock enable */
    __HAL_RCC_I2C2_CLK_ENABLE();
  /* USER CODE BEGIN I2C2_MspInit 1 */


  /* USER CODE END I2C2_MspInit 1 */
  }
}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{

  if(i2cHandle->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspDeInit 0 */


  /* USER CODE END I2C2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_I2C2_CLK_DISABLE();
  
    /**I2C2 GPIO Configuration   
    PB10     ------> I2C2_SCL
    PB11     ------> I2C2_SDA
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);


  /* USER CODE BEGIN I2C2_MspDeInit 1 */


  /* USER CODE END I2C2_MspDeInit 1 */
  }
}


烧录运行结果如图:
TIM截图20180124180923.png

最佳答案

查看完整内容[请看2#楼]

02的最大缓冲区是16个字节吧..一次连接写,可以接收16个字节..
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2018-1-24 18:12:17 | 显示全部楼层
余生多指教 发表于 2018-1-25 09:51
我用的是AT24C02芯片,我记得最大是256字节啊

02的最大缓冲区是16个字节吧..一次连接写,可以接收16个字节..

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-25 01:20:59 | 显示全部楼层
可以参考下我们阿波罗的例程
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2018-1-25 09:07:22 | 显示全部楼层
if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0x1000) == HAL_OK)

这不是 256 个字节了吧.
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 09:38:23 | 显示全部楼层
操作系统 发表于 2018-1-25 09:07
if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0x10 ...

BufferSize 我定义为256了,WriteBuffer是数组的首地址,应该是256字节吧?
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 09:40:41 | 显示全部楼层
正点原子 发表于 2018-1-25 01:20
可以参考下我们阿波罗的例程

好的哦
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2018-1-25 09:45:24 | 显示全部楼层
本帖最后由 操作系统 于 2018-1-25 09:46 编辑
余生多指教 发表于 2018-1-25 09:38
BufferSize 我定义为256了,WriteBuffer是数组的首地址,应该是256字节吧?

0x1000  是什么含义??EEPROM,有写缓冲区的.
超过缓冲区大小会有问题.
请查一下资料.
你 用的EEPROM的缓冲区大小 是多少字节.
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 09:47:08 | 显示全部楼层
操作系统 发表于 2018-1-25 09:45
0x1000  是什么含义??

函数参数解释上说的是Timeout,应该是操作超时相关的吧,我也不太清楚,求指教
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2018-1-25 09:48:30 | 显示全部楼层
你最好发时序出来.就清楚了.使用逻辑分析仪或者示波器 抓几个图看看都明白了.
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 09:51:43 | 显示全部楼层
操作系统 发表于 2018-1-25 09:45
0x1000  是什么含义??EEPROM,有写缓冲区的.
超过缓冲区大小会有问题.
请查一下资料.

我用的是AT24C02芯片,我记得最大是256字节啊
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 09:55:59 | 显示全部楼层
操作系统 发表于 2018-1-25 09:53
02的最大缓冲区是16个字节吧..一次连接写,可以接收16个字节..

是这样子的吗...那我再试试,谢谢啦
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-11-20
在线时间
10 小时
 楼主| 发表于 2018-1-25 10:00:29 | 显示全部楼层
操作系统 发表于 2018-1-25 09:53
02的最大缓冲区是16个字节吧..一次连接写,可以接收16个字节..

问题解决啦!!!的确是超过了缓冲区的大小,感谢大神耐心解释
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 01:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表