4864|6

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

微机新手求教关于I2C总线以及2402的问题,程序调试求解! [复制链接]

我是一个微机新手。用8255的两个管脚分别接2402的SDA 和 SCL 模拟I2C总线向2402输入一页数据再读出来,用8253给出精确定时。但是在调试程序的时候出现了一个情况,就是写入8位数据之后接收不到应答。另外,我用8255的两个管脚分别接两个LED灯上面,分别表示是否接受到应答,调试程序的时候发现系统接收不到应答之后8255也没有控制相应的LED灯亮!!!8255没有问题的。
请问各位高手 知道这是怎么回事吗?这搞得我都不知道怎么调试,拳打棉花的感觉!!!
以下是我的程序,烦请路过的高手看下,不胜感激!!!
ioport equ 0d400h-0280h
io8255 equ ioport+28bh ;8255控制寄存器地址
io8255a equ ioport+288h ;A口地址
io8255b equ ioport+289h ;B口地址
io8255c equ ioport+28ah ;C口地址
io8253               equ ioport+283h     ;8253控制寄存器地址
io82530               equ ioport+280h    ;通道0地址
data segment
list db 01h,02h,03h,04h,05h,06h,07h,08h;
count db ?
data ends
stacks segment stack
db 100 dup(?)
stacks ends

code   segment
 assume cs:code,ds:data,ss:stacks
start:   
  mov ax,stacks
  mov ss,ax
  mov ax,data
  mov ds,ax
  
  mov dx,io8255
  mov al,90h
  out dx,al
  call init
  call delay1
sendadrwrite:  
         mov bl,0A0h ;发送器件地址
 mov al,bl ;bl中存放现有要发送的数据(器件地址和片内写地址),原数据始终在BH中
 call senddata
         call testack;检测应 答信号
 call delay
 mov bl,00h ;发送存储地址
 mov al,bl
 call senddata
         call testack;检测应答信号
 call delay
    mov bx,00h
A:  mov al,list[bx]
    mov dx,io8255a
    in al,dx
    mov bl,al
    inc bx
    call senddata
    call testack
    cmp bx,7    
    jc A
       call stop
         call delay10
         mov dx,io8255
         mov al,90h
         out dx,al         
         call init
         call delay1
         mov bh,08h
sendadread: mov bl,0A0h ;发送器件地址
 mov al,bl
 call senddata
 call testack ;检测应答信号
 call delay
 mov bl,00h ;发送存储单元地址
 mov al,bl
 call senddata
 call testack ;检测应答信号
 call delay
 mov bl,0A1h
 mov al,bl
 call senddata
 call testack ;检测应答信号  
 call delay
 mov cl,07h
 mov ch,08h
readdata: mov bl,00h 
 mov dx,io8255            ;设8255为A、C口输出,B口输入,B口接SDA
 mov al,82h
 out dx,al 
 mov al,00h  
 mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL置0
 call delay
 mov al,01h  
 mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL置1
 call delay
 mov dx,io8255b
 in al,dx ;读入PB0上的数据存入到BL中
 shl al,07h ;左移CL位
 or bl,al
 call delay
 mov al,00h  
 mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL置0
 dec ch
 jnz readdata
 dec cl
         call testack
disLED:  
         mov dx,io8255              ;A输出   BC输入
         mov al,8Bh
         out dx,al
         mov al,bl ;显示LED指示灯
 mov dx,io8255a
 out dx,al

         dec bh
         jnz sendadread
stopread:  
         mov dx,io8255            ;设8255为A、B、C输出
 mov al,80h
 out dx,al  
 mov al,00h ;直接给停止信号
 mov dx,io8255b
 out dx,al
 mov al,01h
 mov dx,io8255c
 out dx,al
 call delay
 mov al,01h
 mov dx,io8255b
 out dx,al
 call delay
exit:  mov ah,4ch
         int 21h


senddata proc near 
           push cx
            mov dx,io8255            ;设8255为A输入   B、C输出
 mov al,90h
 out dx,al  
           mov cl,08h
senddata1: mov dx,io8255c
       mov al,00h
 out dx,al ;置SCL为0
 call delay
 mov al,bl ;bl中存放当前传输的数
 mov dx,io8255b
 out dx,al ;将AL中最低位数据通过PB0输出给SDA
 call delay
 mov al,01h
 mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL置1,此时SDA数据有效
 call delay
 mov al,00h
 out dx,al ;PC0接SCL,将SCL置0,此时可更改SDA
 call delay
next:  shr bl,1 ;将BL中的数据右移一位,高位添0
 dec cl ;已经传送了一位
 jnz senddata1 ;若未发送完则继续发送
 call delay
 
                           
 pop cx
         ret
senddata endp
 
init proc near                                                                
 mov al,01h
 mov dx,io8255b
 out dx,al             ;PB0接SDA,将SDA置1
 call delay
         mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL置1
 call delay
 mov al,00h
 mov dx,io8255b
 out dx,al ;PB0接SDA,将SDA清0,开始信号
 call delay  
 mov dx,io8255c
 out dx,al ;PC0接SCL,将SCL清0
         ret
init endp

stop proc near      
 mov al,00h
 mov dx,io8255b
 out dx,al
         call delay
 mov al,01h
 mov dx,io8255c
 out dx,al
 call delay
 mov al,01h
 mov dx,io8255b
 out dx,al
 call delay
 ret
stop endp


最新回复

发送完数据后,读取器件响应时,要置为输入,8255只有A口有双向功能吧。建议先参考硬件平台的Demo程序来检查,宜转用C语言进行PC端口的控制,汇编有问题时排错较为困难,用单步走到发完数据后,将输出口置为输入,用示波器检查一下是否回应。  详情 回复 发表于 2011-9-10 11:24
点赞 关注

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

继续上面没有黏贴完的程序

delay   proc near                   ;延迟子程序
  push cx
         push dx
  
 delay5us: mov dx,io8253
         mov al,10h
        mov dx,io82530
        mov al,05h
        in al,dx
testout5us:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout5us 
        pop dx
        pop cx
        ret
delay   endp   


delay1  proc near             ;1ms延时子程序
         push cx
         push dx

 delay1ms: mov dx,io8253
         mov al,30h             ;选择先低后高写入
        mov dx,io82530
        mov ax,3E8h               ;一毫秒要计数1000,0000 0011 1110 1000
        in ax,dx
        
testout1ms:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout1ms
        pop dx
        pop cx
         ret
delay1 endp

delay10  proc near           ;10ms延时子程序
         push cx
         push dx
 
 delay10ms: mov dx,io8253
         mov al,30h             ;选择先低后高写入
        mov dx,io82530
        mov ax,2710h               ;10毫秒要计数10000
        in ax,dx
        
testout10ms:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout10ms
        pop dx
        pop cx
         ret
delay10 endp

testack  proc near
  push cx
         mov cx,0ffh
         mov al,00h
  mov dx,io8255c
  out dx,al ;PC0接SCL,将SCL置0
         nop
  mov al,01h
  mov dx,io8255b
  out dx,al ;PB0接SDA,将SDA置1
  nop
  mov al,01h
  mov dx,io8255c
  out dx,al ;PC0接SCL,将SCL置1
  call delay
read:   mov al,92h ;读入SDA状态,若是零则表明写成功
  mov dx,io8255
  out dx,al
  mov dx,io8255b
  in  al,dx
  mov bl,al
  mov dx,io8255c
  mov al,00h
  out dx,al
  mov al,bl
  and al,01h
  jz  change
  dec cx
  jcxz error
  jmp  read
error:   mov dx,io8255c ;此时用LED8显示未接收到响应信号
  mov al,80h
  out dx,al
  jmp exit ;结束
change:  mov dx,io8255            ;设8255为A口输入,B、C输出
  mov al,90h
  out dx,al
  mov dx,io8255c
  mov al,40h
  out dx,al ;此时用LED7表明接收到响应信号
  pop cx
         ret
testack  endp
code   ends
end start
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
其中 8255的PB0接SDA PC0接SCL PA0~3接LED 是用来显示读出来的数据的。PA7接8253的OUT  PC7和PC6分别接两个LED用来显示是否接到应答
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

4
 
  弄一个示波器看看什么都明白了,你加上拉电阻没有?还有写的地址对不对?24C02有几个脚是地址选择脚。你的程序我就在学校的时候学过,现在都玩单片机,有点看不懂这个
 
 
 

回复

338

帖子

2

TA的资源

五彩晶圆(初级)

5
 

I2C总线数据线是双向的

发送完数据后,读取器件响应时,要置为输入,8255只有A口有双向功能吧。建议先参考硬件平台的Demo程序来检查,宜转用C语言进行PC端口的控制,汇编有问题时排错较为困难,用单步走到发完数据后,将输出口置为输入,用示波器检查一下是否回应。
 
个人签名以VS1003B和山景方案为基础,倾心研制数字化语音录放产品
排忧邮箱xg_2004_sy@126.com
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 qq_zhs 的帖子

谢谢你的回复。   地址我就用的000 因为就一个2402片子。接下来写入数据的时候应该是自动将地址+1的。
我是在TPC-2003A教学实验箱上面连接的,应该不需要再自己连接上拉电阻的。示波器。。。还木有用介个检测过呢~~~回头了解下用示波器怎么查
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 古道热肠MP3 的帖子

谢谢你的回复。8255三个口都可以输入输出,我用的是方式0 ,通过程序随时设定各个口的输入输出的。所以在 testack子程序下面的 有个mov dx,92h. 向8255输控制字,使得B口为输入的。
其实,我奇怪的是,就算我收不到应答吧,那么8255也应该控制一个灯亮,告诉我没有收到应答啊。ps:当时郁闷之极,明知实验箱是新的还怀疑过8255,所以还换了个。。。所以确定8255没得问题。
不过,示波器,,,看来还真得试着用下。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表