sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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
sunvan
驱动牛犊
驱动牛犊
  • 注册日期2004-03-12
  • 最后登录2011-07-06
  • 粉丝0
  • 关注0
  • 积分-100分
  • 威望-9点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-05-24 15:35
smbus 2.0
附件名称/大小 下载次数 最后更新
2005-05-24_smbus20.pdf (600KB)  40
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-05-24 15:47
sharpor:
   你的程序怎么没用到设备的slave address和所要读的register address? 所以我还是看不懂:(
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-05-24 15:57
mov al,0a1h ;送设备号slave address
mov al,128
sub al,cl ;al==register address
我应该没有理解错吧。。。。
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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

对不起,刚接触这个领域,问的问题可能很初级,诚恳感谢指点!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2005-05-25 08:23
那你的意思就是slave address就是0a0h喽?(对啊)
还有
sub al,cl ;al==register address  //在你的程序里这个时候cl为00h,怎么就得到register address 了呢?(cl=128,每完一个loop就减一,al=128,sub al,cl==al=al-cl所以register address =0-128)
在你的程序里Check_Busy是个早怎样的定义呢?(check SM_Base+00h的第6个bit)
你说得到数据是不是最后放到al里了?(对啊)

mov dx,SM_Base+05h;读倒数据老:)
in al,dx

对不起,刚接触这个领域,问的问题可能很初级,诚恳感谢指点!
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2005-05-25 16:19
我现在可以读到数据了,并完成了相应驱动,可以在xp下读取监控端口的数据。但是不知道为什么这个数据并不随电源电压变化而像我们想象的那样改变,一直是个定值。需要重新启动系统才能读到新值。所以在读数据的时候是不是需要什么指令把前面的状态清掉啊?
谢谢!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2005-05-25 16:32
spec什么都有讲啊,你只要花半天时间就看了,有这么麻烦吗》???
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2005-05-25 16:37
不过还是恭喜有了进展哈。+u+u
要清掉SMbase+0的第7个bit。。。
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2005-05-26 08:46
谢谢sharpor这些天对我的帮助!
可能是我的时间比较紧,所以没有顾及去仔细看文档!
以后肯定会补上的!
以后可能还要向你请教的!呵呵!
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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里面说的应该就是这个样子啊?谁能帮我分析一下,诚恳感谢!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2005-05-26 17:06
我在每次程序开始的时候清除了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里面说的应该就是这个样子啊?谁能帮我分析一下,诚恳感谢!

能不能把你访问smbus的程序贴出来,我帮你看哪里错了。
如果要重起系统,应该是你在驱动中访问了不该访问的内存。。。不会是smbus程序的问题
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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的时候能读到相应的数值,为什么想两个同时得到就不行了呢?



sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2005-05-30 13:39
现在重启的问题解决了,不过说实在话,我自己都不知道为什么:(
现在的问题是我在同时访问两个偏移寄存器数值的时候,读出的数值是错的,而且两个一样。程序大概如下:

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的时候能读到相应的数值,为什么想两个同时得到就不行了呢?



 

你用的是读一个字节的命令还是读一个block的命令。。。
如果是读一个字节的命令,应该每次读都重新送命令。
如果读一个读一个block,在一开始,可以在offset5上读到总字节数,在第7个offset上读数据。每读一次,check busy and set status.读完所有的后,set 传输完位。。。
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2005-05-30 16:04
我读的是byte。就是按你说的方法读的。每次先向smbase写0ffh重置状态,然后check 它的bit6。然后分别向偏移地址04h,03h,02h发命令,最后从05h读数据。两次唯一不同的是03h发送register index的数值不同。如果分别写成两个汇编函数读取(C内嵌汇编)的话,其中一个可以随外设状态变化,而另一个不可以。如果写在同一个汇编函数里先后读取的话(就像上面那样),则两个值相同。而且不随状态变化。不知该怎么去分析!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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吗?为什么进行这步呢?

谢谢指点!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2005-05-31 14:10
datasheet 上的例子 只是show just as this ,实际应用不能靠他的
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2005-06-06 12:24
那实际中该怎么写呢?
不知道有经验的人可不可以介绍一下?
用sharpor的方法我现在还有两个问题没有解决.
1.我每次开机第一次读的数值都是错误的,第二次才能得到正确数值.
2.同时读取两个寄存器数值的时候还是得到两个相同的错误数值.
仔细看了datasheet,各种检测标识位的方法也试过了,结果还是不行.
是不是重置寄存器的方法不对,或者除了bit1和bit6之外,还有那些bit需要检测?
希望有经验的朋友可以指点一下!
谢谢!
游客

返回顶部