微机新手求教关于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
|