首页 > 其他分享 >STM32硬件IIC使用

STM32硬件IIC使用

时间:2024-03-08 17:33:23浏览次数:29  
标签:硬件 设置 STM32 IIC GPIO I2C I2C1

概述

虽然STM32的硬件IIC据说有设计缺陷,但是经过我的实践,至少STM32F103的硬件IIC是没问题的。这里给出STM32的硬件IIC的使用以及编程思路。

1.STM32硬件IIC引脚

在这里给出STM32F103的硬件IIC引脚,方便查阅使用
Alt text

2.STM32硬件IIC使用流程

STM32的硬件IIC我认为是非常具有借鉴意义的,它使用了事件组的一个流程。以stm32为主设备,iic设备为从设备为例,主设备需要先向从设备发送开始信号,这个是iic协议所规定的,之后iic总线上的应答信号会转化成EV5事件(一个标志量)。没错,STM32把一次完整的IIC数据传输依据IIC总线上的应答给拆分成了5个事件,每个事件代表一个传输事件完成。这是我第一次在freertos外的设备上见到事件组。
Alt text
如图所示,在STM32上,硬件IIC事件组共有9个,在以STM32为主设备的情况下,仅有5个事件需要注意。其中EV5代表IIC模式设置完成,EV6代表IIC发送或接收模式设置,EV7代表IIC接收完成,EV8代表发送中,EV8_2代表发送完成。

具体代码实现

在这里以STM32上的IIC1为例

IIC初始化

1.IIC以及GPIO时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//打开IIC时钟

2.GPIO设置

GPIO_InitTypeDef IIC_Gpio;//定义GPIO结构体
IIC_Gpio.GPIO_Pin |= GPIO_Pin_6 | GPIO_Pin_7;//设置IIC引脚
IIC_Gpio.GPIO_Mode = GPIO_Mode_AF_OD;//设置GPIO模式为复用推挽输出
IIC_Gpio.GPIO_Speed = GPIO_Speed_50MHz;//设置GPIO速度为50MHz
GPIO_Init(GPIOB,&IIC_Gpio);//载入GPIO结构体

3.IIC设置

I2C_DeInit(I2C1);//初始化IIC1
I2C_InitTypeDef IIC_InitStruct;//定义IIC结构体
IIC_InitStruct.I2C_ClockSpeed = 400000;//设置IIC时钟为400KHz,STM32硬件IIC最大到400KHz
IIC_InitStruct.I2C_Mode = I2C_Mode_I2C;//设置IIC模式为I2C
IIC_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;//设置IIC占空比为2
IIC_InitStruct.I2C_OwnAddress1 = 0x21;//设置IIC本机地址,可以随意设置,只要不与要通信的设备冲突即可
IIC_InitStruct.I2C_Ack = I2C_Ack_Enable;//设置IIC应答
IIC_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//设置IIC应答地址长度
I2C_Init(I2C1,&IIC_InitStruct);//载入IIC结构体

4.IIC使能

I2C_Cmd(I2C1,ENABLE);

IIC发送

IIC发送单字节

I2C_GenerateSTART(I2C1,ENABLE);//生成开始信号
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);//等待IIC模式设置开始即EV5事件
I2C_Send7bitAddress(I2C1,Address,I2C_Direction_Transmitter);//发送从设备地址+读写位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待IIC模式设置完成即EV6事件
I2C_SendData(I2C1,data);//发送数据
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待数据发送完成即EV8_2事件
I2C_GenerateSTOP(I2C1,ENABLE);//生成停止信号

IIC发送多字节

void IIC_SendBuff(uint8_t* str,uint16_t len)
{
I2C_GenerateSTART(I2C1,ENABLE);//生成开始信号
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);//等待IIC模式设置开始即EV5事件
I2C_Send7bitAddress(I2C1,Address,I2C_Direction_Transmitter);//发送从设备地址+读写位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待IIC模式设置完成即EV6事件
while(len--)循环发送数据
{
    I2C_SendData(I2C1,*str);
    str++;
    IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
}
I2C_GenerateSTOP(I2C1,ENABLE);//生成停止信号
}

标签:硬件,设置,STM32,IIC,GPIO,I2C,I2C1
From: https://www.cnblogs.com/tqht7h/p/18061502

相关文章

  • RT-THREAD的STM32F4系列移植
    RT-Thread:RT-Thread,全称是RealTime-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,但允许多个任务同时运行并不意味着处理器在同一时刻真的执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务......
  • 216. 组合总和 IIIc
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[10];voiddfs(int**......
  • 米尔电子STM32MP135开放式高实时高性能PLC控制器解决方案发布
    前言随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,同时随着国内工业控制系统逐步进入中高端应用,更加精准......
  • 基于CH592x的硬件I2C驱动(AHT20)调试记录
    前言:AHT20是一个I2C器件,恰好CH592芯片资源有硬件I2C我们可以尝试使用592的硬件I2C去驱动AHT20。资料:I2C接口使用指南(可见EVT中I2C例程文件下),AHT20数据手册(可以在立创商城直接下载)数据手册中对这个器件的驱动流程也有说明,分别对几个步骤进行解读: 1、根据手册提示开机后,要等待......
  • STM32标准库通用定时器计数
    STM32标准库通用定时器计数1.定时器初始化voidTIM2_Init(){ TIM_TimeBaseInitTypeDefTIM2_Initstructure;//定义结构体 NVIC_InitTypeDefNVIC_InitStructure;//定义结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE......
  • STM32标准库基本定时器
    STM32标准库基本定时器1.定时器初始化voidTIM6_Init()//定时器6初始化{ TIM_TimeBaseInitTypeDefTIM_TimBaseStructure;//定义定时器结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//使能定时器6的时钟 TI......
  • 【代码更新】IIC时序——读写EEPROM
    【代码更新】IIC时序——读写EEPROM    整体代码:1//---->50MHz--->20ns100KHz---->10000ns2`timescale1ns/1ps3moduleeeprom_i2c#(parameterSCL_CYC=1000)//100KHz4(5inputclk,6inputrst_n,78......
  • STM32标准库RTC时钟
    STM32标准库RTC时钟1.RTC时钟配置1.1头文件引用需要引用以下头文件或打开以下模块:#include"stm32f10x_rcc.h"//包含RCC时钟配置头文件#include"stm32f10x_pwr.h"//包含PWR时钟配置头文件#include"stm32f10x_rtc.h"//包含RTC时钟配置头文件#inclu......
  • linux基于VSCODE搭建stm32开发环境
    1.安装VSCODEhttps://code.visualstudio.com/2.安装系统相关编译软件sudoaptinstallbuild-essentialgdbsudoaptinstallgcc-arm-none-eabisudoaptinstallmakecmakesudoaptinstallopenocd3.安装VSCODE插件cortex-debug  4 安装stlink驱动下载地址......
  • STM32的中断刨析
    STM32中断刨析一直以来,学习了stm32和freertos但在思考rtos的任务调度时,涉及到stm32的中断就感觉糊里糊涂。本篇记录刨析stm32的中断系统。中断和异常在STM32微控制器中,中断(Interrupt)和异常(Exception)是两种处理器响应外部事件的机制。它们的区别和联系如下:区别:中......