w54255787 发表于 2013-11-28 20:50:07

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



            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 ...\r\n");
                  
                  /* 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...\r\n");
                  
                  /* 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...\r\n");
                  
                  /* Send data */
            I2C_SendData(I2C1, 0x00);
                  /* Test on I2C1 EV8 and clear it */
                  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                  printf("3...\r\n");
                  
                  /* Send I2C1 STOP Condition */
            I2C_GenerateSTOP(I2C1, ENABLE);
                  printf("4...\r\n");
                  
                  /* 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...\r\n");
                  
                  /* 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...\r\n");
                  
                  temp=I2C_ReceiveData(I2C1);
                  
                  I2C_AcknowledgeConfig(I2C1, ENABLE);
                  I2C_GenerateSTOP(I2C1, ENABLE);
                  
                  return temp;
            }
            
            
            

Hiker 发表于 2013-11-29 13:20:23

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

I2C的时序很快,请把中间的PRINTF去掉。并且加入I2C总线忙碌保护程序。

w54255787 发表于 2013-11-29 13:50:01

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

  I2C总线忙碌保护程序?能具体说说么

w54255787 发表于 2013-11-29 13:52:22

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

如果是因为printf,那为什么第一次成功,第二次却是失败了呢

fengye5340 发表于 2013-11-29 16:22:37

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

回复第 4 楼 于2013-11-29 13:52:22发表:
如果是因为printf,那为什么第一次成功,第二次却是失败了呢 

 
 
        u8 temp;
 
//在这里增加一个语句:
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
  {
                          ;
  }
// 读的时候要先进行判忙的工作
 
        /*----- Transmission Phase -----*/
  printf("Generate Start I2C ...\r\n");
       
        /* 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...\r\n");

勒布朗 发表于 2013-11-29 21:35:20

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

示波器检查IIC发送有没有数据出来

dzc2001 发表于 2013-11-30 17:54:46

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

一个I2C上面挂好多东西,所以要考虑加锁,当然了,如果你只有一个外设,也可以不考虑。

有缘于你 发表于 2013-12-3 12:06:28

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

函数最后在产生停止位之后等待一个iic 周期, 不然第二次的的开始位会覆盖了上一个停止位, 造成卡住

feiante-155820 发表于 2013-12-14 20:49:30

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

我以前也是会出现死在while,后来还是用模拟的方式了,没有直接用硬件I2C

偶尔合法 发表于 2015-5-21 09:04:56

求楼主程序
页: [1] 2
查看完整版本: I2C和pcf8591通讯第一次成功,第二次却卡住了