I2C和pcf8591通讯第一次成功,第二次却卡住了

2019-07-14 17:32发布

[tr]            STM32和pcf8591(a/d,d/a)通讯(按键控制),第一次按下去没问题,第二次就在这while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 卡住了,求帮助一下
            
                        以下是按下按键后执行的函数:
            
            

            /*******************************************************************************
            * Function Name  : u8 PCF8591_Read(void)
            * Description    : Receive data from channal 0 of PCF8591.
            * Input          : None
            * Output         : None
            * Return         : None
            *******************************************************************************/
            u8 PCF8591_Read(void)//6
            {
                    u8 temp;
                    
                    /*----- Transmission Phase -----*/
              printf("Generate Start I2C ... ");
                    
                    /* Send I2C1 START condition */
              I2C_GenerateSTART(I2C1, ENABLE);
              /* Test on I2C1 EV5 and clear it */
              while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //第二次卡住的地方@@@@@@@@
                    printf("1... ");
                    
                    /* Send PCF8591 slave Address for write */
              I2C_Send7bitAddress(I2C1, 0x90, I2C_Direction_Transmitter);//Receiver
              /* Test on I2C1 EV6 and clear it */
              while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// RECEIVER
                    printf("2... ");
                    
                    /* Send data */
              I2C_SendData(I2C1, 0x00);
                    /* Test on I2C1 EV8 and clear it */
                    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                    printf("3... ");
                    
                    /* Send I2C1 STOP Condition */
              I2C_GenerateSTOP(I2C1, ENABLE);
                    printf("4... ");
                    
                    /* Send I2C1 START condition */
              I2C_GenerateSTART(I2C1, ENABLE);
              /* Test on I2C1 EV5 and clear it */
              while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
                    printf("5... ");
                    
                    /* Send PCF8591 slave Address for read */
              I2C_Send7bitAddress(I2C1, 0x91, I2C_Direction_Receiver);
              /* Test on I2C1 EV6 and clear it */
              while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
                    printf("6... ");
                    
                    temp=I2C_ReceiveData(I2C1);
                    
                    I2C_AcknowledgeConfig(I2C1, ENABLE);
                    I2C_GenerateSTOP(I2C1, ENABLE);
                    
                    return temp;
            }
            
            
            
[/tr]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
竹马还巢
1楼-- · 2019-07-14 22:55
  I2C总线忙碌保护程序?能具体说说么
竹马还巢
2楼-- · 2019-07-15 00:23
如果是因为printf,那为什么第一次成功,第二次却是失败了呢
maruidiyi
3楼-- · 2019-07-15 01:05
回复第 4 楼 于2013-11-29 13:52:22发表:
如果是因为printf,那为什么第一次成功,第二次却是失败了呢 

 
 
        u8 temp;
 
//在这里增加一个语句:
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
  {
                          ;
  }

// 读的时候要先进行判忙的工作
 
        /*----- Transmission Phase -----*/
  printf("Generate Start I2C ... ");
       
        /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //第二次卡住的地方@@@@@@@@
        printf("1... ");
045086068
4楼-- · 2019-07-15 01:34
 精彩回答 2  元偷偷看……
freesea123
5楼-- · 2019-07-15 04:45
一个I2C上面挂好多东西,所以要考虑加锁,当然了,如果你只有一个外设,也可以不考虑。
Sabrina_cc
6楼-- · 2019-07-15 07:42
函数最后在产生停止位之后等待一个iic 周期, 不然第二次的的开始位会覆盖了上一个停止位, 造成卡住

一周热门 更多>