首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助][讨论]请教I2C问题

[求助][讨论]请教I2C问题

请问板主,我用两块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

调了很长时间也没能解决!!!

请大家多多帮忙

 任何建议都十分感谢!


怎么没人看看啊...

手册上是这么说的:A stop signal should only be generated if the IBIF flag is set .MS/SLis cleared without generating a STOPsingal when the master loses arbitration.但我意单步到这里:ENDMASR: ;结束结束
BCLR IBCR,#$20 ;发送停止信号
LDX DATA ;接收最后一个数据
MOVB IBDR,0,X
BRA ENDT ;转至中断反回

IBSR为A2.即IBIF置位了,且主机没有失去仲裁.可是就是产生不了停止信号.太奇怪了!!

???????????????????
牛,为什么还用汇编的啊..C会好看很多的
返回列表