20楼#
发布于:2005-05-24 15:19
mov al,0a1h ;送设备号
;设备号+1为写,不加1就是读 mov dx,SM_Base+04h;送给这个 out dx,al IODELAY IODELAY mov cx,128;读128个byte Cir0: call Check_Busy mov dx,SM_Base+03h;送command mov al,128 sub al,cl out dx,al IODELAY IODELAY call Check_Busy;是个check status位的东西 mov al,48h mov dx,SM_Base+02h;送控制方式 out dx,al IODELAY IODELAY push cx mov cx,0ffh Delay: IODELAY loop Delay pop cx call Check_Busy mov dx,SM_Base+05h;读倒数据老:) in al,dx xxx: mov ah,128 sub ah,cl movzx bx,ah mov Byte_Buf[bx],al loop Cir0 |
|
21楼#
发布于:2005-05-24 15:35
smbus 2.0
|
|
|
22楼#
发布于:2005-05-24 15:47
sharpor:
你的程序怎么没用到设备的slave address和所要读的register address? 所以我还是看不懂:( |
|
23楼#
发布于:2005-05-24 15:57
mov al,0a1h ;送设备号slave address
mov al,128 sub al,cl ;al==register address 我应该没有理解错吧。。。。 |
|
24楼#
发布于:2005-05-24 20:30
那你的意思就是slave address就是0a0h喽?
还有 sub al,cl ;al==register address //在你的程序里这个时候cl为00h,怎么就得到register address 了呢? 在你的程序里Check_Busy是个早怎样的定义呢? 你说得到数据是不是最后放到al里了? “ mov dx,SM_Base+05h;读倒数据老:) in al,dx ” 对不起,刚接触这个领域,问的问题可能很初级,诚恳感谢指点! |
|
25楼#
发布于:2005-05-25 08:23
那你的意思就是slave address就是0a0h喽?(对啊) |
|
26楼#
发布于:2005-05-25 16:19
我现在可以读到数据了,并完成了相应驱动,可以在xp下读取监控端口的数据。但是不知道为什么这个数据并不随电源电压变化而像我们想象的那样改变,一直是个定值。需要重新启动系统才能读到新值。所以在读数据的时候是不是需要什么指令把前面的状态清掉啊?
谢谢! |
|
27楼#
发布于:2005-05-25 16:32
spec什么都有讲啊,你只要花半天时间就看了,有这么麻烦吗》???
|
|
28楼#
发布于:2005-05-25 16:37
不过还是恭喜有了进展哈。+u+u
要清掉SMbase+0的第7个bit。。。 |
|
29楼#
发布于:2005-05-26 08:46
谢谢sharpor这些天对我的帮助!
可能是我的时间比较紧,所以没有顾及去仔细看文档! 以后肯定会补上的! 以后可能还要向你请教的!呵呵! |
|
30楼#
发布于:2005-05-26 12:00
我在每次程序开始的时候清除了smbase的bit7位,结果还是不变啊?
mov al,0ffh mov dx,smbase out dx,al 是不是这样写不对? 还有,在我的程序里一对bit6进行检测的时候,一运行就重启系统 test: mov dx,smbase in al,dx test al,40h jz next loop test next:.... 按照datasheet里面说的应该就是这个样子啊?谁能帮我分析一下,诚恳感谢! |
|
31楼#
发布于:2005-05-26 17:06
我在每次程序开始的时候清除了smbase的bit7位,结果还是不变啊? 能不能把你访问smbus的程序贴出来,我帮你看哪里错了。 如果要重起系统,应该是你在驱动中访问了不该访问的内存。。。不会是smbus程序的问题 |
|
32楼#
发布于:2005-05-30 10:11
现在重启的问题解决了,不过说实在话,我自己都不知道为什么:(
现在的问题是我在同时访问两个偏移寄存器数值的时候,读出的数值是错的,而且两个一样。程序大概如下: mov al,0ffh mov dx,smbase out dx,al ;清状态 ...........check busy and set register,etc mov dx, smbase+03h mov al,register1 out dx,al ..........;read data1 ;;;; mov al,0ffh mov dx,smbase out dx,al ;再次清状态 ...........check busy and set register,etc mov dx, smbase+03h mov al,register2 out dx,al ..........;read data2 不知道是不是该检测的位没有检测?单独读data1的时候能读到相应的数值,为什么想两个同时得到就不行了呢? |
|
33楼#
发布于:2005-05-30 13:39
现在重启的问题解决了,不过说实在话,我自己都不知道为什么:( 你用的是读一个字节的命令还是读一个block的命令。。。 如果是读一个字节的命令,应该每次读都重新送命令。 如果读一个读一个block,在一开始,可以在offset5上读到总字节数,在第7个offset上读数据。每读一次,check busy and set status.读完所有的后,set 传输完位。。。 |
|
34楼#
发布于:2005-05-30 16:04
我读的是byte。就是按你说的方法读的。每次先向smbase写0ffh重置状态,然后check 它的bit6。然后分别向偏移地址04h,03h,02h发命令,最后从05h读数据。两次唯一不同的是03h发送register index的数值不同。如果分别写成两个汇编函数读取(C内嵌汇编)的话,其中一个可以随外设状态变化,而另一个不可以。如果写在同一个汇编函数里先后读取的话(就像上面那样),则两个值相同。而且不随状态变化。不知该怎么去分析!
|
|
35楼#
发布于:2005-05-30 16:44
我读的是byte。就是按你说的方法读的。每次先向smbase写0ffh重置状态,然后check 它的bit6。然后分别向偏移地址04h,03h,02h发命令,最后从05h读数据。两次唯一不同的是03h发送register index的数值不同。如果分别写成两个汇编函数读取(C内嵌汇编)的话,其中一个可以随外设状态变化,而另一个不可以。如果写在同一个汇编函数里先后读取的话(就像上面那样),则两个值相同。而且不随状态变化。不知该怎么去分析! Check_Busy proc near mov dx,SM_Base+00h xx: in al,dx IODELAY ;I/O delay. out dx,al and al,NOT 40h ;mask the INUSE bit or al,al jnz xx ret Check_Busy endp |
|
36楼#
发布于:2005-05-31 08:41
[quote ]
Check_Busy proc near mov dx,SM_Base+00h xx: in al,dx IODELAY ;I/O delay. out dx,al and al,NOT 40h ;mask the INUSE bit or al,al jnz xx ret Check_Busy endp [/quote] 我看到一些smbus例程也这样写。但是这句我不大明白: out dx,al and al,NOT 40h ;强制把al的bit6标记为0?这样做有什么意义呢?datasheet上没有体现这一点啊 or al,al ;结果还不是al吗?为什么进行这步呢? 谢谢指点! |
|
37楼#
发布于:2005-05-31 10:15
[quote我看到一些smbus例程也这样写。但是这句我不大明白:
out dx,al and al,NOT 40h ;强制把al的bit6标记为0?这样做有什么意义呢?datasheet上没有体现这一点啊 or al,al ;结果还不是al吗?为什么进行这步呢? 谢谢指点! [/quote] 结果还是al,但是标志位变了,这是为了下面的跳转指令用的。其实目的就是判断al的第6位是不是0,其实用一个test bit就可以实现...hehe |
|
38楼#
发布于:2005-05-31 14:10
datasheet 上的例子 只是show just as this ,实际应用不能靠他的
|
|
39楼#
发布于:2005-06-06 12:24
那实际中该怎么写呢?
不知道有经验的人可不可以介绍一下? 用sharpor的方法我现在还有两个问题没有解决. 1.我每次开机第一次读的数值都是错误的,第二次才能得到正确数值. 2.同时读取两个寄存器数值的时候还是得到两个相同的错误数值. 仔细看了datasheet,各种检测标识位的方法也试过了,结果还是不行. 是不是重置寄存器的方法不对,或者除了bit1和bit6之外,还有那些bit需要检测? 希望有经验的朋友可以指点一下! 谢谢! |
|