STM32基于CubeMX与HAL库的I2C应用

这篇具有很好参考价值的文章主要介绍了STM32基于CubeMX与HAL库的I2C应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. I2C协议

1.1 物理层

        I2C协议和摩托罗拉公司的SPI协议一样,是一种通讯协议。串行外围设备接口,是一种高速全双工的通信总线,是由 Phiilps 公司开发的。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

        I2C(Inter-Integrated Circuit),也可以叫IIC、I2C,译作集成电路总线,是两线式串行通信总线,用于设备间的通讯等,标准情况下最高传送速率达100Kbps。顾名思义,I2C通讯只需要两根线,一根是数据线SDA(Serial Data Line),一根是时钟线SCL(Serial Clock Line)。主设备控制时钟线决定I2C的波特率,配合数据线进行数据的传输,这两根线分别通过上拉电阻连接到电源。

STM32基于CubeMX与HAL库的I2C应用,stm32,嵌入式硬件,单片机

1.2 信号  

  • 空闲状态:I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
  • 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。
  • 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。
STM32基于CubeMX与HAL库的I2C应用,stm32,嵌入式硬件,单片机
起始信号与停止信号

如何通俗地理解起始信号和停止信号呢?

        我们可以把SDA当作一个单刀单掷的开关,把开关放下去(就是SDA由高到低的过程),SDA和SCL就接通了,就可以看成是开始(起始)。反之,把开关抬起来(就是SDA由低到高的过程),SDA和SCL就断开了,就可以看成是结束(停止)。

  • 应答信号ACK

        发送器每发送一个字节(8位),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接受了该字节(就是说当已经接收完第八位信号的时候,也就是已经完整接收一个字节了,就要开始把SDA数据线下拉了);应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

STM32基于CubeMX与HAL库的I2C应用,stm32,嵌入式硬件,单片机

 1.3 数据传输 

        在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。

IIC读写过程

STM32基于CubeMX与HAL库的I2C应用,stm32,嵌入式硬件,单片机

        首先主机会产生一个起始信号,开始数据的传输。然后主机向从机发送地址位和读写位0(因为要确定哪个从机以及做什么操作),应答成功后,就会开始发送数据,从机会根据接收到的数据返回有效应答或者无效应答,直到主机产生停止信号,就表示这段传输结束了。

2. CubeMx的相关配置与相关代码

2.1 CubeMx配置

时钟树配置这里就忽略了哦~(我的单片机型号是STM32G473VET6)

STM32基于CubeMX与HAL库的I2C应用,stm32,嵌入式硬件,单片机 

传输速率根据工程的需要自己选择,最高可以到1MHz 

2.2 重要函数

2.2.1 写数据
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout);
- 功能: 写数据
- 参数:
  *hi2c      设置使用的是那个IIC 例:&hi2c1
  DevAddress 写入的地址 设置写入数据的地址 例:0xA0
  *pData     需要写入的数据
  Size       需要发送的字节数
  Timeout    最大传输时间,超过传输时间将自动退出传输函数
  
  // 发送两个字节数据,IIC写数据函数
- 例如:HAL_I2C_Master_Transmit(&hi2c1,0xA0,(uint8_t*)TxData,2,1000);
2.2.2 接收数据 
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout);
- 功能: 接收数据
- 参数:
  *hi2c      设置使用的是那个IIC 例:&hi2c2
  DevAddress 写入的地址 设置写入数据的地址 例:0xA0
  *pData     存储读取到的数据
  Size       需要发送的字节数
  Timeout    最大传输时间,超过传输时间将自动退出传输函数
2.2.3 写多个数据 
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
- 功能:IIC写多个数据,该函数适用于IIC外设里面还有子地址寄存器的地址,比如E2PROM,除了
       设备地址,每个存储字节都有其对应的地址。
- 参数:
  *hi2c      设置使用的是那个IIC 例:&hi2c2
  DevAddress 写入的地址 设置写入数据的地址 例:0xA0
  MemAddress 从机寄存器地址,每写入一个字节数据,地址就会自动+1
  MemAddSize 从机寄存器地址字节长度 8位/16位
             写入数据的字节类型 8位/16位
             I2C_MEMADD_SIZE_8BIT
             I2C_MEMADD_SIZE_16BIT
  *pData     需要写入的数据的起始地址
  Size       传输数据的大小,需要发送的字节数
  Timeout    最大传输时间,超过传输时间将自动退出传输函数
- 例如:HAL_I2C_Mem_Write(&hi2c1,ADDR,i,I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8,1000);
2.2.4 MX生成的初始化函数 
/**
  * @brief I2C1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_I2C1_Init(void)
{
  hi2c1.Instance = I2C1;     //句柄
  hi2c1.Init.ClockSpeed = 100000;  //时钟速度
  hi2c1.Init.DutyCycle =。I2C_DUTYCYCLE_2;   //I2C的SCL线时钟的占空比
  hi2c1.Init.OwnAddress1 = 0;    //I2C设备的地址。地址可设置为7位或10位。
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;  //7位寻址模式
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0; 
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }

}


结束,作者水平有限,希望各位发现有错之后及时指正,谢谢

如果喜欢作者的文章,记得点赞收藏关注哦!文章来源地址https://www.toymoban.com/news/detail-832024.html

到了这里,关于STM32基于CubeMX与HAL库的I2C应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【STM32】AT24C256硬件I2C读写,基于HAL库

    目录 一、简单介绍 二、配置工程 打开CubeMX,配置时钟,调试接口,工程名,目录等 配置iic 配置串口用于显示信息 三、硬件连接 四、代码编写 一、随机写入一个字节 测试代码 波形如下 代码编写 二、连续写入 代码如下 三、随机读取 测试代码 波形如下 代码编写 四、连续

    2024年02月03日
    浏览(19)
  • STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 相关篇针对AT24C32及以上容量《STM32基于STM32-HAL工程硬件I2C读取AT24Cxx数据》 🎯本工程使用STM32F103VE+AT24C02实

    2023年04月11日
    浏览(15)
  • 4针0.96寸OLED的HAL库代码(硬件I2C/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

    一、HC-SR04超声波模块的使用 二、4针OLED的HAL库代码介绍及使用(本篇) 三、7针OLED的HAL库代码介绍及使用 四、编码电机以及双电机驱动 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 ----- B站 @想要亿只独角兽 --------😐 之前在做一些小项目时用到了OLED,到

    2024年02月10日
    浏览(14)
  • STM32 HAL库函数学习 I2C篇

    本篇内容讲述STM32的硬件IIC功能。硬件IIC的使用在F1系列上可能会有问题。本次使用的测试平台是H7,用于AT24C02芯片的读写正常,暂不清楚在其他芯片上使用是否正常。 1、HAL_StatusTypeDef HAL_I2C_Init (I2C_HandleTypeDef * hi2c) I2C初始化函数,使用CubeMx生成。需要选中I2C硬件指定的IO口。

    2023年04月08日
    浏览(13)
  • STM32 HAL FreeRTOS 硬件I2C 使用

    因为某个项目想要颜色识别,去识别球的颜色,但是又不想多来个摄像头,所以想尝试一下颜色传感器的方案。但是经过尝试,HAL库生成的 FreeRTOS 硬件 I2C 读写一直在报错。 刚好手头上有九轴陀螺仪的例程代码。最后用FreeRTOS 硬件 I2C 读取数据。 这里提到了阻塞式 HAL 函数(

    2024年02月20日
    浏览(19)
  • 【STM32 CubeMX】I2C中断方式与DMA方式

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需

    2024年02月20日
    浏览(17)
  • STM32之I2C总线知识和HAL库函数

    一、 I2C总线知识 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接

    2024年02月21日
    浏览(19)
  • STM32设置为I2C从机模式(HAL库版本)

    我之前出过一篇关于STM32设置为I2C从机的博客,现在应粉丝要求,出一篇HAL库版本的I2C从机编程。 基于官方库版本的可以看下我之前发的文章:STM32设置为I2C从机模式 测试芯片:STM32F103RCT6 测试方法:用一个USB转I2C的工具接到STM32的I2C引脚上,通过上位机工具进行读写操作。如

    2024年02月12日
    浏览(19)
  • STM32 HAL库硬I2C的TOF050C模块

    最近在倒腾毕业设计,需要用到TOF050C,但是现有的案例都是软IIC,并且还是基于STM32F103的,笔者用的STM32F767,没有GPIO-CRH寄存器。问题来了,如果我每次都要去看寄存器手册属实费时间,这不干脆直接用硬IIC? 于是乎,打开了TOF050C手册,硬啃! 这手册好在它有工作流程图,

    2024年02月14日
    浏览(21)
  • 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日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包