89和12单片机的I2C通信时序问题
2017-07-20 02:49
190 查看
今天用ADC偶然发现了这个问题,分享给各位朋友。
89的I2CDelay:
12的I2CDelay:
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的
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的
相关文章推荐
- I2C通信之稳定性问题探讨
- 14.1 单片机I2C时序介绍
- android与单片机通信遇到有符号数和无符号数的转换问题简析
- SMT32通过I2C和EP4C通信的问题
- 单片机与FPGA通信的跨时钟域问题多种解决方法总结
- EFM8单片机与I2C外设通信
- 上位机与单片机的通信问题
- PIC单片机之I2C通信(主模式)
- 关于单片机和PC通信显示中文的乱码问题。
- [RK3288][Android6.0] 调试笔记 --- I2C通信失败问题
- XFS5152CE语音合成芯片与Arduino平台I2C通信问题解决
- 51 单片机 C 语言串行双机通信的问题
- 由I2C学通信时序
- 关于单片机串口通信波特率问题
- Android手机蓝牙与单片机通信数据格式问题
- 51系列单片机关于时序问题
- PC机串口调试助手与单片机通信字符问题
- I2C通信时序讲解,代码编写,PCF8591芯片使用范例,AT24C02芯片使用范例
- I2C通信之稳定性问题探讨
- 关于软件I2C与MSP430通信的问题