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

STM32硬件IIC使用

时间:2024-03-01 21:35:11浏览次数:24  
标签:硬件 EVENT STM32 IIC GPIO I2C I2C1

STM32硬件IIC使用.md

概述

虽然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);//生成停止信号
}

IIC接收

IIC接收单字节

I2C_GenerateSTART(I2C1,ENABLE);//生成开始信号
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);//等待IIC模式设置开始即EV5事件
I2C_Send7bitAddress(I2C1,Address,I2C_Direction_Receiver);//发送从设备地址+读写位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//等待IIC模式设置完成即EV6事件
REC = I2C_ReceiveData(I2C1);//接收数据
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED);//等待数据接收完成即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_Receiver);//发送从设备地址+读写位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//等待IIC模式设置完成即EV6事件
while(len--)循环发送数据
{
    *str = I2C_ReceiveData(I2C1);//接收数据
    str++;
    IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED);
}
I2C_GenerateSTOP(I2C1,ENABLE);//生成停止信号
}

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

相关文章

  • 【STM32】使用Keil5加载程序时出现No Target Connected错误的解决办法
    错误情况加载程序时弹出Notargetconnected的Error框,随后弹出Flashdownloadfailed-TargetDLLhasbeencancelled。此时打开设置中Debug选项的Setting窗口,显示SWDIO中Notargetconnected解决办法检查设置里的Debug选项里的调试器型号有没有选对,如下图所示,我用的是S......
  • 11硬件控制方法
    在汇编语言中,用IN指令和OUT指令来同外围设备进行输入操作。用来识别外围设备的编号称为i/o地址或I/O端口号。像磁盘这样用来处理大量数据的外围设备都具有DNA功能。软件存在是硬件正常运行的必要条件。Window控制硬件时借助的是输入输出指令,其中具有代表性的是IN和OUT。数字信......
  • 记录一次修复蓝牙故障经过(硬件管理器:“目前,这个硬件设备没有连接到计算机。(代码 45)
    记录一次修复蓝牙故障经过(硬件管理器:“目前,这个硬件设备没有连接到计算机。(代码45)”)来源https://zhuanlan.zhihu.com/p/491185819 2022年3月中旬重装win10系统,下旬欲使用蓝牙时发现没有安装驱动,便从Acer官网下载驱动进行安装,失败,遂尝试驱动人生、驱动精灵、booster9安......
  • STM32F10X 部分引脚不能使用的问题
    一、概述说来惭愧,我到现在都没有完整的学习过STM32。接触STM32还是突然的一个项目,需要用到STM32,紧急需求,只能边学边完成。不过好在ST的资料还是比较多的,相对也比较简单,基本上的需求都能找到对应的demo,或者直接使用STM32CubeMX生成代码,最后在稍微改改,写一下自己的逻辑,就能......
  • 硬件控制的方法?
    硬件控制的方法主要涉及到与计算机硬件进行交互和通信,以便对硬件进行配置、管理和操作。这些方法通常包括使用汇编语言、操作系统提供的API、中断控制器、DMA(直接内存访问)等技术。汇编语言是一种低级编程语言,它直接对应于计算机的指令集。通过使用汇编语言,开发者可以编写直接与硬......
  • 硬件控制方法
    在阅读了《程序是怎样跑起来的》第十一章后,我明白了支撑硬件输入输出是IN指令和OUT指令。IN指令通过指定端口号的端口输入数据,并将其存储在CPU内部的寄存器中。OUT指令则是把CPU寄存器中存储的数据输出到指定端口号的端口。IRQ是暂停正在运行的程序并跳转到其他程序运行的必要机......
  • 《程序是怎样跑起来的》第十一章“硬件控制方法”
    在读完“硬件控制方法”这一章节后,我了解到了硬件的重要性和其重要作用。在用C语言等高级编程语言开发的Windows应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。Window控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令......
  • 第十一章 访问硬件的方法
    《程序是怎样跑起来的》这本书,从多个角度深入浅出地解析了程序的运行原理及其背后的计算机科学知识。在第十一章“访问硬件的方法”中,我深感作者将复杂的技术知识用平易近人的方式呈现,让读者在轻松愉快的阅读中获得了宝贵的知识。首先,这一章让我对硬件有了更深入的了解。在使用C......
  • STM32——CAN通讯
    STM32-CAN通讯一、发送和接收流程can通讯传输的是一种差分信号,关于具体的硬件电路略。1、发送流程前置工作:如时钟的开启、引脚的配置;CAN邮箱和模式等配置参考下面或HAL库选择选择一个空置的邮箱(判断空置:CAN_TSR的TMEx位);在这个空置邮箱中按数据帧格式设置ID、数据长度......
  • Linux使用命令行编译并用st-link烧录STM32
    创建工程在STM32CubeMX中配置,选择Makefile并生成。环境安装编译工程需要用到arm-none-eabi,去官网下载对应系统版本,下载后解压到任意位置。添加环境变量添加环境变量到.bashrc文件:echo'exportPATH="/toolchain/arm-none-eabi/bin:$PATH"'>>~/.bashrc我解压的位置为/too......