1.I2C协议介绍

I2C是一个支持多设备的总线,可连接多个I2C通讯设备,每个总线包括一条双向串行数据线(SDA)和一条串行时钟线(SCL)。数据线用来表示数据,时钟线用来数据收发同步。通讯过程如下:

S:主机的I2C接口产生的传输开始信号,连接在I2C总线上的所有从机都会接收到。

SLAVE_ADDRESS:主机广播的从机地址信号,I2C总线上每个从机地址唯一。

R/W:读写方向,置1为读,置0为写。

A/A-:从机接收到匹配的地址后,主机或从机会返回一个应答信号或非应答信号,只有接收到应答信号主机才继续发送接收数据。写数据的时候,每次发送一个字节数据(DATA:8位)后,都要等待应答信号,重复这个过程可以发送N个数据。数据传输结束发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。

起始信号和停止信号见上图。

数据有效性见上图。

2.基于HAL库的I2C配置

步骤:时钟使能—GPIO管脚配置—I2C配置

初始化:

void MyI2C_Init(void){__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);//I2C_SCL configGPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);//I2C_SDA config__HAL_RCC_I2C1_CLK_ENABLE();I2C_HandleTypeDef  MyI2C1;MyI2C1.Instance=I2C1;MyI2C1.Init.Timing=0x60201E2B;//100KHzMyI2C1.Init.OwnAddress1=0;MyI2C1.Init.AddressingMode=I2C_ADDRESSINGMODE_7BIT;MyI2C1.Init.DualAddressMode=I2C_DUALADDRESS_DISABLE;MyI2C1.Init.OwnAddress2=0;MyI2C1.Init.OwnAddress2Masks=I2C_OA2_NOMASK;MyI2C1.Init.GeneralCallMode=I2C_GENERALCALL_DISABLE;MyI2C1.Init.NoStretchMode=I2C_NOSTRETCH_DISABLE;MyI2C1.Mode=HAL_I2C_MODE_MASTER;HAL_I2C_Init(&MyI2C1);
}

输入输出函数:

阻塞模式:

HAL_I2C_Master_Transmit();   HAL_I2C_Master_Receive();  HAL_I2C_Slave_Transmit();  HAL_I2C_Slave_Receive()
HAL_I2C_Mem_Write();       HAL_I2C_Mem_Read();    HAL_I2C_IsDeviceReady()

带中断非阻塞模式:

HAL_I2C_Master_Transmit_IT();    HAL_I2C_Master_Receive_IT();  HAL_I2C_Slave_Transmit_IT()
HAL_I2C_Slave_Receive_IT();    HAL_I2C_Mem_Write_IT();       HAL_I2C_Mem_Read_IT()

DMA传输非阻塞模式:

HAL_I2C_Master_Transmit_DMA();   HAL_I2C_Master_Receive_DMA();   HAL_I2C_Slave_Transmit_DMA();    HAL_I2C_Slave_Receive_DMA();    HAL_I2C_Mem_Write_DMA();      HAL_I2C_Mem_Read_DMA()

非阻塞模式下的回调函数:

HAL_I2C_MemTxCpltCallback();   HAL_I2C_MemRxCpltCallback();    HAL_I2C_MasterTxCpltCallback()
HAL_I2C_MasterRxCpltCallback();  HAL_I2C_SlaveTxCpltCallback(); HAL_I2C_SlaveRxCpltCallback();   HAL_I2C_ErrorCallback()

这部分可以参照USART中的函数进行理解。

14-HAL库之I2C通信相关推荐

  1. I2C协议介绍以及HAL库实现I2C对SHT30温湿度采样

    文章目录 1- I2C协议介绍 (1)I2C协议简介 (2)I2C从设备地址 2- I2C通信时序 (1)起始位 (2)读写地址 (3)I2C应答信号 (4)数据位发送与接收 3- I2C协议主机收发 ...

  2. 【STM32】HAL库——串口DMA通信(三)

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) 关于DMA 1. 什么是DMA? DMA(Direct Memory Access,直接存储器访问) ...

  3. DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信

    本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...

  4. uart串口通信_听说UART与STM32的HAL库更配哦

    摘要:HAL库(Hardware Abstraction Layer)是目前意法半导体公司主推的单片机开发方式,可以大大节省开发时间,实践来看,还是比较好用的.本文通过一个简单的UART收发程序,演示 ...

  5. 【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验

    [HAL库]STM32CubeMX开发----STM32F407----目录 [HAL库]STM32F407----CAN通信----基本原理 [HAL库]STM32F407----CAN通信---- ...

  6. DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动

    系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...

  7. stm32使用hal库向电脑发送数据

    文章目录 USART 几种协议(可跳过) 实验目的与材料 实验目的 实验材料 软件 硬件连接 HAL库项目创建 1.点击ACCESS TO MCU SELECTOR 2.选择芯片类型 3.可视化配置U ...

  8. HAl库PCA9685基于I2C通信

    写这篇文章的目的主要是为了记录一下我在接触PCA9685时遇到的一些问题. 首先我在学习别人的文章时看到了很多开头初始化PCA,其实主要目的都是为了设置他的频率为50HZ,所以为了简洁方便,这里我的代 ...

  9. MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600

      MT6701是麦歌恩(MagnTek)公司的磁性角度传感器芯片,提供14Bit 0~360°单圈绝对角度检测,拥有 ABZ/PWM/模拟量/I2C/SSI 等多种信息输出方式,还可根据磁场强度的瞬 ...

最新文章

  1. Java中List高效去重
  2. pytorch微调bert_北大、人大联合开源工具箱UER,3 行代码完美复现BERT、GPT
  3. oracle linux 双机,oracleforlinux双机热备实战完全手册
  4. Windows环境下通过Git来管理自己的Android代码
  5. java开发简历编写_如何通过几个简单的步骤编写出色的初级开发人员简历
  6. 奖学金设计mysql_基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)
  7. jdk-14.0.2_linux-x64_bin.tar.gz
  8. matlab实验符号计算答案,2014秋实验四_MATLAB的符号计算二答案
  9. 【系列一之爬虫系列】爬取信息
  10. 80端口被system占用解决过程
  11. Java从入门到精通(视频教程+源码)
  12. 2011戴尔计算机配置,机型与配置(一)
  13. 最全面的 Spring 学习笔记
  14. 伍斯特理工学院计算机科学硕士,美国伍斯特理工学院计算机科学硕士入学要求.pdf...
  15. android serviceconnection 作用,Android Service服务的相关介绍
  16. OpenGL基础入门及准备
  17. MTK 6737 Flash配置
  18. C语言rewind函数返回值为空,我用rewind函数没把指针直到开始,关闭文件然后打开就行。帮忙看看...
  19. python爬取微信制作照片墙
  20. amazon 云平台入门

热门文章

  1. 湖北省制造业高质量发展专项资金政策!2022年各大类申报条件以及奖励补贴标准汇总
  2. 搜狗输入法人机交互设计的用户体验
  3. C++核心准则​NL:命名和布局规则
  4. 自媒体各大平台收益对比_各大自媒体平台的收益收益如何 以下是我个人的一个汇总...
  5. 学完软件测试还能找到工作吗?
  6. Ⅳ JavaScript函数
  7. DAS\NAS\SAN\IPSAN区别
  8. oracle数据库关闭失败,Oracle突然关闭原因
  9. 分析下锂电池,及其能量密度
  10. thinkphp 点击分类显示分类下的文章(完整)