第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程

这篇具有很好参考价值的文章主要介绍了第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程

前言

本章将讲解stm32通讯协议中的IIC协议,利用cubeMX完成软件和硬件IIC的实现,并结合实验数据,给人更为深刻的体验。
我们结合IIC的具体协议和逻辑分析仪得到的具体实验数据理解IIC协议。

IIC概述

I2C通讯协议是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

llC: Inter Integrated Circuit,集成电路总线,是一种同步串行半双工通信总线。其中同步说明这种通信方式需要时钟线;串行说明数据一位一位(一个字节8位即0000 0000)在一个数据线上朝一个方向发送;半双工说明一个时间只能进行接收或者发送;总线就是传输数据的通道,如果有多个设备想使用总线进行传输数据多个都需要挂载在总线上,注意在总线上可以有多个主机,多个从机;协议则是传输数据的规则,首先我们讲解该协议。

IIC物理层

第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

如图所示,即位IIC的物理层,由图可明显看到所有的设备挂载在,两条l2C总线下,一条双向串行数据线(SDA)用来传递数据,一条串行时钟线(SCL)用于数据收发同步。总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
要点

  • IIC总线协议是一个支持多设备的总线。在一个l2C通讯总线中,如图,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
  • 多个设备并不是指无限多个,连接到相同总线的IC数量要受到总线的最大电容400pF限制。
  • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的通信。
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  • 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s,高速模式3.4Mbit/s,但目前大多/2C设备尚不支持高速模式。

IIC协议层

I2C协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。接下来我们将逐个进行实验。

IIC读写概述

主机写入到从机的基本过程,如图所示。由主机发出起始信号表示开始通信,然后发送从机地址及数据传输方向,然后释放总线(总线上有上拉电阻,总线拉高即为释放总线)交给从机,得到从机应答ACK或非应答NACK,紧接着进行数据的接收或者数据传输的终止。
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

实验结果
结果如图所示。
接下来进行具体讲解,各个信号如何产生、代码实现、实验反馈。

起始、停止信号及代码

理论说明
如图所示
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

  • 起始:当SCL线是高电平时,SDA线从高电平向低电平切换。

  • 停止:当SCL是高电平时,SDA线由低电平向高电平切换。

代码实现
代码如下(示例):

void I2C_SCL_1()//SCL电平拉高
{
    HAL_GPIO_WritePin(GPIO_PORT_I2C, I2C_SCL_PIN, GPIO_PIN_SET);
}
void I2C_SCL_0()
{
    HAL_GPIO_WritePin(GPIO_PORT_I2C, I2C_SCL_PIN, GPIO_PIN_RESET);
}
void I2C_SDA_1()
{
    HAL_GPIO_WritePin(GPIO_PORT_I2C, I2C_SDA_PIN, GPIO_PIN_SET);
}
void I2C_SDA_0()
{
    HAL_GPIO_WritePin(GPIO_PORT_I2C, I2C_SDA_PIN, GPIO_PIN_RESET);
}
static void i2c_Delay(void)
{
	uint8_t i;
	for (i = 0; i < 10; i++);
}
void i2c_Start(void)
{
	/* 当SCL线是高电平时,SDA线从高电平向低电平切换。*/
	I2C_SDA_1();
	I2C_SCL_1();
	i2c_Delay();
    
	I2C_SDA_0();
	i2c_Delay();
    
	I2C_SCL_0();
	i2c_Delay();
}
void i2c_Stop(void)
{
	/* 当SCL是高电平时,SDA线由低电平向高电平切换 */
	I2C_SDA_0();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SDA_1();
}

实验验证
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

数据有效性及代码

理论说明
如图所示
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每个时钟周期传输一位数据。

SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。
当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。
代码实现
这个代码函数功能是读取一个字节的数据,利用for循环依次读取8位数据。

#define I2C_SDA_READ   HAL_GPIO_ReadPin(GPIO_PORT_I2C, I2C_SDA_PIN)

uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;

	value = 0;
	for (i = 0; i < 8; i++)
	{
		value <<= 1;
		I2C_SCL_1();
		i2c_Delay();
		if (I2C_SDA_READ)
		{
			value++;
		}
		I2C_SCL_0();
		i2c_Delay();
	}
	return value;
}

这个代码函数功能是发送一个字节的数据,利用for循环依次发送8位数据。

void i2c_SendByte(uint8_t oneByte)
{
	uint8_t i;

	/* 数据由高位到低位依次发送 */
	for (i = 0; i < 8; i++)
	{		
		if (oneByte& 0x80)
		{
			I2C_SDA_1();//判断为1发送1
		}
		else
		{
			I2C_SDA_0();
		}
		i2c_Delay();
		I2C_SCL_1();
		i2c_Delay();	
		I2C_SCL_0();
		if (i == 7)
		{
			 I2C_SDA_1(); //发送完成后释放总线等待应答
		}
		oneByte<<= 1;	/* 左移做下一次判断*/
		i2c_Delay();
	}
}

实验验证
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

响应ACK及代码

理论说明
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。
应答信号:主机SCL拉高,读取从机SDA的电平,为低电平表示产生应答。应答信号为低电平时,规定为有效应答(ACK),表示已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),表示接收该字节失败。

传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

代码实现
该代码实现包括三个函数,第一个函数为产生应答信号,第二函数为产生非应答信号,第三个函数为判断应答。第一、二个函数如上述所示,第三个函数需要注意在读取ACK/NACK信号时先进行释放总线,即将SDA总线拉高交给其他需要响应的设备控制。

void i2c_Ack(void)
{
	I2C_SDA_0();
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();//应答信号为低电平时,规定为有效应答(ACK)
	I2C_SDA_1();
}
void i2c_NAck(void)
{
	I2C_SDA_1();
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
	I2C_SCL_0();
	i2c_Delay();	
}
uint8_t i2c_WaitAck(uint16_t timeout)
{
	uint8_t re,ucErrTime=0;

	I2C_SDA_1();//释放SDA总线
	i2c_Delay();
	I2C_SCL_1();
	i2c_Delay();
    while(I2C_SDA_READ)//等待ACK//NACK
    {
        re = 0;
        ucErrTime++;
        if(ucErrTime>timeout)
        {
            return re;
        }
        else re = 1;
    }
	I2C_SCL_0();
	i2c_Delay();
	return re;
}

实验验证
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机

地址及数据方向

I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。
紧跟设备地址的一个数据位R/W用来表示数据传输方向,数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
以EEPROM 24C01为例,其地址如图所示。
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机
第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-812635.html

到了这里,关于第五章 stm32 cubemx 软件I2C实验以及EEPROM的使用理论及实验过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32CubeMX+HAL库】I2C详解+读写EEPROM

    在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用。但是在我们的HAL库中,对硬件IIC做了全新的优化,使得之前软件IIC几百行代码,在HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处。 通过本篇博客您将

    2024年02月03日
    浏览(24)
  • STM32配合cubeMX硬件I2C驱动0.96寸OLED

    目录 一、简单介绍 1.1   OLED 1.2   I2C协议 二、实战 2.1 工程配置 2.2 测试工程 2.3 波形分析 三、驱动OLED 3.1 初始化代码 3.2 清屏函数 3.3 设置坐标函数 3.4 显示字符函数 3.5 显示字符串函数 3.6 显示图片函数 附录 驱动代码文件 oled.c oled.h f6x8.h 有机发光二极管 (英语:Organic

    2024年02月08日
    浏览(20)
  • STM32完成软件I2C通讯

    今天的重点是利用STM32的软件方案和MPU60506轴姿态传感器建立通讯,今天只完成了简单的发送地址和接收应答的部分,特此记录一下过程,以后忘记可以随时翻出来看看。 先介绍最基本的I2C通讯的最基本的6个时序: 一:起始条件:SCL高电平期间,SDA从高电平切换到低电平 时

    2024年04月13日
    浏览(15)
  • 【STM32】软件I2C控制频率

    在上一篇文章中,我们已经介绍了整个软件I2C的实现原理,但是也遗留了一个问题,那就是I2C速率的控制,其实就是控制SCL信号的频率。 微秒级延时 在上篇文章中,我们使用了SysTick进行延时,具体如下: 关于SysTick延时的原理,可以参考这篇文章 HAL库下的systick 底层配置

    2024年02月11日
    浏览(22)
  • 【stm32】软件I2C读写MPU6050

    概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后,再建立MPU6050的.c和.h模块 基于I2C通信的模块,来实现指定地址读、指定地址写 再实现写寄存器对

    2024年04月26日
    浏览(22)
  • STM32软件I2C驱动MPU6050

    这里没有什么复杂的地方,采用MPU6050的现成模块.模块的SCL接B10,SDA接B11,这里连接了一个OLED显示屏,用于显示获取到的数据. 注意:这里使用的模块自带上拉电阻 首先在工程目录里创建: \\\"MyI2C.h\\\"和\\\"MyI2C.c\\\"文件,用于软件驱动I2C. \\\"MPU6050.h\\\",\\\"MPU6050.c\\\"和\\\"MPU6050Reg.h\\\"文件,用于MPU6050的驱动. 在

    2024年02月15日
    浏览(18)
  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(22)
  • 【STM32】STM32学习笔记-软件I2C读写MPU6050(33)

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

    2024年01月21日
    浏览(20)
  • STM32软件模拟I2C从机的实现方法

    在使用I2C通信时,一般会用到软件模拟I2C。目前网络上能搜索到的软件模拟I2C一般都是模拟I2C主机,很少有模拟I2C从机的例程。由于I2C主机在进行数据收发时,有明确的可预见性,也就是主机明确知道什么时候要进行数据的收发操作,而且I2C的同步时钟信号也是由主机产生的

    2024年02月01日
    浏览(15)
  • 【STM32】软件I2C的使用 —— 看这一篇就够了(附代码)

    欢迎来到我的博客。今天我想向大家介绍一下STM32软件I2C功能。 首先,让我们来了解一下I2C(Inter-Integrated Circuit)总线。I2C是一种串行通信总线,最初由Philips公司开发。它允许多个设备使用同一条总线进行通信,并且每个设备都有唯一的地址。I2C通常用于连接微控制器、传感

    2024年02月06日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包