打印
[STM32F1]

哪位大神能解释一下STM32硬件I2C的这个bug?

[复制链接]
1105|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 15698208161 于 2017-8-1 18:44 编辑

主要问题是STM32硬件I2C中SR寄存器的ADDR位一直读不出来,经过断点调试后发现
运行完语句I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);后即使SR1寄存器是0x0482,即ADDR位为1,
往下执行SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);的时候ADDR会跳变为0,一开始以为是读操作会使ADDR为0,结果
发现读出来的的SR1寄存器的ADDR也位始终为0。把SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);换成
SR1_Tmp =I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);或者
SR1_Tmp =I2C_GetFlagStatus (EEPROM_I2C,I2C_FLAG_ADDR);也不行。求各位大神给个解释。
这个bug是发生在I2C_EE_ByteWrite函数中的。


主程序如下:
int main(void)
{        
        // 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用
        // SystemInit()函数把系统时钟初始化成72MHZ
        // SystemInit()在system_stm32f10x.c中定义
        // 如果用户想修改系统时钟,可自行编写程序修改
        uint8_t String[20]="transmit begin\n";
        uint8_t String1[20]="transmit complete\n";
        uint8_t String2[20]="receive begin\n";
        uint8_t String3[20]="receive complete\n";
  uint8_t aChar=0;        
        USART_Config();        
  I2C_EEPROM_config();        
        USART_SendString(DEBUG_USARTx,String);
        EEPROM_ByteWrite(0x00,'a');
        USART_SendString(DEBUG_USARTx,String1);
  EEPROM_WaitStandbyState();
        USART_SendString(DEBUG_USARTx,String2);
        aChar=EEPROM_ByteRead(0x00);
        USART_SendString(DEBUG_USARTx,String3);
        USART_SendByte(DEBUG_USARTx,aChar);
        while(1)
        {
        }
}
I2C_EE_ByteWrite函数功能是等待I2C准备好,如下:


void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    /* Send START condition */
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
    /* Send EEPROM address for write */
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        /* Read I2C1 SR1 register */
    SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1 & 0x0002));
  }while(!SR1_Tmp);

  /* Clear AF flag */
  I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
    /* STOP condition */   
    I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}

调试信息如下:

捕获.PNG (32.3 KB )

证明是卡在I2C_EE_ByteWrite函数那了

证明是卡在I2C_EE_ByteWrite函数那了

捕获1.PNG (250.11 KB )

设置的断点

设置的断点

捕获2.PNG (336.76 KB )

调试过程

调试过程

捕获3.PNG (32.07 KB )

就是进入I2C_ReadRegister函数前的这个步骤把ADDR给清零了

就是进入I2C_ReadRegister函数前的这个步骤把ADDR给清零了
沙发
alxd| | 2023-1-12 14:03 | 只看该作者
好像是官方的ST的I2C库有点问题

使用特权

评论回复
板凳
Betty996| | 2023-1-12 15:13 | 只看该作者
正常使用还好,但是好像要操作地址的话,就不行了

使用特权

评论回复
地板
Carina卡| | 2023-1-12 16:18 | 只看该作者
其实楼主可以用软件I2C模拟一下就好了

使用特权

评论回复
5
Allison8859| | 2023-1-12 17:23 | 只看该作者
I2C这个还算是简单,可以用示波器或者逻辑分析仪抓一下看看

使用特权

评论回复
6
Charlene沙| | 2023-1-12 19:21 | 只看该作者
话说,你是不是还是用STM32F1系列的MCU了啊

使用特权

评论回复
7
Belle1257| | 2023-1-12 21:36 | 只看该作者
感觉F1的I2C有点问题,后续的MCU好像没啥事儿了

使用特权

评论回复
8
Betty1299| | 2023-1-13 07:09 | 只看该作者
你可以问问FAE的,看看他们能否帮你解决你的问题

使用特权

评论回复
9
Candic12e| | 2023-1-13 08:13 | 只看该作者
之前I2C就说是有BUG,所以大家大部分都是用的软件I2C

使用特权

评论回复
10
Alina艾| | 2023-1-13 09:10 | 只看该作者
为啥会出现这种问题呢?我也好奇

使用特权

评论回复
11
B1lanche| | 2023-1-13 11:23 | 只看该作者
好像是硬件的BUG吧,这就是STM32F103的通病,好像

使用特权

评论回复
12
SantaBunny| | 2023-1-13 16:40 | 只看该作者
用示波器或者逻辑分析仪抓一下看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝