请问板主,我用两块DG128板子做I2C的通信时做了以下工作: 将一板初始化为从机一板初始化为主机.当用主机向从机发送数据时都是正常的,发送停止信号后,总线会回来idle状态. 当用主机从从机读数据时,主机能正常接收到数据;但接收结束时,主机产生一个停止信号后,总线不能回到idle状态.代码如下: ;IIC初始化函数-------------------------------------------------* ICInit:
LDAA #$89 STAA IBFD LDAA #$C0 STAA IBCR LDAA #$FF STAA IBAD
START: BRSET IBSR,#$20,* ;判断IIC总线是否为空 BSET IBCR,#$30 ;设为主机模式,发送数据,产生开始信号 BRCLR IBSR,#$20,*;判断IIC是否忙 LDAA #$10;发送从机地址 STAA IBDR WAI ;等待进入中断 BRA START ISR0:
SEI BRCLR IBSR,#$80,*;等待传送完成 BRCLR IBSR,#$20,*;等待总线正常工作 BRCLR IBSR,#$02,*;等待数据发送完毕 BSET IBSR,#$02;清除发送完标志位 BRSET IBSR,#$01,*;等待应答信号 DEC RORT;RORT为1时转到接收 BEQ RECEIVE RECEIVE:
BSET IBCR,#$04 ;发送重新开始信号
LDAA #$11 STAA IBDR ;通知从机改为发送数据 BRCLR IBSR,#$02,* ;等待数据发送完毕 BRCLR IBSR,#$80,* ;等待传送停止 BSET IBSR,#$02 ;清除发送完标志位 BRSET IBSR,#$01,* ;等待应答信号 BCLR IBCR,#$10 ;主机设为接收模式 LDAA IBDR BRSET IBSR,#$01,* RECEIVEn:
DEC LOOP ;LOOP判断是否接收到最后一个数据 BEQ ENDMASR ;如是最后一个接数据结束接收 MOVB LOOP,NLOOP; NLOOP用来判断是否接收到倒数第二个数据 DEC NLOOP BNE NEMAR;如不是倒数第二个接收数据,转至继续接收 ;如是倒数第二个,结束应达以通知从机结束发送 LAMAR: BSET IBCR,#$08 LDAA #$01 STAA SCI0DRL BRCLR SCI0SR1,#$40,* BRA NEMAR ;转至接收倒数第二个字节 ENDMASR: ;结束结束 BCLR IBCR,#$20 ;发送停止信号 LDX DATA ;接收最后一个数据 MOVB IBDR,0,X BRA ENDT ;转至中断反回 NEMAR: BRCLR IBSR,#$02,* LDX DATA ;接收数据存放首地址 MOVB IBDR,0,X ;接收数据放入(X)中 MOVB 0,X,SCI0DRL BRCLR SCI0SR1,#$40,* INC $601 BSET IBSR,#$02 BRA RECEIVEn
ENDT:
BSET IBSR,#$02 BRSET IBSR,#$20,* BSET LOOP,#$F0 CLI RTI ORG $FFC0 FDB ISR0 调了很长时间也没能解决!!! 请大家多多帮忙 任何建议都十分感谢!
|