OpenEdv-开源电子网

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

求助,硬件IIC读写EEPROM,读写出错~

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-5-21
在线时间
5 小时
发表于 2018-5-21 18:01:05 | 显示全部楼层 |阅读模式
使用硬件I2C,配置了GPIO和I2C模式,测试读写EEPROM,总是返回写数据失败!驱动编写如下,请问大神哪些地方有可能出错呢??怎么就是读写不进去??
使用的F767IGT6开发版

int main(void)
{

    SystemClock_Config();
    LED_GPIO_Config();
    LED_BLUE;
    DEBUG_USART_Config();
    SysTick_Init();
    I2C_EE_Init();
     
    if(I2C_Test() ==1)
    {
        LED_GREEN;
    }
    else
    {
        LED_RED;
    }

    while (1)
    {
        
    }  

   
}

void I2C_GPIO_Config(void)
{

  GPIO_InitTypeDef  GPIO_InitStructure;
   
  /*!< EEPROM_I2C Periph clock enable */
  EEPROM_I2C_CLK_ENABLE();
  
  /*!< EEPROM_I2C_SCL_GPIO_CLK and EEPROM_I2C_SDA_GPIO_CLK Periph clock enable */
  EEPROM_I2C_SCL_GPIO_CLK_ENABLE();
  EEPROM_I2C_SDA_GPIO_CLK_ENABLE();
  
  /*!< Configure EEPROM_I2C pins: SCL */   
  GPIO_InitStructure.Pin = EEPROM_I2C_SCL_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
  GPIO_InitStructure.Pull  = GPIO_NOPULL;
  GPIO_InitStructure.Alternate = EEPROM_I2C_SCL_AF;
  HAL_GPIO_Init(EEPROM_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);

  /*!< Configure EEPROM_I2C pins: SDA */
  GPIO_InitStructure.Pin = EEPROM_I2C_SDA_PIN;
  HAL_GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);

}

void I2C_Mode_Config(void)
{

    I2C_Handle.Instance = EEPROM_I2C;
    I2C_Handle.Init.Timing           = 0x90913232;//100KHz
    I2C_Handle.Init.OwnAddress1      = 0;
    I2C_Handle.Init.AddressingMode   = I2C_ADDRESSINGMODE_7BIT;
    I2C_Handle.Init.DualAddressMode  = I2C_DUALADDRESS_DISABLE;
    I2C_Handle.Init.OwnAddress2      = 0;
    I2C_Handle.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
    I2C_Handle.Init.GeneralCallMode  = I2C_GENERALCALL_DISABLE;
    I2C_Handle.Init.NoStretchMode    = I2C_NOSTRETCH_DISABLE;

    HAL_I2C_Init(&I2C_Handle);   

    HAL_I2CEx_AnalogFilter_Config(&I2C_Handle, I2C_ANALOGFILTER_ENABLE);   
}

void I2C_EE_Init(void)
{
  I2C_GPIO_Config();

  I2C_Mode_Config();
}

uint8_t I2C_Test(void)
{
    u16 i;

   printf("写入数据");
   
    for ( i=0; i<=255; i++ )
  {   
    I2c_Buf_Write[i] = i;

    printf("0x%02X ", I2c_Buf_Write[i]);
    if(i%16 == 15)   
        printf("\n\r");   
   }

  if(HAL_I2C_Mem_Write(&I2C_Handle, 0xA0, 0, I2C_MEMADD_SIZE_8BIT,I2c_Buf_Write,256, 0x10) == HAL_OK )

   printf("写入数据成功");
  else
  {
     printf("写入数据失败");
      return 0;
  }
  printf("读出数据");
  if(HAL_I2C_IsDeviceReady(&I2C_Handle,0xA0, 10, 1000)!=HAL_OK)
    return 0;
  HAL_I2C_Mem_Read(&I2C_Handle,0xA1, 0, I2C_MEMADD_SIZE_8BIT,I2c_Buf_Read,256, 0x10);
    for (i=0; i<256; i++)
    {   
        if(I2c_Buf_Read[i] != I2c_Buf_Write[i])
        {
            printf("0x%02X ", I2c_Buf_Read[i]);
            printf("写入与读出不一致");
            return 0;
        }
    printf("0x%02X ", I2c_Buf_Read[i]);
    if(i%16 == 15)   
        printf("\n\r");
   
    }
   printf("读写测试成功");
    return 1;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2014-10-29
在线时间
37 小时
发表于 2018-8-4 11:00:29 | 显示全部楼层
你把最重要的两个函数的代码不搞上来,这个这,谁帮你分析,把你的读写函数搞上来,另外自己注意下24cxx系列的要求,写完数据后,只是把数据放在了IC的缓冲区,可没有真正的写入存储阵列;
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-8-4
在线时间
2 小时
发表于 2018-8-4 16:53:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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