【铁头山羊STM32】HAL库 3.I2C部分

目录

一、基础知识

I2C总线

复习开漏输出

逻辑线与

I2C总线的通信过程:

1.起始位

2.寻址

3.数据传输阶段

4.停止位

全过程总结

波特率:

二、简单数据收发实验

屏幕介绍

具体操作

编写代码

学习两个新的接口

注:如果买的江科大的套件,其屏幕跟铁头山羊的有这些不同:


一、基础知识

上一节我们知道了单片机跟外部设备(电脑)的连接和通信,一个串口可以让单片机跟一个外部设备相连,所以通过串口USART1、USART2、USART3,我们的单片机可以跟三个外部设备相连

但若要连接更多设备,就要使用总线,比如说:

I2C总线

  • I2C总线由SCL、SDA组成,
  • SCL负责传输高低变化的方波信号,每个时钟周期传输一位,所以时钟的频率越高,传输的速率越快。
  • SDA负责传输数据,高电压表示1,低电压表示0;
  • 主机和从机各有SCL、SDA引脚,两种引脚各自与I2C总线的SCL、SDA引脚相连;
  • SCL、SDA各连接一个阻值4.7k的上拉电阻;
  • 主/从机的SCL、SDA引脚都使用开漏输出。

复习开漏输出

那么为什么I2C所有的引脚都要配置开漏输出?为什么要配置两个上拉电阻呢?

这其实是为了实现逻辑线与,

SCL、SDA实现逻辑线与的原理一样,拿一条线来举例:

逻辑线与

当主机、从机均配置高阻抗时,总线由于配置了上拉电阻,所以显示高电压;

只要有一个"机"配置的低电压,那么Vdd的电流就会直接通往此"机",从而总线显示低电压。

I2C总线的通信过程:

1.起始位

主机控制SCL恒定为高电压,SDA产生下降沿

2.寻址

每个从机都有一个地址,主机通过SCL控制着节奏的频率,主机通过控制SDA电平的高低变换,产生七位的0/1数据、一位的数据传输方向,从机产生一位的应答。

3.数据传输阶段

从机应答完成后,主机继续产生相应的二进制数据,此数据即为"有效数据",若传输方向相反,则SCL仍由主机控制,SDA起始位、寻址、数据传输的数据的发送和接受方互换

4.停止位

主机在SCL高电压时,向SDA发送上升沿。

全过程总结

波特率:

波特率越大,数据传输越快,但是越不稳定,

我们用的单片机只支持前两钟模式:

通常我们只使用2:1的。


二、简单数据收发实验

屏幕介绍

具体操作

CubeMX新建项目------选型号------选调试接口------配置PC13引脚(板载LED,跟前几次操作相同)------设置I2C接口

我们的单片机有两个I2C接口I2C1和I2C2,我们任选一个,

还可以看到I2C有三种模式:

1.标准I2C接口

2.一般用不到的

直接选择第一种

此时,我们看到底下出现了各种参数:

当STM32当作主机时,设置Master Features(主机参数,更常用),

当从机时,设置Slave Features(从机参数)。

速度等级其实也就是波特率等级,决定着下面比特率参数的范围。

我们的OLED显示器支持快速模式,所以点击快速模式,

点击快速模式后,底下又出现了一个新的参数选项"占空比":

占空比只要没特殊要求一般就选择2:1

可以发现,CubeMX已经自动帮我们分配了I2C的引脚:

继续点击GPIO------I2C,

可以看到,CubeMX已经自动将GPIO模式设置成立复用输出开漏模式:

我们保持默认就好。

名字、地址、工具链选择:

编写代码

接线:

查找显示屏的地址,查阅手册可以看到:

通过屏幕底部红圈位置可以查看地址为0x78,其具体意思如下:

再阅读手册后可知,

通过I2C总线向屏幕输入如下命令就可以显示:

学习两个新的接口

打开keli可以发现CubeMX已经为I2C1生成了一个句柄:

现在使用第一个接口将命令发送出去,在最开始,我们需要生成一个数组,存放命令:

此外,我们还想将板载指示灯当作OLED屏指示灯来使用,当屏幕开启时,点亮这颗LED,

查阅手册可知,这块屏幕有一个状态字,我们便可以利用它来控制LED灯:

可通过I2C总线读一个字节将它读出来:

最终keil代码如下:

注:如果买的江科大的套件,其屏幕跟铁头山羊的有这些不同:

1.江科大套件屏幕内部自带上拉电阻,其市面上大部分带上拉电阻,所以只要直接将I2C、正负极连接到屏幕即可

2.两个屏幕地址相同,不用更改

3.最后的keil代码有些许不同,此处应该修改

相关推荐
Lester_11019 小时前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋11 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
梁洪飞13 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
进击的小头13 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
宵时待雨17 小时前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow18 小时前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
不做无法实现的梦~18 小时前
PX4编译环境配置和qgc配置安装教程(2)
linux·stm32
花月mmc18 小时前
CanMV K230 波形识别——整体部署(4)
人工智能·python·嵌入式硬件·深度学习·信号处理
宁静致远202118 小时前
STM32模拟IIC读取PCF8563
stm32·单片机·嵌入式硬件
三佛科技-1341638421218 小时前
宠物洗澡打泡机方案,宠物泡泡机MCU方案开发设计分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺·宠物