打印

谁能说说44B0的I2C是怎么工作的?

[复制链接]
1724|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2009-2-6 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, ic, iic, ST, TI

自己写了一下没有成功,下面是给的例程,用中断的方法来发送一个Byte,红色的部分都好理解,分别写器件地址,子地址,数据,每发送完一个字节产生一次中断,发完了停止总线。
问题是,它上面的每个字节发完之后都不等ACK,直到发完,总线停止了以后,来到蓝色部分,在这里等ACK???而且这时还是设rIICSTAT=0xf0;就是主器件发送模式,再发送一次器件地址,然后等ACK,这是从何说起啊??
另外,44B0是否无法用I/O口来模拟I2C了?要频繁更改I/O口的属性,似乎时间上来不及,不知道为什么ARM的I/O口都要这样设计,不像51的是输入输出的??


void Wr24C040(U32 slvAddr,U32 addr,U8 data)
{
  _iicMode=WRDATA;
  _iicPt=0;
  _iicData[0]=(U8)addr;
  _iicData[1]=data;
  _iicDataCount=2;
    
  rIICDS=slvAddr;//0xa0
  rIICSTAT=0xf0; //MasTx,Start
  while(_iicDataCount!=-1);


  _iicMode=POLLACK;
  while(1)
  {
      rIICDS=slvAddr;
      _iicStatus=0x100;
      rIICSTAT=0xf0; //MasTx,Start
      rIICCON=0xaf;  //resumes IIC operation. 
      
      while(_iicStatus==0x100);
      
      if(!(_iicStatus&0x1))
        break; // when ACK is received
  }
  
  rIICSTAT=0xd0;  //stop MasTx condition 
  rIICCON=0xaf;   //resumes IIC operation. 
  Delay(1);        //wait until stop condtion is in effect.

  //write is completed.
}

void __irq IicInt(void)
{
    U32 iicSt,i;
    rI_ISPC=BIT_IIC;

    switch(_iicMode)
    {
    case POLLACK:
        _iicStatus=iicSt;
        break;

    case WRDATA:
        if((_iicDataCount--)==0)
        {
        rIICSTAT=0xd0;    //stop MasTx condition 
        rIICCON=0xaf;    //resumes IIC operation.
        Delay(1);    //wait until stop condtion is in effect.
        //The pending bit will not be set after issuing stop condition.
        break;    
        }
        rIICDS=_iicData[_iicPt++];  //_iicData[0] has dummy.
        for(i=0;i<10;i++);        //for setup time until rising edge of IICSCL
        rIICCON=0xaf;        //resumes IIC operation.
        break;

    default:
        break;      
    }
}

相关帖子

来自 2楼
阿南| | 2009-2-7 09:20 | 只看该作者

re:

程序使用了44b0x内部硬件IIC,可能楼主之前使用的是模拟的IIC,此时楼主可以对着44b0x的数据手册来看

使用特权

评论回复
板凳
阿南| | 2009-2-6 12:44 | 只看该作者

先别急着自己写,用官方的test程序试下先,成功后再去理解

使用特权

评论回复
地板
箫笑|  楼主 | 2009-2-6 12:53 | 只看该作者

上面的就是测试程序

但是没明白它为什么要这么操作,跟之前理解的I2C对不着,手头上没有示波器,看不到它的波形.

使用特权

评论回复
5
箫笑|  楼主 | 2009-2-7 11:01 | 只看该作者

re

嗯,用的是硬件I2C.
我的意思是,I2C协议里面说的就是每个Byte之后等ACK,这跟用甚么方法来实现没关系吧?假如我要求实现发送器件地址后如果没ACK就重发,显然这里是没法做到的啊.它只能得到最后的一个ACK.
或者是每发一个字节就要把总线停止了,然后等ACK,奇怪得很

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝