|
殿堂之上 发表于 2023-12-6 09:46 void Write_Byte(unsigned char byte) //写入器件的应答信号由从机给出 { unsigned char i,temp; unsigned int k; temp=byte; SCL=0; Delay(); for(i=0;i<8;i++) { if(temp&0x80)SDA=1; else SDA=0; Delay(); SCL=1; Delay(); SCL=0; Delay(); temp=temp<<1; } SCL=1; //给出一个上升沿,用于产生应答信号 Delay(); SDA=1; while((SDA==1)&&(k<1000)) { k++; Delay(); } //等待SDA出现低电平,出现低电平就表示器件已经应答 SCL=1; SDA=0; Delay(); } 对于应答的处理,每个人有每个人处理方式,或者是说场合不同,代码也会有所不同 对于无应答,有几种处理方法,看你代码应用场合来决定: 1,不理会有没有应答,直接写入下一个字节 2,返回一个IIC错误信息,可以是提示IIC错误,或者是有屏幕提示无应答之类的处理 3,重新启动IIC,再给一个启始信号,继续进行IIC通讯 不管是用那个方法,IIC一定是要有应答系统的,而且,应答是不能死等的,要有一个时间限制的,不然容易卡死 |
coody_sz 发表于 2023-12-5 23:05 等待比退出是不是更好点。要不退出不是会影响到后面程序 |
Y_G_G 发表于 2023-12-5 23:02 那这部分具体要怎样有没有例子发来看下是退出还是用循环等待 |
需要,假如没有应答,则马上发送停止条件退出。 |
用IIC就得等待应答,一定要的 大多人写IIC并不是只为一个程序写的,而是封装一个完整的.C文件,然后可以在任何地方都能用的 你去掉了等待应答,再把这个代码用到别的地方就会出问题的 |
建议直接抄网上代码 |
要是能确保时序正确,可以不要应答,直接给个空时钟,这个时钟必须给了才行连续操作。否则只能一个BYTE访问。 |
确保时序正确能调通检不检测应答我觉得没啥关系。如果需要检测应答的话就判断应答信号,如果错误的话就return出来返回一个标志位这样吧。 |