2440 IIC SCL偶尔死锁为L求助

[复制链接]
4360|8
 楼主| scyszj 发表于 2007-10-14 13:24 | 显示全部楼层 |阅读模式
在调ARM2440时,IIC发送正常,但当作为从机接收数据(中断)时,大概1/200的机会会出现时钟线死锁为低,不能恢复.正常情况是会产生中断,但这里中断标志产了(IICCON第4位),但SRCPND与INTPND相应位为0,不能正常进入中断程序,导致不能清0IICCON第4位,从而使SCL常为低,总线不能工作正常.死锁时:IICCON=241,IICSTAT=48,SRCPND与INTPND相应位为0(27位).请问各位大侠该如何处理?
hotpower 发表于 2007-10-14 13:54 | 显示全部楼层

主机时钟可能太快

  
 楼主| scyszj 发表于 2007-10-14 15:05 | 显示全部楼层

从10K-50K都设过,没有用

主机时钟从10K-50K(SCL)都设过,还是有这样的问题.
 楼主| scyszj 发表于 2007-10-14 15:09 | 显示全部楼层

正常接收时,波形很漂亮

正常接收时波形很漂亮,应不会有干扰,同一个主机向另一块挂在相同IIC BUS上的(ATMEGA48)发送就能正常接收.
mohanwei 发表于 2007-10-14 15:34 | 显示全部楼层

主程序里开始读写的时候加个定时器,超时就重新初始化

I2C模块。
 楼主| scyszj 发表于 2007-10-14 15:36 | 显示全部楼层

现在是这样想的

不过这个问题很奇怪,在8位机中都不会出现的.<br />void&nbsp;__irq&nbsp;iic_isr(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U8&nbsp;iic_status;<br />&nbsp;&nbsp;&nbsp;&nbsp;U8&nbsp;tmp=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;|=&nbsp;BIT_IIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp=rIICDS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//必须读<br />&nbsp;&nbsp;&nbsp;&nbsp;iic_status=rIICSTAT;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rSRCPND&nbsp;|=&nbsp;BIT_IIC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Clear&nbsp;pending&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTPND&nbsp;|=&nbsp;BIT_IIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;|=(1&lt&lt5);<br />&nbsp;&nbsp;&nbsp;&nbsp;iic_clr_pending();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(iic_mode==4){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((iic_status&nbsp;&&nbsp;0x8)!=0){goto&nbsp;isr_erro;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//总线竞争失败<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((iic_status&nbsp;&&nbsp;0x4)!=0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(iic_rx_data_pro==iic_rx_data_proed){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果上次接收到的数据已处理,应答并准备接收数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data_pro=iic_rx_go;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//地址匹配成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data_count=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;|=(1&lt&lt7);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;isr_end;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(iic_rx_data_pro==iic_rx_go){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(iic_rx_data_count&ltiic_rx_data_pkg_size){&nbsp;&nbsp;&nbsp;&nbsp;//收到完整字节后中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data[iic_rx_data_count]=tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(iic_rx_data_count&lt(iic_rx_data_pkg_size-1)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;|=(1&lt&lt7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下一字节结收完成后回应ACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(check_crc16_data(iic_rx_data,iic_rx_data_pkg_size)!=0){//不应答第8个,主机就知道发送数据错误,要重发数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;&=~(1&lt&lt7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//校验不成功,第7字节回应NACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;isr_erro;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;|=(1&lt&lt7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//第7字节结收完成后回应ACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data_pro=iic_rx_ok;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data_count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;&=~(1&lt&lt7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//第8字节结收完成后回应NACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic_rx_data_pro=iic_rx_ok;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收到第8字节,置完成接收标志,数据未处理完前不再应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON&nbsp;&=~(1&lt&lt7);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />isr_end:<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;&=&nbsp;~BIT_IIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />isr_erro:<br />&nbsp;&nbsp;&nbsp;&nbsp;iic_erro=0x1;<br />&nbsp;&nbsp;&nbsp;&nbsp;//rINTMSK&nbsp;&=&nbsp;~BIT_IIC;<br />}<br />中断中的代码
hotpower 发表于 2007-10-14 23:54 | 显示全部楼层

看来是从机isr()的问题了

俺觉得状态判断太少了...估计那里没考虑周到使从机不能再次进入中断.<br />这样导致了SCL死锁.
 楼主| scyszj 发表于 2007-10-15 09:06 | 显示全部楼层

接收的全部代码在此了

IICCON=241,IICSTAT=48,SRCPND与INTPND相应位为0(27位).请问各位大侠该如何处理?<br />这是关键,IIC表明收到数据,而中断没有植标志,故不能产生中断
 楼主| scyszj 发表于 2007-10-15 23:10 | 显示全部楼层

解决了

是由于TIMER4会出现200Hz中断引起的,但为什么会引起就不清楚,因为TIMER4&nbsp;ISR中并没有长时间的操作和清IIC的中断标致命令.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部