|
发表于 2009-10-13 14:24:33
|
显示全部楼层
回复 3# huyibo 的帖子
如果你说只考虑status中的bit 0,我想你的程序应该是不够严谨的。有时候我们其实不用考虑全部情况就可以把信息读出来这是有可能的。但是正如你现在遇到的问题,假如我们不把我们的程序考虑的完全点,那么我们的程序就可能有潜在的bug,也许一两次你还发现不了。smbus的操作一共有N个步骤,而且每个步骤都必须要去检查某些状态位等等(比如说data准备好了没有呀,bus是不是还在被占用呀什么的。。。我都忘记了,是不是data)。个人建议你还是参考一下bios code里的操作吧,这样比较严谨点。橘皮书上也有关于读取spd的操作。) o* S1 I4 j6 L' j" \: s! X
这个链接里有比较简单的介绍,(但是判断状态位还是没有写出来,有点担心会侵权之类的。。。)
2 F: i( M" B' R1 G+ I4 [http://blog.csdn.net/lightseed/archive/2009/07/30/4392697.aspx5 G9 b- j. t5 M3 Q* r
总之,你的状态位判断尽量多点,这样会更加严密。否则就会出现莫名其妙的错误。
2 X/ n! V( N4 U7 v) j, b# T9 C- U3 C7 V* Y# o9 x* F/ g& I
一下是在程式设计俱乐部上的一篇帖子的一部分,供你参考希望对你有用。
6 v' m" X, K9 K# J9 |' L>Step 1.Make sure status bits is clear(in SMB Host Status)
9 [! h2 k8 ^ }/ }4 b. w N5 p& N' B>Step 2.write the slave address to SMB Host Address(make care bit 0 is J3 d' A0 A4 s8 h; P
>Write)4 I9 u' z2 [% q# v% z$ f0 a( r
>Step 3.write EEPROM byte index to SMB Host Command/ i* S5 D0 }+ ?8 O# e, Z% V
>Step 4.write the slave address to SMB Host Address(make care bit 0 is) }8 e& w# h+ L# a+ d; W0 l
>Read)
* q. d4 j1 R3 i" K8 u9 G7 ?>Step 5.Set byte read/wirte protocol with start bits enable to SMB Host Control
: i" f+ V! q8 W- j5 L>Step 6.Check status BUSY bit to make sure transation is complete
5 b/ v$ \) g0 r% \>(in SMB Host Status)1 `6 V* m e) s
>Step 7.Read data From SMB Host Data 0. Y: h/ X/ H- o) h2 o& @- W0 }/ c
>Step 8.If no error, return to step 1
Q+ ?; g" D1 d0 t1. step 1 & 2 中間可能需要 kill bus...(depends on platform design)
6 K" h8 {. t/ }8 x' r7 _- w# `2. step 2 & 4 不是很懂...想表達的是 ?3 N% |% C) e$ u5 i
3. Step 6時,除了check complete status,也要 check error status...$ u% X% ^4 @& X. ~% X) B- b
if complete then get data! ]9 c- _1 U1 l- X3 Q1 G
if error then do error handling6 F$ _# Z, |8 A" s* O. K
( Ex. kill bus->clear status...etc, depends on platform design )
, E0 m8 E- O! Q& d7 ^" \
4 t. h; i2 b. U7 I$ Q[ 本帖最后由 LightSeed 于 2009-10-13 14:33 编辑 ] |
|