IIC协议接口在ARM系统下的操作

【IIC协议接口在ARM系统下的操作】在做IIC协议测试的时候对于写入的数据通过demo自带的测试函数都能够正确的读取出来,但是通过自己按照IIC协议的流程图写出来的函数也能够把所有的数据读取出来,但是是偶数读一遍,奇数读一遍。交叉着读取出来的。这是不正确的。。调试了好几天都没修正过来。今天我又重新把他的函数重新写了一遍。。关键的部分在while(rIICCON&0x10)这个条件上。。为什么呢?请看这个截图
这个是判断是否写中断或者读取中断的标志。。我将把我的代码附上,请大家学习。。 //先传输地址
rIICDS=slavaddr;
rIICSTAT=0xf0;
_iicDataCount=1;
while(_iicDataCount!=-1)
{
if(rIICCON&0x10)
{
rIICDS = addr;
for(i=0; i<10; i++); //for setup time until rising edge of IICSCL
rIICCON = 0xaf;
_iicDataCount--;
} } 这些都是写操作,将slavaddr addr 传输到rIICDS寄存器里面去。。。 / 下面是配置为master Rx 模式。。按照流程操作。
rIICDS=slavaddr;
rIICSTAT=0xb0;
_iicDataCount=1;
_iicPt=0; while(_iicDataCount!=-1)
{
if(rIICCON&0x10)
{
if((_iicDataCount--)==0)
{
_iicData[_iicPt++] = rIICDS;

rIICSTAT = 0x90; //Stop MasRx condition
rIICCON= 0xaf; //Resumes IIC operation.
Delay(1); //Wait until stop condtion is in effect.

}
_iicData[_iicPt++] = rIICDS;
//The last data has to be read with no ack.
if((_iicDataCount)==0)
rIICCON = 0x2f; //Resumes IIC operation with NOACK.
else
rIICCON = 0xaf; //Resumes IIC operation with ACK
}
}
*data=https://www.it610.com/article/_iicData[1];

    推荐阅读