通信协议一、I2C协议的硬件电路-为什么接上拉电阻以及频率限制的原因以及I2C协议介绍

I2C的硬件电路如下:
在这里插入图片描述
只有两根线,一条时钟线,一条数据线
I2C的发送和读取的规则:
时钟线在高电平时,发送方发送数据,同时时钟线高电平时接收方接收数据
在这里插入图片描述
如果在一个I2C电路中,一个设备发出了高电平,而另一个设备发出了低电平,此时会发生什么呢?数据现象到底是高电平还是低电平?在这里插入图片描述
这里就要体现出I2C总线硬件设计的精髓之处了
1、首先单片机IO口内部一般有两个mos管

在这里插入图片描述在这里插入图片描述在这里插入图片描述
所以当两个芯片的IO同时接在一个线上时,一端输出高电平,一端输出低电平,就会出现下面的情况:VCC和GND出现短路

在这里插入图片描述
2、I2C芯片做了阉割,去掉了上面的MOS管,所以这个时候不可能输出高电平,就不会出现短路的情况

在这里插入图片描述
但是相对的无法输出高电平了,所以加入了上拉电阻

在这里插入图片描述这个时候由于上拉电阻的存在,总线就会处在高电平的状态,这也是为什么低电平是I2C的唤醒电平了
当芯片的io打开了mos管就会输出低电平,mos管关闭回到高电平
典型的GPIO开漏输出

在这里插入图片描述这时候不会出现短路的现象了

上拉电阻的取值(在I2C电路中非常重要的问题)

此电阻不能太大也不能太小,一般就是几千欧姆
比较常用的是4.7KΩ
在这里插入图片描述
如果这个上拉电阻比较小,比如100Ω,当IO导通时,也就是电路为低电平时,整个的电流为33mA,容易损坏电路

在这里插入图片描述
当这个上拉电阻过大时:
1、首先每一个设备的IO口对地总是会有一些寄生电容

在这里插入图片描述
2、从低电平往高电平转换的过程中,也就是MOS管关断时,会先通过电流对这个电容充电,这导致I2C信号在变为高电平时会有一个爬坡的过程,也就是说,由于电容充电的过程,导致了信号从低到高转变的时间变慢,不是瞬间完成的
电阻越大,给电容充电的时间也就越慢,低电平变为高电平的转换也就越慢,

在这里插入图片描述
所以当总线上设备变多的时候,会适当减小上拉电阻值

在这里插入图片描述
一般选4.7K

在这里插入图片描述

所以由于上拉电阻的存在,以及寄生电容的存在,导致了高低电平转换的时间出现了快慢,也就导致了I2C的频率注定不高,另外就是抗干扰能力很弱

在这里插入图片描述

1、什么是总线协议

都用过串口协议,串口协议传输的成员只有两个,也就是协议传输的双方,但是如果有第三个也需要传输数据呢?增加一个串口?但是100个呢?
这就需要引入总线协议:也就是在总线上的多个设备之间可以传输信息

2、I2C总线

首先和串口线对比,串口线中有rx和tx,所以可以同时进行发送和接收
在这里插入图片描述
串口有波特率,为什么定义波特率呢?
假设现在将波特率设置为1,也就是1秒钟传输一个比特,发送方在1秒内发送一个bit,接收方在一秒内接受1bit,比如发送方一秒内发送了一个高电平,接收方就会接受一个高电平
但是如果波特率不同或者说混乱没有协商波特率的情况下:
发送方设置波特率为1,接收方设置波特率为2
发送方在一秒钟内发送了1bit,比如高电平,接收方却在一秒内接收了2次高电平
如果是9600和115200呢,是不是传输就混乱了?或者换句话说,没有波特率,大家互相之间就会胡乱传递
所以波特率其实就是互相之间进行了时统
有了这个概念再来理解I2C为什么存在时钟线了
I2C协议有SCL时钟线和SDA数据线
在这里插入图片描述
1、空闲状态:scl和sda都为高电平
在这里插入图片描述
2、起始信号:SCL为高电平,SDA从高到低,主机发起,其实就是为了告诉从机你们要准备接收数据了
也就是空闲时两根线都是高电平,当SDA跳变到低电平时就是起始信号
在这里插入图片描述
3、七位设备地址码:因为I2C总线上有很多设备,所以主机先发送想要访问的设备地址,该地址的设备就会明白主机将要和我进行通信了
在这里插入图片描述
4、发送数据时的逻辑1和逻辑0,可以看到当SCL为高电平时,此时看SDA数据线上的电平,为高就是逻辑1,为低就是逻辑0
也就是时钟线为高电平,数据线才有效,这就能看出来了时钟线的作用了,也就是双方进行了时统,这就对应上了串口在没有时钟线时做了波特率

在这里插入图片描述在这里插入图片描述
5、读写数据位和应答信号
写数据:0 读数据:1
应答信号位:由从机发出

在这里插入图片描述
6、停止信号

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将STM32F103C8T6连到LCD1602(I2C),需要进行以下步骤: 1. 硬件:将STM32F103C8T6的SCL引脚连到LCD1602的SCL引脚,将STM32F103C8T6的SDA引脚连到LCD1602的SDA引脚。同时,将STM32F103C8T6的VCC引脚连到LCD1602的VCC引脚,将STM32F103C8T6的GND引脚连到LCD1602的GND引脚。 2. 软件配置:在STM32F103C8T6的开发环境中,打开I2C总线的相关配置。配置I2C总线的主设备地址和时钟频率等参数。 3. 初始化LCD1602:使用相应的库文件或编写代码初始化LCD1602。初始化过程中,需要对LCD1602发送一系列命令来设置显示模式、光标等。 4. 发送数据:使用I2C总线将要显示的数据发送给LCD1602。将数据传输到I2C总线发送缓冲区,然后通过I2C总线发送给LCD1602。 5. 显示内容:通过发送特定的命令,控制LCD1602显示数据、光标等内容。 需要注意的是,在进行连和操作过程中,要仔细检查引脚连是否准确,确保电路正确。另外,对于STM32F103C8T6和LCD1602的I2C通信协议需按照具体的硬件规格手册进行配置和操作。 ### 回答2: 连STM32F103C8T6和LCD1602(I2C)需要使用I2C(Inter-Integrated Circuit)总线进行通信。下面是连步骤: 步骤1:硬件 将STM32F103C8T6的PB6引脚连到LCD1602的串行数据(SDA)引脚。 将STM32F103C8T6的PB7引脚连到LCD1602的串行时钟(SCL)引脚。 在STM32F103C8T6和LCD1602之间连电源和地线。 步骤2:配置I2C总线 打开STM32CubeIDE(或其他STM32开发环境)创建一个新工程。 在工程中选择正确的STM32F103C8T6型号和I2C外设。 配置I2C总线的时钟速度和其他参数。 步骤3:编写代码 在主函数中初始化I2C总线。 设置LCD1602的I2C地址。 发送初始化命令以配置LCD1602。 通过I2C发送数据和命令以在LCD屏幕上显示字符和执行其他操作。 步骤4:编译和下载 编译项目并生成可执行文件。 使用烧录器将可执行文件下载到STM32F103C8T6开发板上。 步骤5:运行 上电并运行程序,STM32F103C8T6将通过I2C总线与LCD1602进行通信,并在屏幕上显示字符等信息。 以上是连STM32F103C8T6和LCD1602(I2C)的基本步骤。请记得根据实际情况进行适当调整和修改。 ### 回答3: 连STM32F103C8T6与LCD1602(I2C)涉及以下几个方面: 1. 硬件: 首先,将STM32F103C8T6的VCC引脚连到LCD1602的VCC引脚,将GND引脚连到GND引脚。 然后,将STM32F103C8T6的PB8引脚连到LCD1602的SDA引脚,将PB9引脚连到LCD1602的SCL引脚。 最后,将STM32F103C8T6的VCC引脚通过一个10K电阻连到LCD1602的VCC引脚,以供电源。 2. 软件配置: 在编程环境中打开STM32F103C8T6的工程,进入配置选项。 启用I2C模块并将其配置为合适的速率(如100kHz)。 配置GPIO引脚PB8和PB9作为I2C外设功能,并选择合适的I2C引脚映射。 在编程代码中包含I2C和LCD1602的库函数。 3. 编写代码: 初始化I2C模块,设置I2C的地址、速率等参数。 初始化LCD1602,设置数据线、显示模式、光标等参数。 编写LCD1602显示内容的函数。 在主函数中调用LCD1602显示函数,实现特定的显示效果。 4. 测试与调试: 烧录程序到STM32F103C8T6开发板上,确保连正确。 打开电源,观察LCD1602是否显示预期的内容。 如有需要,进行调试并修正代码或硬件。 通过以上步骤,STM32F103C8T6可以成功连到LCD1602(I2C),并能够通过编程控制LCD1602显示所需的内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值