你可以在输出时把SDA设置成推挽模式;在读取数据时设置成IO口模式(如果内部上拉电阻足够小的话);最好外部上拉电阻要接上 |
188610329 发表于 2022-1-26 18:07 好吧, 谢谢您的指点! |
Kituro 发表于 2022-1-26 16:36 IIC 通信, SDA, SCL 两个引脚都需要上拉,开漏驱动,不是说,设一个就可以的。 假如是控制 DS1307的话,连SWQ引脚都需要上拉。 你虽然SDA的波跳动,但是,很大的可能是因为CLK的上拉不足。 另外,IIC器件的VCC入口一般需要 104电容滤波,如果是类似 TM系列的LED驱动 芯片, 还需要10uf以上的电解电容,不然都可能造成IIC 传输异常。 |
Kituro 发表于 2022-1-24 21:17 几点, 首先,代码过于复杂, 你不需要 k = CY; 然后 SDA = k; 而是应该直接 SDA = CY; 之前回复我已经有说,准双向模式, 会在 弱上拉极弱上拉之间切换,所以,是不稳定的,IIC器件都是有内部下拉的,所以IO口,最好是开漏模式 + 4.7K上拉, 既然你用的是 STC8系列, 那么,你也不需要改电路,他是内置有 4.7K上拉的。你翻一下手册,把内置4.7K上拉打开,然后,用开漏模式驱动,应该就能解决这个问题了。 |
顶一下 |
188610329 发表于 2022-1-24 13:30 非常感谢您的回复! 我的帖子更新了一下, 有更详细的描述, 请您看一下, 谢谢! |
Kituro 发表于 2022-1-24 13:01 如果你是 89C51 的话, 模拟IIC通信, 应当接在P0总线,并且4.7K上拉。 如果是增强型51的话,应该开启IO的开漏模式,并且4.7K上拉。 用准双向口驱动 IIC设备比较容易发生欠幅问题,因为准双向口的内部弱上拉(约50K)和IIC器件内部的弱下拉(约50K),刚好可以形成一个1/2分压电压。 |
c00156155 发表于 2022-1-24 12:15 没有, 我把SDA映射到P1.4, SCL映射到P1.5, 全部悬空没有挂设备, 我示波器探头开的1X, 输入阻抗相对小, 直接测量P1.5管脚 |
你这个电路是什么样子呢,I2C上有挂什么器件吗 |
188610329 发表于 2022-1-24 00:06 明白了! 学好汇编还是很重要的, 那为什么波形会呈现阶梯状呢? |
AAA_MCU 发表于 2022-1-24 01:03 感谢, 这一点没想到! |
![]() |
首先,如果是发送 0xff 方法1 是正确发送的, 方法2 发送出去是0xfe 其次,哪种方法简单,你是你以为你看上去觉得简单,而是单片机实际运行起来简单。很明显,单片机执行方法1才是最简单的。 最后, CY 是PSW里的一个位没错,但是就指令来讲,他是直接操作的C寄存器。也是C语言方式下,操纵C寄存器的唯一方式。 从字节中提取位,无论如何都是避不开C寄存器的,所以,直接从C寄存器取值是最理想的一种方式,即便你把C语言代码整的再怎么好看,最后还是要把位变量移到C寄存器然后再从C寄存器赋值给IO,你可以编译后看看编译后的指令,最终还是需要 MOV xxx,C 来给IO赋值。 |