STM32的两个GPIO引脚,分别用于SCL和SDA,按照I2C规约的时序,像控制LED灯那样控制引脚输出,若是接收数据时则读取SDA线上的电平,那就可以实现I2C通信了,这也是我们在51单片机上的“软件模拟协议”做法。但是STM32上还配有I2C控制器片上外设,只要配置好该外设,它就可以依据规约产生通讯信号。收/发数据置于缓存寄存器中,cpu只要检测该外设的状态和数据寄存器就能完成数据收发。但是利用该外设来实现I2C通讯,存在许多硬件Bug,下来还是简单讲解这种做法。

1. I2C通讯时序

  通俗来讲,IIC的时序就是主机向从设备发出一个数据后,要间隔多少时间从机才会回复,或者说SCL上的信号要维持多久的高电平、低电平才使得SDA的信号正确传输到从机等,这些是在I2C协议明确规约的,在51单片机软件模拟IIC时序时,编程中我们需要自己实现函数去延时。在STM32的I2C控制器下的IIC时序将不需要这么繁琐。如何实现?看下面摘自《STM32中文参考手册_V10.pdf》I2C章节的两图(STM32系统既可以当IIC主机也可以当IIC从机,以I2C主机模式为例)。

主机发送:

(1) 主机端代码控制IIC控制器产生起始信号(S),当发生起始信号后,控制器产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送。
(2) 紧接着发送设备地址,然后等待从机的应答信号,若从机有回答,控制器将产生“EV6”及“EV8”
(3) I2C外设通过SDA信号线将数据一位一位发送出去,一字节数据发送完毕后,控制器将会产生“EV8”,重复此过程可以发送多个字节数据
(4) 发送完所有数据后,代码控制IIC控制器产生结束信号(P),控制器将会产生“EV8_2”事件,表示通讯结束。

假设我们使能了I2C中断,以上所有事件都可以产生I2C中断信号,进入同一个中断处理函数,在该函数中通过访问对应寄存器判断是哪一事件。

主机接收:

(1) 主机端代码控制IIC控制器产生起始信号(S),当发生起始信号后,控制器产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送。
(2) 紧接着发送设备地址,然后等待从机的应答信号,若从机有回答,控制器将产生“EV6”
(3) 从机向主机端发送数据,当主机接收到数据后,会产生“EV7”事件。接下来若要继续接收数据则发出应答信号ACK,若发出非应答信号(NACK)则停止传输
(4) 主机端发送非应答信号,产生停止信号,传输结束

利用标准库函数I2C_CheckEvent()可以检测EV5事件的发生与否,如:

I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); //I2C_EVENT_MASTER_MODE_SELECT表EV5

2.I2C初始化描述结构体

I2C初始化描述结构体:
typedef struct
{uint32_t I2C_ClockSpeed;         /* 设置SCL线上的时钟频率,此值不可高于400000 */uint16_t I2C_Mode;               /* 指定工作模式,I2C模式或者SMBUS模式可选 */uint16_t I2C_DutyCycle;          /* 时钟占空比,即高电平时间/低电平时间 */uint16_t I2C_OwnAddress1;        /* 指定I2C自身设备的地址 */uint16_t I2C_Ack;                /* 应答使能或关闭,一般为使能 */uint16_t I2C_AcknowledgedAddress;/* 指定地址长度,7位/10位可选 */
}I2C_InitTypeDef;

(1) I2C_ClockSpeed:设置I2C的数据传输速率,此数值不得高于400000
(2) I2C_Mode:STM32的I2C外设可用于I2C通讯的主机/从机,还可用于SMBus协议通讯使用。此值取值可为:

I2C_Mode_I2C:I2C模式,I2C模式不需要指定主从机。
I2C_Mode_SMBusHost:SMBus主模式
I2C_Mode_SMBusDevice:SMBus从模式

(3) I2C_DutyCycle:指定SCL的占空比,即高电平时间/低电平时间,取值可为I2C_DutyCycle_2或者I2C_DutyCycle_16_9。对此值要求并不严格,可任意选择。
(4) I2C_OwnAddress1:配置I2C设备自身的地址,挂接在I2C总线上的设备,包括主机,都有自己的地址。STM32的I2C外设可同时使用两个地址,即对两个地址都作出反应。这里设置的是第一个地址,第二个地址通过函数I2C_OwnAddress2Config()设置。
(5) I2C_Ack:是否发送响应信号,可设置为使能2C_Ack_Enable或者非使能2C_Ack_Enable,一般I2C通讯都使用使能。
(6) I2C_AcknowledgedAddress:设置I2C的寻址模式,可设置为7位(I2C_AcknowledgedAddress_7bit)或者10位(I2C_AcknowledgedAddress_10bit),若要使用10位寻址模式,需要将此值设置为I2C_AcknowledgedAddress,I2C_OwnAddress1才是有效的10位地址。

配置好这个结构体,通过函数I2C_Init()设置到实际控制器中。

3. I2C通讯引脚

STM32F10x中是有两个I2C外设的,分别为I2C1和I2C2。但是我在手上的《STM32中文参考手册_V10.pdf》中看到的只是I2C1的SCL和SDA引脚设置:

在正点原子MiniSTM32开发板的原理图看到,确实存在I2C2,I2C2的SCL和SDA分别是PB10和PB11。

  以上只是了解一下标准库对STM32的硬件I2C的封装。因为硬件I2C这种方式的不稳定,所以详细的编码就不再记录。在STM32上实现I2C通讯,个人觉得还是采用在学习51单片机的时候估计大部分人都折腾过,用软件模拟I2C时序的方法,虽然貌似复杂度增加,但是比较稳定,下来有时间再折腾并记录。

STM32的I2C通信相关推荐

  1. 基于STM32的I2C通信 2(读写AT24C02)

    本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作. 1.EEPROM(24C02):I2C接口 1.1-24C02器件介绍: AT24C02的总容量是256个字节,也就是2 ...

  2. STM32的I2C主从机通信

    最近一段时间在做I2C通信协议,需要在两块STM32之间做I2C通信,定的是主机用IO口模拟,从机用的是STM32的硬件I2C,我的项目要求是需要主从机之间能够进行一串数据收发而不出错,实验时在主机方 ...

  3. STM32应用(七)JY901九轴姿态模块(串口DMA空闲中断和I2C通信)

    文章目录 0.相关基础知识介绍 0.1六轴.九轴传感器有什么区别? 1.JY901模块简介 1.1 产品概述 1.2 性能参数 1.3 实物图和接线 2.软件和使用说明书 3.串口通信JY901 3. ...

  4. STM32——stm32 I2C通信代码配置(2)(学习笔记)

    STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...

  5. STM32 HAL I2C(IIC)通信的序列传输(restart condition)

    STM32 HAL I2C(IIC)通信的序列(Seq)传输函数(restart condition) neozng1@hnu.edu.cn 文章目录 STM32 HAL I2C(IIC)通信的序列( ...

  6. STM32——I2C通信

    文章目录 一.I2C通信 二.使用I2C通信的硬件设备 三.硬件电路 四.I2C时序基本单元 起始与终止 发送 接收 发送应答与接收应答 五.I2C时序 指定地址写 当前地址读 指定地址读 连续读与写 ...

  7. linux stm32 主从,STM32F407和STM32F051主从I2C通信方法

    STM32F407和STM32F051主从I2C通信方法 作者:华清远见讲师 M4作为主机: int main(void) { HAL_Init(); SystemClock_Config(); MX ...

  8. STM32 I2C通信(读写eeprom)

    I2C通信 双线制:串行时钟线SCL,串行数据线SDA. 通常采用软件模拟i2c通信.

  9. 基于距离传感器的I2C通信(一)

    基于距离传感器的I2C通信(一) 一.软硬件准备 (一)硬件 (二)软件 ST-Link驱动的下载安装 二.keil软件的配置 (一)初始配置 (二)程序下载及调试 三.器件的初步了解 四.接线方法 ...

最新文章

  1. 苹果损失超 1000 万美元,前员工被控收回扣、盗窃、欺诈!
  2. 01.Python基础-3.集合容器
  3. 使用SCOM常用的一些ManagementPack
  4. 使用redis incr计数来控制单位时间内对某接口的访问量
  5. aspose 换行写_aspose.word 换行符 aspose.words换行符
  6. Go 语言基础(一)
  7. linux系统初级管理书,Linux系统管理基础--超级适合Linux新手的书
  8. linux里面安装php,linux下怎么安装php环境
  9. 原python基础概念整理_python基础知识脉络梳理总结
  10. cs6制作拼图游戏 dreamweaver_如何使用Dreamweaver cs6设计拼图游戏?
  11. 澳大利亚维多利亚州旅游局力推高尔夫主题体验
  12. 李开复--生命是最严厉的导师
  13. 原生js写网页下拉菜单
  14. Android开发文件上传格式,(android开发)使用okhttp上传文件
  15. python的print函数用逗号分隔时输出不用空格_python print 按逗号或空格分隔的方法...
  16. NGUI:HUD Text
  17. linux安装ftp服务并测试访问
  18. 小规模公司如何简易做账报税?
  19. 2021-07-09 支付行业发展特点与所面临的挑战需求
  20. 商务通核心函数库代码(2)

热门文章

  1. 系统稳态响应MATLAB,信号与系统matlab实验3连续时间LTI分析
  2. VMware 复制虚拟机、克隆虚拟机
  3. labview调用solidworks3维模型
  4. AUTOSAR架构的CAN通讯学习(一)——整体概述
  5. Canalyzer使用介绍
  6. Ionic实现混合开发--探索之旅
  7. 网络版GPS车辆监控系统设计
  8. 苹果手机怎么把中文翻译英文
  9. 前端第三次培训(css选择器)
  10. “COMSOL 多物理场/FDTD 时域有限差分/ RSoft 光电器件仿真设计” 系列专题