I2C总线

1. 定义方法

  a.定义起始信号

  b.定义终止信号

  c.定义单片机写入函数

  d.定义单片机读出函数

  e.写入到指定元器件

  f.从指定元器件读出

  g.写一个头文件作为中转

  h.写一个主函数实现对写入读出的调用

2. 定义起始信号

  a.SDA 高电平延时

  b.SCL高电平延时

  c.SDA低电平延时

  d.SCL低电平延时

  

    SDA = 1;
    Delay10us();
    SCL = 1;
    Delay10us();
    SDA = 0;
    Delay10us();
    SCL = 0;
    Delay10us();
View Code

  

3. 终止信号

  a.SDA低电平延时

  b.SCL高电平延时

  c.SDA高电平延时

  

    SDA = 0;
    Delay10us();
    SCL = 1;
    Delay10us();
    SDA = 1;
    Delay10us();
View Code

  

4. 单片机写入函数

  a.定义函数需要返回值,需要一个8位形式参数

  b.for循环8次,每次发送一个数据,通过数据左移右移实现,每次写入SDA后要把SCL电平拉低

  c.循环完成后拉高SDA延时后拉高SCL让SDA保持不变

  d.while(SDA)循环等待元器件应答,应答后SDA会被拉低跳出循环

  e.返回值

unsigned char sendaddr(unsigned char dat)
{
    unsigned char a=0,b=0;
    for(a=0;a<8;a++)
    {    SDA=dat>>7;
        dat<<=1;
        Delay10us();
        SCL = 1;
        Delay10us();
        SCL = 0;
        Delay10us();            
    }
    SDA = 1;
    Delay10us();
    SCL = 1;    
    while(SDA)
    { b++;
      if(b>200)
      { SCL = 0;
        Delay10us();
          return 0;
      }
    }
    SCL = 0;
    Delay10us();
    return 1;
}
View Code

5. 单片机读出函数  

  a.定义函数需要返回值不需要形式参数

  b.定义变量作为容器接收数据

  c.for循环8次,先拉高电平保持SDA稳定,num<<=1,num|=SDA 拉低电平

  e.返回num

unsigned char reader()
{
 unsigned char a,num;
  num = 0;
 //SDA = 1;
  Delay10us();
  for(a=0;a<8;a++)
  {
      SCL = 1;
     Delay10us();
     num<<=1;
     num|=SDA;
     Delay10us();
     SCL=0;
     Delay10us();
  }
    return num;
}
View Code

6. 写入元器件函数

  a.定义函数不需要返回值,需要两个形式参数

  b.起始信号>>写入函数(元器件地址0)>>写入函数(元器件首地址)>>写入函数(写入值)>>终止信号

void A204write(unsigned char addr,unsigned char dat)
{
    start();
    sendaddr(0xa0);
    sendaddr(addr);
    sendaddr(dat);
    stop();    

}
View Code   

7. 从元器件读出函数

  a.定义带返回值的函数不需要形式参数

  b.起始信号>>写入函数(元器件地址0)>>写入函数(元器件首地址)>>起始信号>>写入函数(元器件地址1)>>接收SDA的值>>终止信号

  c.返回值  

unsigned char A204read(unsigned char addr)
{
    unsigned char num;
    start();
    sendaddr(0xa0);    
    sendaddr(addr);
    start();
    sendaddr(0xa1);
    num = reader();
    stop();
    return num;
}
View Code

 

猜你喜欢

转载自www.cnblogs.com/mycgy/p/8977895.html