STM32CubeIDE HAL库操作IIC (一)配置篇

2023-11-09

目录

一、MX配置

使能中断(可选):

DMA设置(可选):

二、生成的代码

三、IIC通信的三种方式(Polling、IT、DMA)(代码源自官方例程)

1、Polling (常用)

2、IT(开启中断,接收到数据时会调用回调函数)

3、DMA模式(回调函数同中断)

四、对IIC从设备的寄存器操作(适用于SHT21、MPU6050、AT24C02等)


一、MX配置

标准模式,100KHz时钟,7位地址

 

使能中断(可选):

DMA设置(可选):

 

二、生成的代码

初始化函数

底层初始化

确定了引脚为开漏模式、时钟、DMA以及开启EV中断。

三、IIC通信的三种方式(Polling、IT、DMA)(代码源自官方例程)

1、Polling (常用)

//主机模式发送  
/* Timeout is set to 10S */
  while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 10000)!= HAL_OK)
  {
    /* Error_Handler() function is called when Timeout error occurs.
       When Acknowledge failure occurs (Slave don't acknowledge its address)
       Master restarts communication */
    if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    {
      Error_Handler();
    }
  }

//主机模式接收
/* Timeout is set to 10S */ 
  while(HAL_I2C_Master_Receive(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t *)aRxBuffer, RXBUFFERSIZE, 10000) != HAL_OK)
  {
    /* Error_Handler() function is called when Timeout error occurs.
       When Acknowledge failure occurs (Slave don't acknowledge it's address)
       Master restarts communication */
    if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    {
      Error_Handler();
    }
  }

//从机模式接收
/* Timeout is set to 10S  */
  if(HAL_I2C_Slave_Receive(&hi2c1, (uint8_t *)aRxBuffer, RXBUFFERSIZE, 10000) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }
  
//从机模式发送
  /* Timeout is set to 10S */
  if(HAL_I2C_Slave_Transmit(&hi2c1, (uint8_t*)aTxBuffer, TXBUFFERSIZE, 10000)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();    
  }

//错误回调函数
/**
  * @brief  I2C error callbacks.
  * @param  I2cHandle: I2C handle
  * @note   This example shows a simple way to report transfer error, and you can
  *         add your own implementation.
  * @retval None
  */
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *I2cHandle)
{
  //
}

2、IT(开启中断,接收到数据时会调用回调函数)

//主机模式中断发送
/* While the I2C in reception process, user can transmit data through 
    "aTxBuffer" buffer */
    if(HAL_I2C_Master_Transmit_IT(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
    {
      /* Error_Handler() function is called in case of error. */
      Error_Handler();
    }
/*##-3- Wait for the end of the transfer ###################################*/
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {
    }

//主机模式中断接收
if(HAL_I2C_Master_Receive_IT(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
    {
      /* Error_Handler() function is called in case of error. */
      Error_Handler();
    }

//主机模式发送回调函数
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
//
}
//主机模式接收回调函数
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
//
}

//从机模式中断接收
 if(HAL_I2C_Slave_Receive_IT(&hi2c1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();
  }
  
  /*##-3- Wait for the end of the transfer ###################################*/  
  while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
  {
  }

//从机模式中断发送
  /*##-4- Start the transmission process #####################################*/  
  /* While the I2C in reception process, user can transmit data through 
     "aTxBuffer" buffer */
if(HAL_I2C_Slave_Transmit_IT(&hi2c1, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();    
  }


//从机模式发送回调函数
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
//
}
//从机模式接收回调函数
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
//
}

3、DMA模式(回调函数同中断)

//主机模式DMA发送
while(HAL_I2C_Master_Transmit_DMA(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
  {
    if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    {
      Error_Handler();
    }
  }
  /*##-3- Wait for the end of the transfer ###################################*/  
  while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);

//主机模式DMA接收
while(HAL_I2C_Master_Receive_DMA(&hi2c1, (uint16_t)I2C_ADDRESS, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    {
      Error_Handler();
    }
  }

//从机模式DMA发送
  if(HAL_I2C_Slave_Receive_DMA(&hi2c1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {

    Error_Handler();
  }
  while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
//从机模式DMA接收
  if(HAL_I2C_Slave_Transmit_DMA(&hi2c1, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
  {
    /* Transfer error in transmission process */
    Error_Handler();    
  }
  while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);

四、对IIC从设备的寄存器操作(适用于SHT21、MPU6050、AT24C02等)

下面对库函数的操作做了一次封装,函数前还可以加上 __STATIC_INLINE

I2C_Addr 器件地址,例如MPU6050为0xd0

reg 寄存器地址,例如陀螺仪配置寄存器 0x1B

data 操作数,例如操作陀螺仪配置寄存器数值0x18,开启满量程

*buf 读取数存储地址指针

uint8_t HALIIC_WriteByteToSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t data)
{
  uint8_t  *pData;
  pData = &data;
  return HAL_I2C_Mem_Write(&hi2c1, I2C_Addr, reg, I2C_MEMADD_SIZE_8BIT, pData, 1, 100);
}
uint8_t HALIIC_ReadByteFromSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t *buf)
{
  return HAL_I2C_Mem_Read(&hi2c1, I2C_Addr, reg, I2C_MEMADD_SIZE_8BIT, buf, 1, 100);
}

uint8_t HALIIC_ReadMultByteFromSlave(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data)
{
  return HAL_I2C_Mem_Read(&hi2c1, dev, reg, I2C_MEMADD_SIZE_8BIT, data, length, 200);
}
uint8_t HALIIC_WriteMultByteToSlave(uint8_t dev, uint8_t reg, uint8_t length, uint8_t* data)
{
  return HAL_I2C_Mem_Write(&hi2c1, dev, reg, I2C_MEMADD_SIZE_8BIT, data, length, 200);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeIDE HAL库操作IIC (一)配置篇 的相关文章

  • 谷歌邮箱账号不会注册?注册失败?这份完美注册教程请收好

    谷歌邮箱相信大家都不陌生吧 无论是用于发送和接收邮件 还是用于在国外网站注册 很多人都离不开谷歌邮箱 甚至 一些网站直接提供谷歌邮箱登录选项 这就是为什么很多跨境人想要注册谷歌邮箱的原因 但是 大部分网友都无法自己完整注册 今天来做一篇完整

随机推荐

  • 【AI赋能】人工智能在自动驾驶时代的应用

    自我介绍 我是秋说 研究 人工智能 大数据 等前沿技术 传递 Java Python 等语言知识 主页链接 秋说的博客 学习专栏推荐 人工智能 创新无限 MySQL进阶之路 C 刷题集 网络安全攻防姿势总结 从0开始 深度掌握 C程序设计
  • MATLAB将数据存在TXT文件中

    记录结果 将数据保存到txt文件中 fid fopen 结果记录 txt a 结果记录 txt是存储数据的文件 a是数据向后增加的意思 fprintf fid f t hz f t是将数据往同一行的后面存 fprintf fid f n z
  • 2020.11.1

    1 登录业务的完善 1 1后端控制页面跳转 if rs next System out println 登陆成功 request setAttribute name username request getRequestDispatcher
  • JAVA经典兔子问题

    有一对兔子 从出生第三个月起每个月都生一对兔子 小兔子长到第三个月后 每个月又生一对兔子 假如兔子都不死 问M个月时兔子的数量 很经典的斐波那契数列问题 记得第一次看到这道题是在一次比赛中 当时并不知道斐波那契数列 但是列出来几个月的兔子数
  • SQL 数据库中如何自动生成订单号

    有一张表TAB1 字段num num里有很多数字 我想从1开始 查到里面缺少的最小的一个数字 例如 4 5 6 8 9 11 12 13 这样的话我想要的结果是1 1 2 3 4 5这样的话 我想要的结果是6 其实利用正常排序的找第一个不正
  • open3d操作.ply文件(点云)

    读取 ply文件 import open3d as o3d pcd o3d io read point cloud ply path format ply ppoints np asarray pcd points pcolors np a
  • Ubuntu20.04编译安装openpose使用pythonAPI

    目录 项目地址 环境 准备 开始编译 项目地址 https github com CMU Perceptual Computing Lab openpose 环境 系统 ubuntu20 04 cuda 11 2 GPU 3090 2 Dr
  • 第一款中国人自主研发的普及型计算机高级编程语言

    最近有了比较大的技术突破 可以实现快速的开发环境了 我之前的计划一直是解析脚本来实现迈欧网的开发环境 有了这个技术 虽然是高级语言 但是却不会丧失性能 达到C 等语言的速度 甚至更快 希望朋友们支持我 你们的支持是我不间断开发此产品的动力
  • muduo启程

    muduo启程 muduo 是一个基于 Reactor 模式的现代 C 网络库 它采用非阻塞 IO 模型 基于事件驱动和回调 原生支持多核多线程 适合编写 Linux 服务端多线程网络应用程序
  • 使用广度优先搜索查找图中路径(java)

    package breadthfirstpaths import edu princeton cs algs4 Graph import edu princeton cs algs4 Queue import edu princeton c
  • Android四大组件之service(二)

    在 Android四大组件之service 一 文中我们讲到了 service 的 基本概念 和 startService 启动方式 stopService 不过这种方式是有个缺点 我们无法调用 FirstService 类里面的方法 这个
  • webStrom智能提示忽略首字母大小写问题

    Settings gt Editor gt Ceneral gt Code Completion gt Case sensitive completion 设置为None
  • vuex中的mutations的两种调用方法

    直接通过 store commit调用
  • Ubuntu14.04 安装ffmpeg

    一 xvid x264 ffmpeg源码下载 链接 https pan baidu com s 13phSFrLqkGrKDGF3 a2cSA 提取码 ls2s 二 安装 1 xvid tar zxvf xvidcore 1 3 3 tar
  • 一文带你看懂Spring事务!

    点击上方 方志朋 选择 设为星标 做积极的人 而不是积极废人 前言 Spring事务管理我相信大家都用得很多 但可能仅仅局限于一个 Transactional注解或者在XML中配置事务相关的东西 不管怎么说 日常可能足够我们去用了 但作为程
  • 677. 键值映射

    实现一个 MapSum 类 支持两个方法 insert 和 sum MapSum 初始化 MapSum 对象 void insert String key int val 插入 key val 键值对 字符串表示键 key 整数表示值 va
  • 面试之计算机网络

    计算机网络 1 路由选择协议 常见的路由选择协议有 RIP协议 OSPF协议 RIP协议 底层是贝尔曼福特算法 它选择路由的度量标准 metric 是跳数 最大跳数是15跳 如果大于15跳 它就会丢弃数据包 OSPF协议 底层是迪杰斯特拉算
  • IDEA 设置默认Maven的路径

    文件 新项目设置 构建工具 Maven 修改主路径
  • linux调整queue_depth,linux – 无法编辑/ sys / block / sdX / device / queue_depth文件

    我正在尝试使用以下命令增加SSD的队列深度值 echo 64 gt sys block sda device queue depth 但是我收到以下错误 bash echo write error Invalid argument 我尝试使
  • STM32CubeIDE HAL库操作IIC (一)配置篇

    目录 一 MX配置 使能中断 可选 DMA设置 可选 二 生成的代码 三 IIC通信的三种方式 Polling IT DMA 代码源自官方例程 1 Polling 常用 2 IT 开启中断 接收到数据时会调用回调函数 3 DMA模式 回调函