IIC协议与实现之学习笔记 for STM32F103C8T6

一、IIC协议概括

IIC全称Inter-Integrated Circuit (集成电路总线)
是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。

1、特点:
简单性和有效性

由于接口直接在组件上,因此IIC总线占用的空间非常小,减少了电路的空间和芯脚管脚的数量,降低了互联成本。

2、主机/从机模式

一次数据传输的开始和结束只由主机(MCU)来发起;

3、硬件构成

IIC串行总线由两根线组成,一根是双向的数据线SDA,另一根是时钟线SCL,其SCL信号是由主机控制;

所有接到IIC总线上的设备的SDA线都接到总线的SDA,各设备的时钟线SCL接到总线的SCL上;总线上的每个设备都有一个唯一地址。

4、IIC协议

IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号应答信号、结束信号

这些信号中,起始信号是必须的,结束信号和应答信号。

根据起始信号时序图,可以看出SCL在信号发生过程中没有发生变化,根据IIC接线图可以看出SCL空闲时置高,当信号发生时SDA置高延时4.7us后置低。由此我们可以写出IIC总线的起始信号函数:

void IIC_Start(void)
{
     sda = 1;
     scl = 1;
     __NOP();
     sda = 0;
     __NOP();
}

根据终止信号图可以看出初始状态下,SCL置高,当信号发出后SDA拉高,延时4.7us,SDA置低。

void IIC_Stop(void)
{
     sda = 0;
     scl = 1;
     __NOP();
     sda = 1;
     __NOP();
}

应答信号

发送器每发送一个字节(8Bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接受器已经成功地接受了该字节;

应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

因为发送器发送数据时,将释放数据线,则初始状态时SDA拉高,延时一段时间,到信号发生后,SCL拉高延时4us的同时进行对于SDA高低判断。在程序中设置一个标志位flag来存放SDA高低进行判断。

char IIC_ACK()
{
    char flag;
    sda = 1;          //在时钟脉冲9期间释放数据线
    __NOP();
    scl = 1;
    __NOP();
    flag = sda;
    __NOP();
    scl = 0;
    __NOP();
    return flag;
}

数据发送时序:
 

void IIC_Send_Byte(char dataSend)
{
      int i;
      for(i = 0;i<8;i++){
            scl = 0;                      //scl拉低,让sda做好数据准备
            sda = dataSend & 0x80;        //1000 0000获得dataSend的最高位,给sda
            __NOP();                      //发送数据建立时间
            scl = 1;                      //scl拉高开始发送
            __NOP();                      //数据发送时间
            scl = 0;                      //发送完毕拉低
            __NOP();
            dataSend = dataSend << 1;
      }
}

--------    end ---------------------

希望能帮到和我一样的小白们!

本文参考了和借鉴了NCHui的帖子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值