用的是AW32,外部晶振9.8304MHz,FBE模式,总线频率4.9152MHz,IIC模块配置如下:<br /> IIC1C=0x80;<br /> IIC1F=0x50; <br /><br />与at24c64通信,写子程序如下:<br /><br />tagAdr sAdr;<br />#define gAdr sAdr.EepromAdr<br />#define gAdrH sAdr.adr16.AdrH<br />#define gAdrL sAdr.adr16.AdrL<br /><br />void IICWriteByte(word adr, byte dt){<br /> gAdr=adr;<br /> IIC1C_TXAK=0;<br /> IIC1C|=0x30; //MST=1 TX=1 and generate STARTcondition<br /> IIC1D=IIC_SLAVE_ADR;<br /> while(!IIC1S_IICIF); //wait untill TX completed<br /> IIC1S_IICIF=1; //clear IICIF<br /> while(IIC1S_RXAK); //check for slave ack<br /> <br /> IIC1D=gAdrH;<br /> while(!IIC1S_IICIF); <br /> IIC1S_IICIF=1;<br /> while(IIC1S_RXAK); <br /> IIC1D = gAdrL;<br /> while(!IIC1S_IICIF); <br /> IIC1S_IICIF=1;<br /> while(IIC1S_RXAK); <br /> <br /> IIC1D=dt;<br /> while(!IIC1S_IICIF); <br /> IIC1S_IICIF=1;<br /> while(IIC1S_RXAK);<br /> <br /> IIC1S_IICIF=1;<br /> IIC1C_MST=0;<br />}<br /><br />void IICWriteN(word adr,byte *dt,byte n){ //此函数全速执行不正常,单步执行则正常!<br /><br /> byte i;<br /> for(i=0;i<n;++i) {<br /> IICWriteByte(adr+i,dt); <br /> }<br />}<br />奇怪的是在调用IICWriteN时,如果全速执行,则会在while(IIC1S_RXAK);一直执行,即没收到从机的ACK,但是单片跳进IICWriteN函数执行则正常。为什么? |
|