STM32F407 IIC通信协议驱动代码

前言

IIc总线是单片机与外部模块进行通讯常用的协议,由两根线组成,分别是SCL,SDA组成,主机驱动SCL时钟信号的发生,在SCL的时钟脉冲下,通过SDA的时序,即可与外部模块通讯。

IIC简介

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

  • IIC是为了低速设备通信而发明、V(IIC) < V ( spi )

下面就根据AT24C02 的芯片来讲解IIC时序的各个时序单元

在这里插入图片描述
在这里插入图片描述

a . IIC 起始信号(AT24C02)

在这里插入图片描述
开始解析
从这个时序单元可以看出,一开始SCL 为1,榆次同事SDA也为1 ,于是程序为:
注意:我们不需要考虑StartCondition 之前的时序,这是上一个时序单元做的工作

void start(){
   
	SCL = 1;
	SDA = 1;
}

按照时间的顺序,我们可以看到SDA,和 SCL谁最先变化呢,答案是SDA.,但是时间需要满徐Tchdx > 4.7 uS , 我们可以设置成5us。于是代码为:

void start(){
   
	SCL = 1;
	SDA = 1;
	Delay5us();
}

紧接着,在SCL为1 期间,SDA开始变化,从 1 变 0 ,而且持续时间为tdlcl > 4 uS,于是代码变成:

void start(){
   
	SCL = 1;
	SDA = 1;
	Delay5us();
	SDA = 0;  // 执行这条语句前SDA = 1,和时序图一致
	Delay5us();  // 让SDA = 0的状态保持至少4us , 这里我们设置成5us
}

到这里SDA的时需我们已经严格按照启动信号的SDA的时序来写。

但是此时我们忽略了SCL的时序是否满足,也就是Tchcl , 查看参数表发现等于 4,现在我们看代码,从SCL = 1 之后,到Tdlcl
之后,此时时间已经过去了5 + 5us = 10 us, 也就是满足了,所以我们不需要额外写关于tCHCL的时间代码。

此时启动时序已经完成。


b . 发送数据

我们需要了解一个概念,就是主机和从机是如何通讯的。
答案:

  • 我们是通过SCL发送脉冲信号,在脉冲信号为低电平期间,SDA可以变更数据,
  • 在SCL从0 - > 1 变化过程中,从机被立马开始读取SDA上的电平信号(读取 0 [ 低电平 ] / 1 [ 高电平 ] )

但是经过start 信号之后,SCL仍然为 高电平,所以第一步就是,将SCL 拉低,为了等下产生一个 由低到高的电平脉冲信号。


由时序图我们可以得知,它要求我们SCL为低电平期间,SDA允许发生变化,那我想要在SCL为高电平期间,SDA发生变化呢?

答案是:不行, 为什么呢?

在这里插入图片描述


在这里插入图片描述

从上面的分析后,我们开始写代码:

void send_data(uchar data) {
   
	SCL = 0;
	if(data & 0x80) SDA = 1;
	else            SDA = 0;
	delay_us();
	SCL = 1;
}

但是写到这里,我们发现,我们只考虑SDA的时序规定,而没有考虑SDA的时序规定。

也就是说,我们要考虑SCL 变成低电平后 到 SDA 变成高电平期间,需要持续的时间tCLCH = 4.7us

而我们发现t CLCH 里面包含了 tDXCX ,所以我们只需要考虑tDXCX的时间即可

void send_data(uchar data) {
   
	SCL = 0;
	if(data & 0x80) SDA = 1;
	else            SDA = 0;
	delay_5us
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hal stm32f407是指使用HAL库编写的适用于STM32F407系列单片机驱动程序。而"oled iic 0.96"是指一款0.96英寸OLED显示屏,使用I2C通信协议进行数据传输。 为了在STM32F407驱动这个OLED显示屏,我们可以使用HAL库提供的函数来配置STM32F407的I2C外设,并通过I2C总线来和OLED进行通信。首先,我们需要通过初始化函数来配置STM32F407的GPIO和I2C外设,使其适应OLED的工作要求。然后,我们可以使用HAL库提供的I2C读写函数来向OLED发送命令或数据。 通常,OLED显示屏驱动需要以下步骤: 1. 创建一个I2C_HandleTypeDef结构体,并通过HAL_I2C_Init函数对其进行初始化。 2. 通过HAL_GPIO_Init函数来初始化和配置I2C总线相关的GPIO引脚。 3. 使用HAL_I2C_Master_Transmit函数发送OLED的初始化命令序列,以配置OLED的工作模式和显示设置。 4. 在需要显示内容时,使用HAL_I2C_Master_Transmit函数发送显示数据到OLED,以在屏幕上显示对应的图像或文本。 需要注意的是,具体的初始化命令和数据传输格式可能因OLED显示屏的型号而有所差异,所以在具体应用时需要参考OLED显示屏的驱动手册来进行相关的配置。 总之,通过HAL库的支持,我们可以轻松地在STM32F407驱动该款OLED显示屏,让它显示我们想要的图像或文本。 ### 回答2: HAL是指用于微控制器芯片的硬件抽象层,可以为芯片的底层硬件提供统一的接口和函数库。STM32F407是意法半导体公司开发的一款32位微控制器芯片,具有高性能和多种接口功能。而0.96是一种OLED显示屏,具有0.96英寸的尺寸。 在STM32F407上,我们可以使用HAL库提供的函数来使用OLED显示屏。采用IIC(Inter-Integrated Circuit)接口来连接STM32F407和OLED 0.96,IIC是一种串行通信协议,适用于短距离通信。这种连接方式可以实现双向通信,方便控制与数据传输。 使用HAL库,我们可以通过配置相应的GPIO管脚作为IIC接口的时钟线SCL(Serial Clock)和数据线SDA(Serial Data)来连接STM32F407与OLED 0.96。然后通过使用HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive函数来发送和接收数据。 在操作过程中,我们可以使用HAL库提供的函数来控制OLED显示屏的亮度、对比度、显示模式等设置。通过调用HAL_Delay函数可以实现延时操作,以控制显示的刷新频率和动画效果。 总之,使用HAL库,我们可以方便地在STM32F407上通过IIC接口驱动OLED 0.96显示屏,实现各种功能和效果,为嵌入式系统开发提供了便利。 ### 回答3: HAL是指STM32的硬件抽象层(Hardware Abstraction Layer),是ST公司为STM32微控制器提供的一组API函数库。通过使用HAL,开发人员可以更方便地操作STM32微控制器的各种外设。 STM32F407是一款高性能的ARM Cortex-M4微控制器,主频达到168MHz,拥有256KB的Flash存储器和SDRAM控制器,适用于各种工业控制、通信、嵌入式音频等应用。 OLED(Organic Light Emitting Diode)是一种有机发光二极管显示技术,具有高对比度、快速响应、低功耗等优点。它可用于制作小尺寸的、超薄的显示屏,广泛应用于手机、手表、电视等设备。 IIC(Inter-Integrated Circuit)是一种串行通信协议,也称为I2C(Inter-IC)总线。它是一种多主设备、多从设备的通信协议,可以连接多个外设与微控制器进行通信。 0.96指的是OLED显示屏的尺寸,即0.96英寸。这个尺寸适用于一些小型的电子设备。 综上所述,"HAL STM32F407 OLED IIC 0.96"意味着使用STM32F407微控制器,通过HAL函数库驱动一个0.96英寸的OLED显示屏,使用IIC总线进行通信。这种硬件组合可以实现在STM32F407驱动OLED屏幕显示各种信息,例如文本、图形等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值