完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[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 ...rn"); /* 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...rn"); /* 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...rn"); /* Send data */ I2C_SendData(I2C1, 0x00); /* Test on I2C1 EV8 and clear it */ while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); printf("3...rn"); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); printf("4...rn"); /* 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...rn"); /* 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...rn"); temp=I2C_ReceiveData(I2C1); I2C_AcknowledgeConfig(I2C1, ENABLE); I2C_GenerateSTOP(I2C1, ENABLE); return temp; } [/tr] |
|
相关推荐
11个回答
|
|
I2C的时序很快,请把中间的PRINTF去掉。并且加入I2C总线忙碌保护程序。
|
|
|
|
I2C总线忙碌保护程序?能具体说说么
|
|
|
|
如果是因为printf,那为什么第一次成功,第二次却是失败了呢
|
|
|
|
回复第 4 楼 于2013-11-29 13:52:22发表:
如果是因为printf,那为什么第一次成功,第二次却是失败了呢 u8 temp; //在这里增加一个语句: while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) { ; } // 读的时候要先进行判忙的工作 /*----- Transmission Phase -----*/ printf("Generate Start I2C ...rn"); /* 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...rn"); |
|
|
|
示波器检查IIC发送有没有数据出来
|
|
|
|
一个I2C上面挂好多东西,所以要考虑加锁,当然了,如果你只有一个外设,也可以不考虑。
|
|
|
|
函数最后在产生停止位之后等待一个iic 周期, 不然第二次的的开始位会覆盖了上一个停止位, 造成卡住
|
|
|
|
我以前也是会出现死在while,后来还是用模拟的方式了,没有直接用硬件I2C
|
|
|
|
求楼主程序
|
|
|
|
学习I2C帮顶~
|
|
|
|
F1还是F4?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32CUBEMX(13)--SPI,W25Q128外部Flash移植
1548 浏览 0 评论
OV7670摄像头使用串口发送数据到另一个板子上的lcd,出现花屏
1579 浏览 1 评论
909 浏览 0 评论
724 浏览 0 评论
STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植
930 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-7 19:32 , Processed in 1.067679 second(s), Total 93, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号