STM32硬件IIC使用

这篇具有很好参考价值的文章主要介绍了STM32硬件IIC使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

1.STM32硬件IIC引脚

在这里给出STM32F103的硬件IIC引脚,方便查阅使用
stm32 硬件iic应用,STM32标准库使用,stm32,单片机,嵌入式硬件

2.STM32硬件IIC使用流程

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

具体代码实现

在这里以STM32上的IIC1为例文章来源地址https://www.toymoban.com/news/detail-839517.html

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使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个简单的HAL库STM32使用DMA+硬件IIC驱动0.96寸OLED的方法

    自己在刚入坑嵌入式的时候,加入学校科协的一道免试题是开发一个简易的示波器,当时萌新不会做,中间又在准备比赛没时间,最近帮女朋友做课设需要做一个简易的交流电压表,而且终于有空做一下自己感兴趣的项目了,就想到了之前想做有没得做的一个简易示波器。

    2024年02月19日
    浏览(43)
  • STM32单片机初学4-IIC通信(软件模拟)

    IIC ( Inter-Integrated Circuit )又称I2C(习惯读“I方C”),是 IIC Bus简称,中文名为 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。适用于IC间的短距离数据传输。 最初的IIC通信速

    2024年02月05日
    浏览(75)
  • 【STM32+HAL库】---- 硬件IIC驱动0.96OLED

    代码借鉴学习于以下文章: STM32 使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库) 略... 点击查看代码 首先在 main.c 中引入头文件 随即根据要求在 main函数 中添加对应功能函数即可 【 注意 】使用时应将编译器编码选项选择为 GBK系列 ,否则编译报错,尤其注意通过keil修改后,再

    2024年02月19日
    浏览(39)
  • STM32硬件IIC卡死问题和DMA发送数据异常问题

    问题1描述: 一直听说STM32的硬件IIC有问题,我平时做项目一直没有遇到过,这次做项目发现硬件IIC居然会自己卡死,现象就是IIC发不出数据,用逻辑分析仪捕捉不到任何电平,必须要重启单片机才能正常,接下来说一下我的硬件环境:STM32作为主机,IIC总线上挂载这AT24C02和一

    2024年02月03日
    浏览(34)
  • STM32单片机初学5-IIC通信驱动OLED屏幕

    在我上篇文章(STM32-软件模拟IIC通信)讲解了软件模拟IIC通信。这篇文章详将细讲解利用软件模拟IIC来控制0.96寸的OLED屏幕(如下图),使其显示字符串。本文将不再对IIC通信原理做详细讲解,所以对IIC通信原理不熟悉的话可以参考我上篇文章(点击上面的链接直接跳转)。

    2023年04月10日
    浏览(55)
  • STM32 硬件IIC 控制OLED I2C卡死问题

    #更新通知:2023-09-06 STM32L151 固件库 使用I2C 太难了,又宕机了,建议不要在固件库版本上尝试硬件IIC 了,一般人真用不了,直接使用软件模拟的,或者不要使用固件库了,用HAL 库吧,据说HAL 库没这么多问题,不死心的我还是死心了,等有空再研究吧 3.1 I2C模式,我这里选的

    2024年02月09日
    浏览(50)
  • STM32模拟IIC与IIC四种实现数字光强采集模块GY30(标准库与HAL库)

    目录 代码实现是的IIC通信,数据采集后在串口显示,方便大家实现二次开发 原件选择 GY-30 数字光强度介绍 BH1750芯片参数 引脚说明  BH1750指令集 接线表设计 通过四种方式实现GY-30数据采集 1.标准库模拟IIC实现GY-30采集并串口1显示  2.标准库IIC实现GY-30采集并串口1显示 3.HAL库

    2023年04月26日
    浏览(88)
  • STM32Cubemxhal库硬件IIC驱动SHT40温湿度传感器

    STM32cubemx配置硬件IIC如图所示  SHT40的驱动代码 注意:在读sht40的寄存器之后一定要加10几个ms的延时

    2024年02月12日
    浏览(41)
  • 【STM32】 硬件IIC 驱动SSD1306(0.96 OLED模块) -- 1/4 库函数 学习

    经过了对于STM32的学习,但是大多数时候都还是以移植别人的历程然后修修改改为主。为了更好的巩固自己的学习能力。 所以此篇文章将会以记录我个人学习 硬件IIC 为案例,学习驱动IIC总线设备的能力。 1.《STM32F10x-中文参考手册》 2.《SSD1306芯片手册》 《STM32F10x-中文参考手

    2024年02月01日
    浏览(44)
  • STM32F103硬件IIC控制4针0.96寸OLED显示屏

    OLED使用的0.96寸四针屏幕,以下直接看实际操作。 使用PCtoLCD2002软件提取OLED字模。 注意红色方框的选项内容,不要选错了,选错会导致烧录程序后无法显示。 此为硬件IIC,如果使用过我的模拟IIC控制程序可直接看 void OLED_Write_Command(unsigned char IIC_Command); void OLED_Write_Data(unsig

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包