14-HAL库之I2C通信

2019-08-16来源: eefocus关键字:HAL库  I2C通信  通讯设备

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 config

GPIO_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;//100KHz

MyI2C1.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中的函数进行理解。



关键字:HAL库  I2C通信  通讯设备

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471327.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:13-HAL库DMA系统总结
下一篇:15-HAL库之定时器学习

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

。 然后使能TIM2的中断接下来添加代码:main.c 中开启捕获中断    /* USER CODE BEGIN 2 */    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃    /* USER CODE END 2 */      
发表于 2019-08-21
使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程

16.HAL库之SPI和QSPI

沿进行数据变化。DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。QSPI配置:时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。void Qspi_Config(){ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); Flash_GPIO.Pin=GPIO_PIN_2; Flash_GPIO.Mode=GPIO_MODE_AF_PP
发表于 2019-08-16
16.HAL库之SPI和QSPI

HAL库之485+DMA通信(STM32F746)

(uint32_t bound){  __HAL_RCC_GPIOD_CLK_ENABLE();  __HAL_RCC_USART2_CLK_ENABLE();   GPIO_InitTypeDef GPIO_Init2;   GPIO_Init2.Pin = GPIO_PIN_4;              //485_RTS  GPIO_Init2.Mode =GPIO_MODE_OUTPUT_PP;  GPIO_Init2.Pull = GPIO_NOPULL;  GPIO_Init2.Speed
发表于 2019-08-16
HAL库之485+DMA通信(STM32F746)

15-HAL库之定时器学习

RepetitionCounter;   //重复计数,高级控制定时器所用   uint32_t AutoReloadPreload;   //自动预装载值}TIM_Base_InitTypeDef;应用例子如下:#include "basic_tim.h"TIM_HandleTypeDef Basic_Tim6;void Basic_Tim_Config(void){ HAL_TIM_Base_MspInit(&Basic_Tim6); __HAL_RCC_TIM6_CLK_ENABLE(); Basic_Tim6.Instance=TIM6
发表于 2019-08-16
15-HAL库之定时器学习

13-HAL库DMA系统总结

。2.DMA相关函数解析关于DMA,ST官方提供了HAL库(封装函数)和LL库(直接操作寄存器)。和GPIO定义类似,需要先使能相关时钟,定义句柄结构体DMA_HandleTypeDef mydma2,随后进行DMA的各项配置,最后进行初始化。typedef struct __DMA_HandleTypeDef{    DMA_Stream_TypeDef          *Instance;                       
发表于 2019-08-16
13-HAL库DMA系统总结

STM32-(20):I2C通信(实验:读写EEPROM)

硬件电路连接底板上的 I2C 接口A0、A1是用来确定器件的地址的。排针上的引脚图:核心板上的引脚图:通过I2C总线实现对EEPROM的读写操作的准备工作:1、掌握芯片(目标对象)特性,才能对其正确的读和写。2、掌握 I2C 通信,读写过程需要用到。3、Cortex的一些操作,编程方法。实验内容:通过I2C总线实现对EEPROM的读写操作main.c#include"stm32f10x_lib.h"#include"IIC.h"/*------------函数的声明---------------*/void Delay_MS(u16 dly);void RCC_Configuration
发表于 2019-08-12
STM32-(20):I2C通信(实验:读写EEPROM)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved