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

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
求楼主程序
SilentOwl 回答时间:2015-5-24 10:46:57
学习I2C帮顶~
qianfan 回答时间:2015-5-24 11:07:44
F1还是F4?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版