本帖最后由 Kituro 于 2022-1-25 01:17 编辑
- void I2C_SendOneByte(unsigned char TxValue)
- {
-
- unsigned char i, k;
- for(i=0; i<8; i++)
- {
- TxValue <<= 1; //Data is transferred with MSB first.
- k = CY;
- SDA = k; //If MSB is 1, the Carry Flag (CY) will be set to 1 after left logical shift, and vice versa.
- delay();
- SCL = 1;
- delay();
- SCL = 0;
- }
- }
复制代码 使用以上程序发送数据, 波形如下:(端口悬空未连接设备, 探头衰减10X)
单片机型号STC8A8K64S4A12, 输出为准双向口(传统8051模式),启用内部4.1K上拉电阻, IO模式图:
可以看到, 波形有三个阶梯(欠幅), 最下方的波形为0V, 中间的波形为约为2.5v, 最高的波形就是高电平5v
这是为什么? 为什么波形会欠幅?
我有想过可能是变量移位, 取数据等消耗了时间, 但如果这样也不应该欠幅啊, 为什么会有一个2.5v的电压出现?
为什么发送数据的波形会出现欠幅现象?
------------------------------------------------------------------------------------------------------------------------------------------
今天又用Keil的debug功能调试了一下程序, 发现一个问题:先上汇编程序:
整个字节的发送过程太过繁琐, 这里精简一下, 只考虑发送一个bit的情况, 当发送"1"(即高电平)时
当程序运行到SDA = 1时, 输出波形没有预想中被拉高到5v, 反而处于2.5v左右的不确定状态, 有较大波动
但当程序运行至"SCL = 0"处时, SDA才被稳定拉高至5V
整个发送中, 以上过程不断循环, 最终导致了波形产生欠幅现象
综上, 我最搞不清楚的一点是:为什么执行SDA = 1之后SDA管脚会处于不确定状态? 而在执行完与SDA毫不相干的"SCL = 0"语句后SDA又被拉高?
是上拉电阻的原因吗? 但如果是因为没有上拉电阻的话, SDA又为什么能被拉高到5V呢?
本人百思不得其解, 如若得君相助, 定感激不尽!
|