stm32学习总结:通信(1)IIC通信

一、 定义

IIC(Inter-Integrated Circuit,是IICBus的简称,中文:集成电路总线),它是一种符合IIC协议的串行通信总线。一般两根线,一根是双向的数据线SDA,另一根也是双向的时钟线SCL,它们都通过一个电流源或上拉电阻连接到正的电源电压。下图为IIC的硬件电路图。
在这里插入图片描述

二、 特点

  1. 通信双方分为主机与从机
    IIC总线两端分别为主机与从机,其中SCL信号一般由主机产生,作用是同步通信时间,保证信息传递的完整性与一致性,SDA信号为双向的,可由主机发送至从机,也可由从机发送至主机,但同一设备在某一时刻不可以既是发送者又是接收者,这一特性使得IIC总线实现一根数据线的串行半双工通信。
  2. 一组IIC总线可以挂载多个设备
    总线上可以有多个主机和从机,在数据传输时可通过冲突检测和仲裁防止数据被破坏。仲裁是指主机仲裁,也就是多个主机同时发起始信号,但是从机该听谁的,由主机仲裁机制决定,从机不参与,因为这时的从机不会去控制SDA或SCL。
  3. 总线上的设备须有一个ID
    总线上挂载的主机与从机均需要一个ID号,以便在通信时主机能找到与之通信的另一方,屏蔽其他设备。
  4. 通信时会有应答信号
    接收方会在接收到发送方传递的信息后,返回一个应答信号,发送方接收到后才会继续发消息。

三、 协议构成

IIC协议由空闲信号、起始位、再次起始位、从机地址(ID)、读写方向位、应答信号位(ACK)、片内地址、数据帧和停止位构成,下面分别介绍读和写的协议构成。

  1. 主机向从机写数据
    协议构成如图所示。
    在这里插入图片描述

空闲信号:空闲期间SDA不被占用为高电平;
起始位:1bit,SCL高电平期间,SDA从高电平切换到低电平,如图;
在这里插入图片描述

从机地址:7bits,从机的ID一般为7位,先写入最高位,SDA由主机控制;
读写方向位:1bit,该位为0时为主机向从机写入数据,SDA由主机控制;
应答信号位:1bit,该位为0时表示消息收到(ACK),为1表示无应答(NACK),SDA由从机控制;
片内地址:8bits,用来指定所操作外设的寄存器地址,此时SDA由主机控制,之后需要接收应答位;
数据帧:N Bytes,实际发送的数据,8bits为1个Byte,每发1个Byte数据,需要收1个应答位,发数据时SDA由主机控制,收应答位时SDA由从机控制;
停止位:1bit,SCL高电平期间,SDA从低电平切换到高电平,如图。
在这里插入图片描述

  1. 主机读取从机数据
    协议构成如图所示。
    在这里插入图片描述

    空闲信号:空闲期间SDA不被占用为高电平;
    起始位:1bit,SCL高电平期间,SDA从高电平切换到低电平,如图;
    在这里插入图片描述
    从机地址:7bits,从机的ID一般为7位,先写入最高位,SDA由主机控制;
    读写方向位:1bit,该位为0时为主机向从机写入数据,SDA由主机控制;
    应答信号位:1bit,该位为0时表示消息收到(ACK),为1表示无应答(NACK),SDA由从机控制;
    片内地址:8bits,用来指定所操作外设的寄存器地址,此时SDA由主机控制,之后需要接收应答位;
    再次起始位:1bit,此时SDA由主机控制,逻辑与起始位一致;
    再发从机地址和读写方向:8bits,主机再发一次从机ID,读写方向位改为1,即主机读取从机信息;
    数据帧:N Bytes,实际接收的数据,每发1个Byte数据,需要收1个应答位,发数据时SDA由从机控制,应答位时SDA由主机控制,最后1个Byte数据接收后主机需要发送无应答信号;
    停止位:1bit,SCL高电平期间,SDA从低电平切换到高电平,如图。
    在这里插入图片描述

四、 使用流程

STM32的寄存器提供了各种标志位,当产生某一事件时特定标志位会有变化,为我们使用该种通信方式提供了便利。

  1. 主机发送流程分析
    如下图所示为主机发送的流程,两行分别表示通信流程与产生事件,通信流程不再赘述,主要解释一下各个事件。
    在这里插入图片描述
    EV5:主机将SDA拉低后将产生主模式选择事件,检测到该事件后,可继续进行后续步骤;
    EV6:发送时将产生EV6事件,表示当前是主机发送模式;
    EV8:主机传输数据过程中产生EV8,此时SDA被占用;
    EV8_2:主机传输数据完成产生EV8_2,该事件作为停止位的前提使用。
  2. 主机接收流程分析
    如图所示为主机接收的流程,该流程由于不包含
    在这里插入图片描述
    EV5:主机将SDA拉低后将产生主模式选择事件,检测到该事件后,可继续进行后续步骤;
    EV6:发送时将产生EV6事件,表示当前是主机发送模式;
    EV8_2:主机传输数据完成产生EV8_2,该事件作为停止位的前提使用;
    EV7:主机接收消息完成后产生该事件,检测到后可发送停止位。

五、 代码分析

void 
IIC(Inter-Integrated Circuit)通信协议是一种串行通信协议,也被称为I2C(Inter-IC)协议。它是由飞利浦(Philips)公司在1982年开发的,用于在集成电路之间进行通信。 在Keil软件中,可以使用C语言编写IIC通信协议的代码。下面是一个简单的示例代码,用于在Keil中实现IIC通信协议: ```c #include <reg51.h> // 定义IIC通信相关的引脚 sbit SDA = P1^0; sbit SCL = P1^1; // IIC起始信号 void IIC_Start() { SDA = 1; SCL = 1; delay(); // 延时一段时间 SDA = 0; delay(); SCL = 0; } // IIC停止信号 void IIC_Stop() { SDA = 0; SCL = 1; delay(); SDA = 1; delay(); } // IIC发送一个字节的数据 void IIC_SendByte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { SDA = (dat & 0x80) >> 7; // 发送数据的最高位 dat <<= 1; SCL = 1; delay(); SCL = 0; delay(); } } // IIC接收一个字节的数据 unsigned char IIC_ReceiveByte() { unsigned char i, dat = 0; SDA = 1; for (i = 0; i < 8; i++) { dat <<= 1; SCL = 1; delay(); dat |= SDA; // 接收数据的最高位 SCL = 0; delay(); } return dat; } // 延时函数 void delay() { unsigned int i, j; for (i = 0; i < 100; i++) for (j = 0; j < 100; j++); } int main() { // 主控制器初始化 SDA = 1; SCL = 1; // 发送数据 IIC_Start(); IIC_SendByte(0x50); // 发送设备地址 IIC_SendByte(0x01); // 发送数据 IIC_Stop(); // 接收数据 IIC_Start(); IIC_SendByte(0x51); // 发送设备地址 unsigned char data = IIC_ReceiveByte(); // 接收数据 IIC_Stop(); while (1); } ``` 这段代码实现了IIC通信协议的基本功能,包括发送起始信号、停止信号、发送数据和接收数据等操作。你可以根据具体的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值