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

来源:互联网 发布:外汇期货实时数据接口 编辑:程序博客网 时间:2024/04/29 22:57

在做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=_iicData[1];
原创粉丝点击