野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13654|回复: 5

使用硬件I2C,配置了GPIO和I2C模式,测试读写EEPROM,总是返回写数据失败!

[复制链接]
发表于 2018-5-21 18:31:57 | 显示全部楼层 |阅读模式
使用硬件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;
}

回复

使用道具 举报

发表于 2018-5-22 08:37:05 | 显示全部楼层
帮顶。。。。。。。。
回复

使用道具 举报

发表于 2018-5-22 11:35:40 | 显示全部楼层
啥时能看懂就好了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 17:04:19 | 显示全部楼层
已解决~感觉硬件i2c调不通,最后用的软件i2c完成正确读写
回复 支持 反对

使用道具 举报

发表于 2019-4-10 22:35:07 | 显示全部楼层
小希希爱自己 发表于 2018-5-28 17:04
已解决~感觉硬件i2c调不通,最后用的软件i2c完成正确读写

软件I2C怎么写呢?急求帮助,小白我在整毕设
回复 支持 反对

使用道具 举报

发表于 2019-4-10 23:21:44 来自手机 | 显示全部楼层
怎么觉得程序怪怪的
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:42 , Processed in 0.041664 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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