你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
w54255787 提问时间:2013-11-28 20:50 /

            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;
            }
            
            
            
37955E98EA5AEFE447F3D6E654CF4F78.JPG
收藏 1 评论11 发布时间:2013-11-28 20:50

举报

11个回答
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
求楼主程序
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版