zoukankan      html  css  js  c++  java
  • 【协议】IIC通信

    1、传输时,SCL为高电平时SDA须保持稳定,SCL为低电平是SDA才能变化

    2、SCL为高时SDA由高变低为起始dive in

          SCL为高时SDA由低变高为终止pull out

    3、应答与非应答

    应答:从机应答位一帧数据的第九位为0;

    非应答:从机应答位一帧数据的第九位为1;

    主机在发送数据时,每发送一字节数据后都会向从机读取应答位

                  当从机为应答时,表示从机空闲

                  当从机为非应答时,表示从机繁忙,主机读到非应答时应发出终止信号

              因此主机可以通过应答位来判断从机是否成功接收数据;

              主机在接收数据时,当收到最后一个数据后,对从机发送非应答,从机释放SDA,允许主机终止。

    4、数据帧

    起始信号后跟一帧地址,其中七位为ADDR,位为方向

     

     

    如:

        发送:主机发送起始信号 >> 主机发送七位地址及一位方向0  >>

        主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号  >> 

        主机发送数据 >> 。。。>> 读到非应答 >> 从机繁忙 >> 主机发送终止信号;

         

    void Send_EPR_Byte(uchar ADDR, uchar dat)
    {
        IIC_Start();
        IIC_SendByte(0xa0);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        IIC_SendByte(ADDR);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        IIC_SendByte(dat);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        IIC_Stop();
    }

        读取:主机发送起始信号 >> 主机发送地址及方向0>>

        主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号 >> 换向 >>

        主机发送起始信号 >> 主机发送从机地址及方向1 >> 主机读取从机应答信号 >>

        主机读取数据 >> 主机发出非应答 >> 从机释放SDA >> 主机发送终止信号

        

    uchar Read_EPR_Byte(uchar ADDR)
    {
        uchar dat;
        IIC_Start();
        IIC_SendByte(0xa0);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        IIC_SendByte(ADDR);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        IIC_Start();
        IIC_SendByte(0xa1);
        if(IIC_WaitAck())
            ackflag = 1;
        else
            ackflag = 0;
        dat = IIC_RecByte();
        IIC_WaitAck();
        IIC_Stop();
        return dat; 
    }

    个人对IIC的概念还存在模糊,如上定义不时修改,欢迎指正

  • 相关阅读:
    jar包制作
    eclipse 编译出错(java.io.ObjectInputStream)的解决办法
    Onmouseover被调用多次
    【驱动】——模块参数
    【驱动】——驱动入门用例
    【linux】——FTP出现500 OOPS: cannot change directory的解决方法
    【驱动】——错误: 初始值设定项里有未知的字段‘ioctl’
    【C】——动态库中函数的作用范围
    【C】——如何生成静态库和动态库
    【C】——C语言字符串比较函数
  • 原文地址:https://www.cnblogs.com/ZYQS/p/14235449.html
Copyright © 2011-2022 走看看