day 16 stm32 IIC

1.IIC概述

1基于对话的形式完成,不需要同时进行发送和接收所以删掉了一根数据线,变成半双工2为了安全起见添加了应答机制3可以接多个模块,且互不干扰4异步时序,要求严格,发送过程中不能暂停,所以需要同步时序+一条时钟线。

模式支持一主多从,和多主多从。仲裁器可以仲裁,也需要时钟线

2.IIC引脚说明

IIC总线只需要两根引脚就可以实现通信,一根是数据线(SDA),另一根是时钟线(SCL),所有通过IIC接口通信的外围器件都挂载在IIC总线上,通过这种机制就可以实现多机通信。

可以看到,外围器件的时钟线和数据线都是挂载在IIC总线(由主控芯片提供),并且在空闲状态下所有器件的时钟线(SCL)和数据线(SDA)都被总线的上拉电阻拉高,这样就可以把SDA引脚和SCL引脚设置为开漏模式即可,好处是防止短路。

寻址

每个挂载在IIC总线上的外围器件都有独立的器件地址,主机发送开始信号后,只需要发送想要通信的设备的地址,如果设备收到地址并且匹配正确,则开始进行单独通信。

3.上拉电阻的作用

  1. 提供无效应答

当主机在总线上发送数据时(器件地址),从机在接收到该数据后应当回复主机一个有效应答(低电平),但是若主机发送的是器件地址,而从机上没有与该器件地址匹配的从机,此时主机就会接收到来自上拉电阻提供的无效应答(高电平)

2.多主模式仲裁

IIC支持多主模式,多个主机怎么判定那个主机在当前通信总线上有效呢?

上拉电阻在IO引脚配置为开漏输出后会有线与功能。

线与功能:多主模式下,只要有一个主机发送0,总线上就为低电平,若都发送1,则总线上就是高电平。(有0为0,全1为1)

由线与功能决定在多主模式通信时,哪个主机先发送1信号,谁先被淘汰。最终留下的就是进入通信的主机。

若只有一个主机,通信总线可以配置为通用的推挽输出,但是多主必须配置为开漏输出

4.通信过程

可以看到,在建立通信的时候主机需要发送开始信号 ,紧接着主机需要发出从器件的设备地址 (7bit+1bit),从设备的物理地址是7bit,但是由于只有一根数据线,就需要说清楚数据的传输方向,数据的传输方向通过从设备的地址最低位进行表示(最低位是0,表示写操作,最低位是1,表示读操作),IIC总线提供了应答机制 ,也就是说从机收到了1个字节的数据之后,会在第九个脉冲发送给主机一个应答信号(1bit),如果主机收到从机的应答信号,则主机可以继续发送数据,反之,如果主机没有收到从机发送的应答信号,那主机就不应该继续发送数据,而是应该主动发出一个停止信号,表示停止通信。

5.器件地址

最低位=0,表示写操作 10100000---写地址 ---主机给从机发数据(0xA0)

最低位 = 1,表示读操作 10100001(0xA1)---读地址---主机从从机读数据(从机给主机发送数据)

1010说明书查的,000是电路设计时接地可以查原理图,0写1读

6.IIC时序

6.1 空闲状态

指的是不传输任何数据的时候就被称为空闲状态,IIC总线规定SDA数据线和SCL时钟线在不传输数据的时候都应该设置高电平,表示空闲。

6.2 开始信号

在SCL(时钟线)为高电平期间,SDA(数据线)从高电平跳变到低电平(下降沿)。

SDA: ----------------\_____

↓ (下降沿)

SCL: --------/¯¯¯¯¯¯¯\_____

↑ (SCL高时SDA跳变)

void OELD_IIC_Start(void)

{

//1.设置SDA引脚为输出模式

OLED_IIC_SDAOutputMode();

//2.确保SDA和SCL为高电平

OLED_IIC_SCL_WRITE(1);

OLED_IIC_SDA_WRITE(1);

Delay_us(5); //提高程序可靠性

//3.把SDA引脚拉低

OLED_IIC_SDA_WRITE(0);

Delay_us(5); // IIC总线的通信速率为100KHZ 1000000us = 100000HZ 10us = 1HZ

//4.把SCL引脚拉低,表示准备通信

OLED_IIC_SCL_WRITE(0);

}

6.3 数据发送

6.4 应答信号

6.5 数据接收

6.6 停止信号

停止信号由主设备(Master)发出,时序特征为:SCL(时钟线)保持高电平期间SDA(数据线)从低电平跳变到高电平(上升沿)

SDA: _____/¯¯¯¯¯¯¯¯

↑ (上升沿)

SCL: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯

(保持高电平)

void OLED_IIC_Stop(void)

{

//1.设置SDA引脚为输出模式

OLED_IIC_SDAOutputMode();

//2.确保SDA和SCL为低电平

OLED_IIC_SCL_WRITE(0);

OLED_IIC_SDA_WRITE(0);

//4.把SCL引脚拉高

OLED_IIC_SCL_WRITE(1);

Delay_us(5);

//5.把SDA引脚拉高

OLED_IIC_SDA_WRITE(1);

Delay_us(5); //确保SDA的电平状态可以被其他从器件检测到

}

相关推荐
未来之窗软件服务6 分钟前
幽冥大陆(三十八)P50酒店门锁SDK C#仙盟插件——东方仙盟筑基期
开发语言·单片机·c#·东方仙盟·东方仙盟sdk·东方仙盟vos智能浏览器
Java小白,一起学习3 小时前
STM32新建工程(标准库官网下载)
stm32·单片机·嵌入式硬件
vickycheung33 小时前
RK3588增加Xenomai3实时补丁
经验分享·嵌入式硬件·arm 嵌入式开发
Bona Sun5 小时前
单片机手搓掌上游戏机(十五)—pico运行fc模拟器之编译环境
c语言·c++·单片机·游戏机
贝塔实验室5 小时前
红外编解码彻底解析
网络·嵌入式硬件·信息与通信·信号处理·代码规范·基带工程·精益工程
小尧嵌入式5 小时前
C++基础语法总结
开发语言·c++·stm32·单片机·嵌入式硬件·算法
2401_853448236 小时前
STM32F103C8T6---OLED显示屏
stm32·单片机·oled
沐欣工作室_lvyiyi6 小时前
基于单片机的居家智能音箱系统(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·智能音箱
沐欣工作室_lvyiyi6 小时前
基于单片机的飞机客舱窗帘控制系统(论文+源码)
单片机·嵌入式硬件·毕业设计·窗户
CHY_1287 小时前
JESD204B 协议解析(4)Subclass2 时序分析
嵌入式硬件·fpga开发·jesd204