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;
}
RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
I2C的时序很快,请把中间的PRINTF去掉。并且加入I2C总线忙碌保护程序。回复:I2C和pcf8591通讯第一次成功,第二次却卡住了
I2C总线忙碌保护程序?能具体说说么RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
如果是因为printf,那为什么第一次成功,第二次却是失败了呢回复: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");
RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
示波器检查IIC发送有没有数据出来RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
一个I2C上面挂好多东西,所以要考虑加锁,当然了,如果你只有一个外设,也可以不考虑。RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
函数最后在产生停止位之后等待一个iic 周期, 不然第二次的的开始位会覆盖了上一个停止位, 造成卡住RE:I2C和pcf8591通讯第一次成功,第二次却卡住了
我以前也是会出现死在while,后来还是用模拟的方式了,没有直接用硬件I2C 求楼主程序
页:
[1]
2