89和12单片机的I2C通信时序问题
【摘要】
今天用ADC偶然发现了这个问题,分享给各位朋友。
89的I2CDelay:
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}1
1...
今天用ADC偶然发现了这个问题,分享给各位朋友。
89的I2CDelay:
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
12的I2CDelay:
void Delay_us(unsigned char us)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--us);
}
I2CDelay(5);
I2C通信分为低速模式100kbit/s、快速模式400kbit/s和高速模式3.4Mbit/s。因为所有的I2C器件都支持低速,但却未必支持另外两种速度,所以作为通用的I2C程序我们选择100k这个速率来实现,也就是说实际程序产生的时序必须小于等于100k的时序参数,很明显也就是要求SCL的高低电平持续时间都不短于5us,因此我们在时序函数中通过插入I2CDelay()这个总线延时函数(它实际上就是4个NOP指令,用define在文件开头做了定义),加上改变SCL值语句本身占用的至少一个周期,来达到这个速度限制。
89的例程用到是11.0592M的晶振。
12/11059200肯定比12M晶振的1us机器周期大,所以89的延时是大于4的,再加上语句执行的时间肯定是大于5us的
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/75453437
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)