模拟IIC协议

IIC:是一种数据传输协议。全称:Intel-Interate Circuit Bus(集成电路总线)这种总线类型是由菲利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。这种方式简化了信号传输总线。一般情况下,它有两根信号线,即:SCL和SDA。

总线空闲状态:

此时各个器件的输出极场效应管均处于截至状态,没有器件操作总线,由于接在总线上的上拉电阻作用,SCL和SDA均处于高电平。

启动总线:

在SCL为高电平期间,SDA被拉低,它标志着一次数据传输的开始。

模拟IIC协议_第1张图片

典型代码:

void StartIIC()
{
  SDA = 1;         /*发送起始条件的数据信号*/
  _Nop();
  SCL = 1;
  _Nop();        /*起始条件建立时间大于4.7us,延时*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();    
  SDA = 0;         /*发送起始信号*/
  _Nop();        /* 起始条件锁定时间大于4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();       
  SCL = 0;       /*钳住I2C总线,准备发送或接收数据 */
  _Nop();
  _Nop();
}

应答信号:

IIC总线上的所有数据都是以8位字节传送的,每次发送完一个字节,就在第9个时钟脉冲器件释放数据总线,由接收器返回一个应答信号,应答信号位低电平时规定为有效应答,表示接收器已经成功接受了该字节。

模拟IIC协议_第2张图片

发送数据:

数据发送采用分解的方式,将每一个一字节的命令或者地址分解成为8个位,逐个把它放到SDA上。

典型代码如下:

void  SendByte(unsigned char  c)
{
 unsigned char  BitCnt;
 
 for(BitCnt = 0;BitCnt < 8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c << BitCnt) & 0x80)
SDA = 1;/*判断发送位*/
     else
SDA = 0;                
     _Nop();
     SCL = 1;  /*置时钟线为高,通知被控器开始接收数据位*/
      _Nop(); 
      _Nop(); /*保证时钟高电平周期大于4μs*/
      _Nop();
      _Nop();
      _Nop();         
     SCL = 0; 
    }
    
    _Nop();
    _Nop();
    SDA = 1; /*8位发送完后释放数据线,准备接收应答位*/
    _Nop();
    _Nop();   
    SCL = 1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA == 1)
ack=0;     
    else
ack = 1; /*判断是否正常接收数据*/
    SCL = 0;
    _Nop();
    _Nop();
}

接收数据:与发送数据刚好相反,将接收的一位数据赋给一个变量,然后将变量移一位,再接收下一个数据,直到接收完。

典型代码如下:

unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
  
  retc = 0; 
  SDA = 1;                       /*置数据线为输入方式*/
  for(BitCnt = 0;BitCnt < 8;BitCnt++)
      {
        _Nop();           
        SCL = 0;                  /*置时钟线为低,准备接收数据位*/
        _Nop();
        _Nop();                 /*时钟低电平周期大于4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL = 1;                  /*置时钟线为高使数据线上数据有效*/
        _Nop();
        _Nop();
        retc = retc << 1;
        if(SDA == 1)

retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        _Nop();
        _Nop(); 
      }
  SCL = 0;    
  _Nop();
  _Nop();
  return (retc);
}

结束信号:在SCL为高电平器件,SDA被拉高,这也是在数据传送的时候,当SCL为高电平期间,SDA必须保持稳定的原因。

模拟IIC协议_第3张图片

总线封锁状态:在特殊情况下,要禁止总线上的一切通信活动,只要挂接在该总线上的任何一个器件将SCL锁定在低电平即可。

需要注意的地方:

1:在数据传输的时候,SCL高电平期间,SDA必须保持稳定,只有在SCL为低电平期间,SDA才可以变化。

模拟IIC协议_第4张图片







你可能感兴趣的:(协议)