野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11623|回复: 5

请问<<-EEPROM-ERROR->> I2C 等待超时!errorCode = 6

[复制链接]
发表于 2016-4-8 11:01:59 | 显示全部楼层 |阅读模式
新人求助:
我在PB6、PB7上外接了一个PCF8591模数转换模块,用作其SCL(连PB6)和SDA(连PB7),试图通过修改“I2C-ERROR”例程来对其进行控制。
我的操作如下:
由于这个PCF8591模块是我在51单片机上成功使用的,想把它移植到M4上。在51单片机中的总线读写代码主要就是两句:
                ISendByte(PCF8591,0x42);           //其中PCF8591=0x90,就是模块在总线上的地址;0x42代表模块内部要转换的通道的指令
                output=IRcvByte(PCF8591);        //将转换后的AD值存到output中

于是我根据“I2C-ERROR”例程照猫画虎,在main.c的while(1)里写了这么两句:
                I2C_EE_BufferWrite(PCF8591,0x42,1);    //其中uint8_t PCF8591[1]={0x90};
                I2C_EE_BufferRead(output,0x42,1);
并且在bsp_i2c_ee.h中修改了器件地址:
/* EEPROM Addresses defines */
#define EEPROM_Block0_ADDRESS 0x90   
下载运行后,串口调试助手显示为:
欢迎使用野火  STM32 F429 开发板。


这是一个I2C外设(AT24C02)读写测试例程
<<-EEPROM-ERROR->> I2C 等待超时!errorCode = 6

请问大神这个错误EV6表示什么?我搜百度,有人说是“检测主机传输模式是否成功 (检测EV6)”,可以解释一下是哪里存在问题吗?
回复

使用道具 举报

发表于 2016-4-8 11:10:52 | 显示全部楼层
这个errorCode 不一定是ev6,
在你的代码里找到这个callback函数输入为6的地方,然后查看是卡在哪个while循环里

  while(!I2C_CheckEvent(GTP_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
  }


另外注意IIC驱动程序有的是使用7位IIC地址,有的使用“8位“IIC地址,注意区分
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-8 11:14:52 | 显示全部楼层
搜了一下例程,errorCode 6应该就是EV6:

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
  }
回复 支持 反对

使用道具 举报

发表于 2016-4-8 12:27:22 | 显示全部楼层
suj 发表于 2016-4-8 11:14
搜了一下例程,errorCode 6应该就是EV6:

  /* Test on EV6 and clear it */

看看你的iic引脚有没有接上拉电阻,有没有跟其它设备共用
回复 支持 反对

使用道具 举报

发表于 2022-3-17 18:53:40 | 显示全部楼层
我也遇见了同样的问题I2C_EE_BufferRead卡死在检测EV6的循环中
while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(11);
}
然后我在I2C_EE_BufferRead读数据前加入这个函数I2C_EE_WaitEepromStandbyState()等待EEPROM收到地址的ACK,之后可以接收到数据了。
void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    /* Send START condition */
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
    /* Read I2C1 SR1 register */
    SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
    /* Send EEPROM address for write */
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));
  
  /* Clear AF flag */
  I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
  /* STOP condition */   
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}
手册上写I2C_SR1 bit1 ADDR:地址已被发送(主模式) 7位地址模式时,当收到地址的ACK后该位被置’1’。
回复 支持 反对

使用道具 举报

发表于 2022-3-17 19:00:44 | 显示全部楼层
或者使用视频里的I2C_GetFlagStatus检测标志函数也可以
void I2C_EE_WaitEEpromWriteEnd(void)  
{
  do
  {/* 1.Send START condition */
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);

    while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_SB) == RESET);
       
    /* 2.Send EEPROM address for write */
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  } while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_ADDR) == RESET);
       
  /* Clear AF flag */
  I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
       
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 04:38 , Processed in 0.030064 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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