您的位置:首页 > 其它

89和12单片机的I2C通信时序问题

2017-07-20 02:49 190 查看
今天用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的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: