lstd.net
当前位置:首页 >> 关于iiC总线字节传输的问题 >>

关于iiC总线字节传输的问题

I2C读一个字节的时候是读SDA上的信号,只能一位一位的读,k=(k<<1)|SDA这样写还是不太好,有时候可能会出错,因为k是char类型,而sda上读的是0或者1,是bit类型,可以换一种写法,k=(k<<1)|SDA这样写的本意是将每次读的位保存到k临时变量中,先读取高位,每次保存到k的低位,读取下一位的时候,再将k左移就将之前读取的位都左移了一次.你可以试着每一步试着用一个数值试一下.这样你就话明白了.

因为I2C在读数据的时候实际上是两次传输,第一次传输向设备发送需要读取的寄存器地址(实际的写操作),然后读取数据(实际的读操作);而写操作直接就是把寄存器地址和需要写进去的数据当做一次传输进行(实际的写操作).可以用示波器看看数据线上的数据.

是这样的,I2C总线传送的是串行数据,数据的传送格式为:1)从master模块到slave模块(写的工作方式)时的数据传送格式start slave address R-W A DA TA A DA TA A stop 2)从slave模块到master模块(读的工作方式)时的数据传送格式

sda 应该是 0x80 就是 用K和0x80 进行每一位的或运算

我的理解是,读数据的时候,是从机控制总线,因此必须提前把sda释放(也就是拉高).否则从机将不能改变总线.sda为1后,主机控制scl=1,然后,从机根据自己要发送的数据选择将sda置为1或0(即在scl=1时,从机改变sda).而在发送

位与是逐位相乘 00001111X11100011--------------= 00000011你的条件语句, 没有else,不能对SDA赋值.写成下面就等价了:SDA=0; if((byte & j ) == 1) SDA = 1;

Suggestions: 1. SCL/SDA 在 cable 两端 各加下地滤波电容 (一般 47~100pF,视 I2C 速度而言) 2. 如果可能, 尽量争增加 SCL/SDA signal swing 电压 (3.3volt -> 5.0volt) 3. Master/Slaver firmware 针对 SDA 取样 加入 debounce/filter (最简单为,连续取样几次,是否为相同值) 4. Master firmware 考虑 no-ack 是否重发 command

最后一帧的数据传输方向不同 ,读字节需要先写地址在重启总线然后读,写字节则直接写地址再写数据

这个系列的存储器,器件地址前四位都相同;A2,A1,A0占三位,最后一位是控制读写的吧.都16K的应该是因为这个系列制造的时候,容量是相同的,分区的个数不一样.只能这样理解了

网站首页 | 网站地图
All rights reserved Powered by www.lstd.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com