自己写的44b0的IIC程序,但不成功,望高手指点

[复制链接]
2670|4
 楼主| snowtx 发表于 2008-2-19 23:11 | 显示全部楼层 |阅读模式
到井号那里就无法再执行下去了,仿佛是在中断里出不来了,请高手帮忙看一看啊,小弟急啊!!!!<br /><br /><br /><br /><br /><br />#include&nbsp;&quot;option.h&quot;<br />#include&nbsp;&quot;def.h&quot;<br />#include&nbsp;&quot;44b.h&quot;<br />#include&nbsp;&quot;44blib.h&quot;<br /><br />#define&nbsp;WRDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)<br />#define&nbsp;RDDATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)<br />#define&nbsp;SETRDADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<br /><br /><br />void&nbsp;Isr_Init(void);<br />void&nbsp;HaltUndef(void);<br />void&nbsp;HaltSwi(void);<br />void&nbsp;HaltPabort(void);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;HaltDabort(void);<br />void&nbsp;Wr24C040(U32&nbsp;slvAddr,U32&nbsp;addr,U8&nbsp;data);<br />void&nbsp;Rd24C040(U32&nbsp;slvAddr,U32&nbsp;addr,U8&nbsp;*data);<br />void&nbsp;__irq&nbsp;IicInt(void);<br />volatile&nbsp;int&nbsp;_iicDataCount;<br />volatile&nbsp;int&nbsp;_iicMode;<br />U8&nbsp;_iicaddr;<br />U8&nbsp;_iicdata;<br /><br />void&nbsp;Main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;U8&nbsp;data[256];&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rSYSCFG=SYSCFG_8KB;<br />#if&nbsp;(PLLON==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;ChangePllValue(PLL_M,PLL_P,PLL_S);<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Isr_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;Port_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Init(0,115200);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Select(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(0);&nbsp;&nbsp;//calibrate&nbsp;Delay()<br />&nbsp;&nbsp;&nbsp;&nbsp;Led_Display(7);<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(1000);&nbsp;&nbsp;//calibrate&nbsp;Delay()<br />&nbsp;&nbsp;&nbsp;&nbsp;Led_Display(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(5000);&nbsp;&nbsp;//calibrate&nbsp;Delay()<br />&nbsp;&nbsp;&nbsp;&nbsp;Led_Display(7);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
&nbsp;start&nbsp;
&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_IIC=(unsigned)IicInt;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=~(BIT_GLOBAL|BIT_IIC);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICADD=0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Write&nbsp;test&nbsp;data&nbsp;into&nbsp;KS24C080
&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;Wr24C040(0xa0,(U8)i,i);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Read&nbsp;test&nbsp;data&nbsp;from&nbsp;KS24C080
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;Rd24C040(0xa0,(U8)i,&(data));&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;%2x&nbsp;&quot;,data);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br /><br />void&nbsp;Wr24C040(U32&nbsp;slvAddr,U32&nbsp;addr,U8&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicMode=WRDATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicaddr=addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicdata=data;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount=3;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xf0;<br />############################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
&nbsp;test1&nbsp;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(_iicDataCount!=-1);<br />&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br /><br />void&nbsp;Rd24C040(U32&nbsp;slvAddr,U32&nbsp;addr,U8&nbsp;*data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicMode=SETRDADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicaddr=addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xf0;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(_iicDataCount!=0);<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicMode=RDDATA;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xb0;&nbsp;//MasRx,Start<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(_iicDataCount!=0);<br />&nbsp;&nbsp;&nbsp;&nbsp;*data=_iicdata;<br />}<br /><br /><br />void&nbsp;__irq&nbsp;IicInt(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;i;<br /><br />&nbsp;&nbsp;switch(_iicMode)<br />{<br />&nbsp;&nbsp;&nbsp;case&nbsp;WRDATA:&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_iicDataCount==1)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;_iicDataCount3=%d
&quot;,_iicDataCount);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xd0;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(_iicDataCount==2)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;_iicDataCount2=%d
&quot;,_iicDataCount);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=_iicdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt10;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(_iicDataCount==3)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;_iicDataCount1=%d
&quot;,_iicDataCount);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=_iicaddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt10;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;case&nbsp;SETRDADDR:<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_iicDataCount==2)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=_iicaddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt10;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;case&nbsp;RDDATA:<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_iicDataCount==2)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicdata=rIICDS;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt10;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0x2f;//resumes&nbsp;IIC&nbsp;operation&nbsp;with&nbsp;NOACK.<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_iicDataCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0x90;&nbsp;&nbsp;//stop&nbsp;MasRx&nbsp;condition&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;until&nbsp;stop&nbsp;condtion&nbsp;is&nbsp;in&nbsp;effect.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//too&nbsp;long&nbsp;time...&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />void&nbsp;Isr_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_UNDEF=(unsigned)HaltUndef;<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_SWI&nbsp;&nbsp;=(unsigned)HaltSwi;<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_PABORT=(unsigned)HaltPabort;<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_DABORT=(unsigned)HaltDabort;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=_RAM_STARTADDRESS;i&lt(_RAM_STARTADDRESS+0x20);i+=4)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;*)i)=0xEA000000+0x1FFE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rINTCON=0x5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Non-vectored,IRQ&nbsp;enable,FIQ&nbsp;disable&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMOD=0x0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;All=IRQ&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK|=BIT_GLOBAL|BIT_EINT3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;All&nbsp;interrupt&nbsp;is&nbsp;masked.<br />}<br /><br /><br />void&nbsp;HaltUndef(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Undefined&nbsp;instruction&nbsp;exception!!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br /><br />void&nbsp;HaltSwi(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;SWI&nbsp;exception!!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br /><br />void&nbsp;HaltPabort(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Pabort&nbsp;exception!!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br /><br />void&nbsp;HaltDabort(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Dabort&nbsp;exception!!!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />
armecos 发表于 2008-2-20 09:12 | 显示全部楼层

可能是你的中断程序有些细节没有注意到

中断里不能调用printf函数,IIC函数里不要出现寄存器,否则程序移植性很差,换个CPU又要重写。最好写成万能的,以后就不用重复劳动了。<br />中断书写注意事项和IIC写法见如下文挡:<br /><br /><b>中断注意事项及IIC写法</b>
 楼主| snowtx 发表于 2008-2-20 09:29 | 显示全部楼层

snowtx

谢谢,printf函数是我用来跟踪程序用的。哈哈,看了您给的资料,突然想到如果发送到最后一个字节如果还发送ARC信号的话,是不是就算写0xd0也没用阿??是不是应该发送到最后一个字节时应该不允许产生ARC??也就是往IICCON里写0xbf??
 楼主| snowtx 发表于 2008-2-20 13:05 | 显示全部楼层

snowtx

我发现了一个问题&nbsp;&nbsp;&nbsp;在进中断后我没有写rI_ISPC=BIT_IIC;也就是清中断,不知道是不是问题所在,晚上回家试试!!!
 楼主| snowtx 发表于 2008-2-20 19:47 | 显示全部楼层

snowtx

果真是这个问题,加了rI_ISPC=BIT_IIC;后就好了。但是为什么读出来的数据都是“a1”啊????怎么回事??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

66

帖子

0

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