打印

使用I2C读取信息??

[复制链接]
4453|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2008-9-23 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
又有问题要来请教各位前辈们。
在用SMBus读取信息时遇到了麻烦,命令的格式是这样的:
S+slaveaddr+command code+S+(slaveaddr|0x01)......
现在发送slaveaddr可以正确得到从机返回的ACK,但是发送command code的时候就收不到ACK了。用示波器抓到图1所示的波形,可以看到,主机在发送完数据之后就直接把CLK拉低了,根本就没有等待接收ACK。
正确的话应该是像图2那样,即使器件没有响应也能收到一个NACk的吧???简单的说就是应该能看到9个CLK脉冲吧??但是我现在发command code之后只能数到8个。
请教一下各位前辈,这有可能是什么地方出了问题??是command code不正确,还是器件有问题??折腾了一个星期了。谢谢。



今天发现这样的情况,在同一根I2C总线上挂了三个器件,先不说遇到问题的0x16那个。
用相同的代码读写其中一个FM器件可以正常操作,(就是利用写进去两个字节,再读出这两个字节的办法)但是读写另外一个24C02的时候就不行了,读出来的全是FF,用示波器看到波形似乎没有什么问题,8bit数据+ACK,读和写的波形都没什么问题。不知道究竟是写不进去,还是读不出来.....

相关帖子

沙发
dragon_hn| | 2008-9-23 15:12 | 只看该作者

slaveaddr最后一位必须为0,代表写

slaveaddr最后一位必须为0,代表写。从你波形上看你的是1,代表读。

使用特权

评论回复
板凳
箫笑|  楼主 | 2008-9-23 15:26 | 只看该作者

的确是零

上面的图SDA那根线只是我随便画的,代表的是command code的值,没有画slaveaddr的。
实际上我发送的slaveaddr是0x16(00010110),而且也没有遇到问题,关键是发送command code了才遇到上面说的问题。
流程这样:

1.发送Start   (没有问题)
2.发送slavaddr,0x16   (没有问题,得到了ACK)
3.发送command code,图上就是0111 1011,芯片Datasheet里从0x00~0x7f都有对应不同的command.   (出问题了,得不到ACK,用示波器发现上面的情况)
4........

使用特权

评论回复
地板
lyjian| | 2008-9-23 15:34 | 只看该作者

搞不懂

简单的说就是应该能看到9个CLK脉冲吧??但是我现在发command code之后只能数到8个。
***************************************
CLK脉冲的多少不是你控制的吗?

使用特权

评论回复
5
箫笑|  楼主 | 2008-9-23 15:41 | 只看该作者

用的是硬件的I2C

用的MCU是带I2C模块的,硬件实现上面的操作,所以我只是控制一下寄存器而已。相同的代码发送slaveaddr跟commande code出现了不一样的情况。所以觉得奇怪。

使用特权

评论回复
6
箫笑|  楼主 | 2008-9-24 15:45 | 只看该作者

没人理我.....

今天发现这样的情况,在同一根I2C总线上挂了三个器件,先不说遇到问题的0x16那个。
用相同的代码读写其中一个FM器件可以正常操作,(就是利用写进去两个字节,再读出这两个字节的办法)但是读写另外一个24C02的时候就不行了,读出来的全是FF,用示波器看到波形似乎没有什么问题,8bit数据+ACK,读和写的波形都没什么问题。不知道究竟是写不进去,还是读不出来.....

使用特权

评论回复
7
箫笑|  楼主 | 2008-9-25 18:15 | 只看该作者

又来!!!

大佬们哼一声吧,嘲笑也笑出声音来让俺听听........

有没有可能是时序的问题,每种器件对I2C线上的电平持续时间要求不相同引起的???

使用特权

评论回复
8
箫笑|  楼主 | 2008-9-25 18:17 | 只看该作者

补充一点

尝试过用软件来实现I2C操作了,读写一个字节的时间要比硬件实现多很长很长,结果是相同的.......

使用特权

评论回复
9
oumi| | 2008-9-26 12:30 | 只看该作者

我也遇到同样的问题

**作24c64,结果可以写了,但是不能读,读的时候像楼主的问题一样,下午再调下。

使用特权

评论回复
10
oumi| | 2008-9-26 17:22 | 只看该作者

有眉目了

“现在发送slaveaddr可以正确得到从机返回的ACK,但是发送command code的时候就收不到ACK了。用示波器抓到图1所示的波形,可以看到,主机在发送完数据之后就直接把CLK拉低了,根本就没有等待接收ACK。”

我这边在command code发去24c64后可以收到24c64的ack。。我用c8051f410的smbus

使用特权

评论回复
11
箫笑|  楼主 | 2008-9-27 14:32 | 只看该作者

那不是奇怪,那是相当奇怪

我提到的有两个疑问,
关于读24C02的其实没有问题,自己犯了个低级的错误而已,不好意思说出来。
关于SMBus的,我是用单片机读bq20z90的信息,检测电池电量的。以前提到说第二步发送command code的时候没有器件的ACK回来。一气之下我就想,等不到我就不等了,把等ACK的那句干脆删掉,结果怎么着,往下什么问题都没有,电池电量信息读出来准确无误。
奇怪,很奇怪,以为ACK可能久一点,那就加长等待的时间,就是死也等不到.....无法解释

使用特权

评论回复
12
doob| | 2008-9-27 15:48 | 只看该作者

呵呵,是奇怪!是不是芯片不会ack啊

请问lz·SMBus和io口模拟iic 哪个方便些?
smbus 还要占一个timer,程序量比
io模拟能小多少?

使用特权

评论回复
13
箫笑|  楼主 | 2008-9-27 16:48 | 只看该作者

~

我自己的感觉,更乐意用IO口来模拟,就两根线,很方便,比起操作MCU的寄存器来那是直观明了多了,而且代码量也差不到哪儿去。
不过似乎硬件的速度比较快,起码都有100K,软件模拟的话好象达不到这个速度。

使用特权

评论回复
14
oumi| | 2008-9-28 08:31 | 只看该作者

smbus可以中断。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝