『问题请教』工控机主板smbus 读写和PC主板有什么不同吗?
小弟最近遇到一个问题:同样一段读clock gen寄存器值的代码,在AMD 780G台式机(NB 780G,SB SB700, CLK ICS477)主板上能正常读取数据
但是在某工控机主板(南桥型号相同,clock芯片同厂商同47x系列,SB SB700 , CLK ICS478)上运行会报bus error错误,不能读取数据
代码读写流程大致为:
1)读host status bit 0(busy) , 确定其为0 后开始smbus操作
2)按照smbus spec定义的流程读写
因为不太熟悉工控机平台,不知问题出在什么地方。怀疑仅凭步骤1)不能确保smbus host 可用,有没有兄弟曾遇到过类似问题呢? 读smbus有好多个步骤,请问一下这个code是bios里的code么?如果不是,那有可能是你哪里没有考虑完全才会出这样的问题。个人建议,一是看看你说的这段代码(参照bios code里的,老实话如果有些情况不考虑全,有可能就会有潜在的错误哦。),二是设置断点看看究竟是哪一步出了问题。希望对你有用。 回LightSeed兄:
这段代码是自己写的。我在PC 主板上试过,是可以正确读写clock gen的,并且这块PC主板和工控机主板所用的南桥芯片和clock 芯片型号几乎完全相同,所以我认为代码的读写逻辑应该没问题,smbus也没有考虑什么特殊情况,仅仅只通过判断host status bit 0确定host controller是否可用而已吧?
目前的难点在于不清楚什么情况下会报bus error错误,在PC平台上我只看到过device error错误,原因是slave address不正确。
回复 3# huyibo 的帖子
如果你说只考虑status中的bit 0,我想你的程序应该是不够严谨的。有时候我们其实不用考虑全部情况就可以把信息读出来这是有可能的。但是正如你现在遇到的问题,假如我们不把我们的程序考虑的完全点,那么我们的程序就可能有潜在的bug,也许一两次你还发现不了。smbus的操作一共有N个步骤,而且每个步骤都必须要去检查某些状态位等等(比如说data准备好了没有呀,bus是不是还在被占用呀什么的。。。我都忘记了,是不是data)。个人建议你还是参考一下bios code里的操作吧,这样比较严谨点。橘皮书上也有关于读取spd的操作。这个链接里有比较简单的介绍,(但是判断状态位还是没有写出来,有点担心会侵权之类的。。。)
http://blog.csdn.net/lightseed/archive/2009/07/30/4392697.aspx
总之,你的状态位判断尽量多点,这样会更加严密。否则就会出现莫名其妙的错误。
一下是在程式设计俱乐部上的一篇帖子的一部分,供你参考希望对你有用。
>Step 1.Make sure status bits is clear(in SMB Host Status)
>Step 2.write the slave address to SMB Host Address(make care bit 0 is
>Write)
>Step 3.write EEPROM byte index to SMB Host Command
>Step 4.write the slave address to SMB Host Address(make care bit 0 is
>Read)
>Step 5.Set byte read/wirte protocol with start bits enable to SMB Host Control
>Step 6.Check status BUSY bit to make sure transation is complete
>(in SMB Host Status)
>Step 7.Read data From SMB Host Data 0
>Step 8.If no error, return to step 1
1. step 1 & 2 中間可能需要 kill bus...(depends on platform design)
2. step 2 & 4 不是很懂...想表達的是 ?
3. Step 6時,除了check complete status,也要 check error status...
if complete then get data
if error then do error handling
( Ex. kill bus->clear status...etc, depends on platform design )
[ 本帖最后由 LightSeed 于 2009-10-13 14:33 编辑 ]
页:
[1]