<br />自己写了一下没有成功,下面是给的例程,用中断的方法来发送一个Byte,红色的部分都好理解,分别写器件地址,子地址,数据,每发送完一个字节产生一次中断,发完了停止总线。<br />问题是,它上面的每个字节发完之后都不等ACK,直到发完,总线停止了以后,来到蓝色部分,在这里等ACK???而且这时还是设<font color=#0000FF>rIICSTAT=0xf0;<font color=#000000>就是</font></font><font color=#000000>主器件发送模式,再发送一次器件地址,然后等ACK,这是从何说起啊??</font><br /><font color=#000000>另外,44B0是否无法用I/O口来模拟I2C了?要频繁更改I/O口的属性,似乎时间上来不及,不知道为什么ARM的I/O口都要这样设计,不像51的是输入输出的??<br /><br /></font><br />void Wr24C040(U32 slvAddr,U32 addr,U8 data)<br />{<br /> _iicMode=WRDATA;<br /> _iicPt=0;<br /> _iicData[0]=(U8)addr;<br /> _iicData[1]=data;<br /> _iicDataCount=2;<br /> <br /><font color=#FF0000> rIICDS=slvAddr;//0xa0<br /> rIICSTAT=0xf0; //MasTx,Start<br /> while(_iicDataCount!=-1);</font><br /><br /><font color=#0000FF> _iicMode=POLLACK;<br /> while(1)<br /> {<br /> rIICDS=slvAddr;<br /> _iicStatus=0x100;<br /> rIICSTAT=0xf0; //MasTx,Start<br /> rIICCON=0xaf; //resumes IIC operation. <br /> <br /> while(_iicStatus==0x100);<br /> <br /> if(!(_iicStatus&0x1))<br /> break; // when ACK is received<br /> }<br /></font> <br /> rIICSTAT=0xd0; //stop MasTx condition <br /> rIICCON=0xaf; //resumes IIC operation. <br /> Delay(1); //wait until stop condtion is in effect.<br /><br /> //write is completed.<br />}<br /><br />void __irq IicInt(void)<br />{<br /> U32 iicSt,i;<br /> rI_ISPC=BIT_IIC;<br /><br /> switch(_iicMode)<br /> {<br /> case POLLACK:<br /> _iicStatus=iicSt;<br /> break;<br /><br /> <font color=#FF0000> case WRDATA:<br /> if((_iicDataCount--)==0)<br /> {<br /> rIICSTAT=0xd0; //stop MasTx condition <br /> rIICCON=0xaf; //resumes IIC operation.<br /> Delay(1); //wait until stop condtion is in effect.<br /> //The pending bit will not be set after issuing stop condition.<br /> break; <br /> }<br /> rIICDS=_iicData[_iicPt++]; //_iicData[0] has dummy.<br /> for(i=0;i<10;i++); //for setup time until rising edge of IICSCL<br /> rIICCON=0xaf; //resumes IIC operation.<br /> break;<br /></font><br /> default:<br /> break; <br /> }<br />} |
|