首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【通信专栏】STM32单片机/I2C通信(上篇)

【通信专栏】STM32单片机/I2C通信(上篇)

作者头像
周旋
发布于 2020-06-04 07:42:51
发布于 2020-06-04 07:42:51
2.2K00
代码可运行
举报
文章被收录于专栏:行走的机械人行走的机械人
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
本文使用STM32FI03RCT6型号的单片机,
基于正点原子的函数库进行总结讲解

想来单片机这块儿除了USART串口通信外,常见的便是I2C通信了,因为I2C通信 硬件连接简单,可扩展性强,但是这种硬件连线的简洁,是以协议的复杂来弥补的。I2C通信是一种半双工通信,也就是可以双向传输数据但不能同时进行。

STM32单片机是可以进行硬件I2C通信或者软件模拟进行I2C通信的,硬件I2C通信只需要对I2C引脚以及通信模式这两个结构体进行初始化即可,但I2C硬件通信由于硬件原因并不稳定(原子哥说的),不过在STM32F4系列有所改善,但我都没试过(寒假在家手头硬件条件不足)。


下面我们基于软件I2C模拟进行说明。

I2C通信物理层原理

1:二线传输:I2C通信除了地线GND和电源线VCC外,只需要两条线,一条双向串行数据线(SDA),一条时钟线(SCL)。

2:无中心主机:可以多个设备并联到总线上,每一个设备都可以做为主机(或者从机)来发送,接受设备。但每一时刻只能有一个主机。

3:软件寻址:总线上的每一个设备都有一个唯一地址供识别,地址可以是7位或10位。

I2C通信协议层:传输过程

以STM32作为主设备发送数据为例:

步1:主机产生传输启示信号S,并联在总线上的所有设备都可以接收到

步2:所有从机开始准备接收接下来主机广播的从机地址,被选中设备(从设备)开始待命接收数据。其他设备便不再接收接下来的信息。

步3:主机开始向从设备发送数据,数据被拆分为数据包发送,每个数据包大小为8位(也就是一个字节一个字节的打包发送),从设备每接收到一个字节,便返回一个应答信号,主机再继续发送。

步4:如此传输N个数据后,主设备发送停止信号,数据传输停止

当主机读数据时:

主机广播完地址,接收到应答信号后,从机开始向主机返回数据包,大小也为8位。从机每发送一个包,等待主机的应答信号。如此反复发送N个字节后,当主机想要停止接收数据时,便向从机返回一个非应答信号,则从机停止数据发送。

到此我们了解了I2C通信的基本过程,但正点原子并没有直接操纵这些过程的库函数,所以我们需要需要更接近底层一步的时序问题;

1:空闲状态

总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。空闲状态就是没有数据传输的状态啦。我们需要在每次数据传输之前将总线置为空闲状态

代码如下图:

图中代码为IIC初始化代码,先开启时钟,再设置引脚PC11,PC12模式。最后红框内为将时钟线SCL和数据线SDA均置高,即初始化为空闲状态。

2:起始信号与停止信号

在上面的IIC通信流程分析中,我们在通信开始时要由主机先发一个起始信号start,停止时要发一个停止信号stop:

  • 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。
  • 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

时序图如下:

ST32的代码实现:

在上面两图开头的SDA_OUT()为宏定义;含义如下图:

3:应答信号

主机每接收到一个数据包,都需要给从机返回一个应答信号A,应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

但这只是在过程上是如此,在时序上是如何进行的呢?我们知道每一个数据包都是八位,所以传输一个数据包在占据数据线SDA的同时,遵循时钟线SCL的脉冲时序(也就是一个脉冲发送一位,传输一个包需要占用8个时钟脉冲信号),而我们便在第九个时钟脉冲信号时释放数据线SDA(也就是拉低),然后空闲出来发送应答信号A。

不过我们只需要控制在该发送应答信号的第九个脉冲时序就可以了。

下面我们看代码:

上图是STM32做为主机发送数据等待从机的应答信号。

当STM32需要做出应答或者非应答信号时,便比较简单了:

在熟悉了上述过程以后,我们便可以进行写一个过程层面的函数,进行发送一整个字节或者接收一整个字节了(当然,是原子哥写的):

I2C的硬件实现:

据此我们便将I2C软件模拟的一些基本操作说完了,硬件I2C便是将上述这些我们手写的代码(原子哥手写的)作为硬件封装起来,我们只需要配置I2C模式结构体就可以了,就是下面这个结构体(注意啊,这个结构体是使用硬件I2C时使用的,别搞混了):

1:I2C_ClockSpeed设置的是I2C的传输速率

2:I2C_Mode设置的是I2C的使用模式,有I2C模式(I2C_Mode_I2C)和SMBus模式(I2C_Mode_SMBusDevice,I2C_Mode_SMBusHost)。

3:I2C_DutyCycle设置的是I2C的时钟线的占空比,可以设置高电平与时间之比为16:9(I2C_DutyCycle_16_9)或者2:1(I2C_DutyCycle_2)。

4:I2C_OwnAddress1设置的为STM32自己的I2C设备地址,每个连接在I2C总线上的设备都有一个自己的地址,作为主机也不例外。该地址可以自行设置,可以选择7位或者10位。

5:I2C_Ack设置的位I2C的应答,若为I2C_Ack_Enable,则允许应答;若为I2C_Ack_Disable,则不许应答。往往设为允许应答。

6:I2C_AcknowledgedAddress设置的为I2C寻址模式,需要根据通信对方的地址进行设置。对方地址为7位,则设置为7位寻址。


到此我们对于I2C通信的理论知识应该有了大概的了解了,但这远远不够,因为我们要对一个外部设备(从机)进行读写操作,还需要了解:

  • 从机的地址
  • 从机的数据组织形式(存储形式)
  • 从机的数据写入时序
  • 如何结合I2C时序编写对某外设的读写操作

这些内容我们在"STM32单片机/I2C通信(下篇)"进行介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Opencv视觉实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
动态 | 英伟达上演GPU「十六合一」,512GB显存独步天下
AI 科技评论按:Buy more GPU,save more money!(买越多GPU,就越省钱!)这句话,英伟达 CEO 黄仁勋在整场 GTC 中足足重复了9次(可能还有数漏的)。 作为英伟达每年最重要的大会,一年一度在美国旧金山举办的 GTC 一直都是英伟达技术实力最集中的展示。而且英伟达的新产品也深深牵动着深度学习领域研究人员的心,更快的 GPU 、更大的显存、新的深度计算 API、更强大的计算集群等等都让更大规模、更高表现的模型变得更为平易近人。 看似槽点、其实亮点: 「世界最大的 GPU」、「
AI科技评论
2018/04/18
1.2K0
动态 | 英伟达上演GPU「十六合一」,512GB显存独步天下
深度学习|如何确定 CUDA+PyTorch 版本
对于深度学习初学者来说,配置深度学习的环境可能是一大难题,因此本文主要讲解CUDA; cuDNN; Pytorch 三者是什么,以及他们之间的依赖关系。
数据科学工厂
2023/09/28
13.6K0
深度学习|如何确定 CUDA+PyTorch 版本
Python CUDA 编程 - 1 - 基础概念
英伟达不同时代产品的芯片设计不同,每代产品背后有一个微架构代号,微架构均以著名的物理学家为名,以向先贤致敬。当前比较火热的架构有:
为为为什么
2022/08/04
1.2K0
Python CUDA 编程 - 1 - 基础概念
OpenCV4 + CUDA 从配置到代码.....
首先确保你有英伟达的独立显卡(GPU),然后请到英伟达官方网站,在线检查与下载最新的显卡驱动版本。地址如下:
小白学视觉
2019/10/24
4.1K0
英伟达CUDA架构核心概念及入门示例
理解英伟达CUDA架构涉及几个核心概念,这些概念共同构成了CUDA并行计算平台的基础。 1. SIMT(Single Instruction Multiple Thread)架构 CUDA架构基于SIMT模型,这意味着单个指令可以被多个线程并行执行。每个线程代表了最小的执行单位,而线程被组织成线程块(Thread Block),进一步被组织成网格(Grid)。这种层级结构允许程序员设计高度并行的算法,充分利用GPU的并行计算核心。 2. 层级结构 - 线程(Threads): 执行具体计算任务的最小单位。 - 线程块(Thread Blocks): 一组线程,它们共享一些资源,如共享内存,并作为一个单元被调度。 - 网格(Grid): 包含多个线程块,形成执行任务的整体结构。 3. 内存模型 - 全局内存: 所有线程均可访问,但访问速度相对较慢。 - 共享内存: 位于同一线程块内的线程共享,访问速度快,常用于减少内存访问延迟。 - 常量内存和纹理内存: 优化特定类型数据访问的内存类型。 - 寄存器: 最快速的存储,每个线程独有,但数量有限。 4. 同步机制 屏蔽同步(Barrier Synchronization) 通过同步点确保线程块内或网格内的所有线程达到某个执行点后再继续,保证数据一致性。 5. CUDA指令集架构(ISA) CUDA提供了专门的指令集,允许GPU执行并行计算任务。这些指令针对SIMT架构优化,支持高效的数据并行操作。 6. 编程模型 CUDA编程模型允许开发者使用C/C++等高级语言编写程序,通过扩展如`__global__`, `__device__`等关键字定义GPU执行的函数(核函数,kernel functions)。核函数会在GPU上并行执行,而CPU代码负责调度这些核函数并在CPU与GPU之间管理数据传输。 7. 软件栈 CUDA包含一系列工具和库,如nvcc编译器、CUDA runtime、性能分析工具、数学库(如cuFFT, cuBLAS)、深度学习库(如cuDNN)等,为开发者提供了完整的开发环境。
用户7353950
2024/07/05
6850
英伟达CUDA架构核心概念及入门示例
一文揭开 NVIDIA CUDA 神秘面纱
Hello folks,我是 Luga,今天我们继续来聊一下人工智能生态相关技术 - 用于加速构建 AI 核心算力的 GPU 编程框架 - CUDA 。
Luga Lee
2024/11/11
1.2K0
一文揭开 NVIDIA CUDA 神秘面纱
英伟达CUDA介绍及核心原理
CUDA定义了一种针对GPU特性的指令集,允许程序员直接编写针对GPU硬件的代码。这些指令专为大规模并行处理而设计,能够高效地驱动GPU上的数千个并行处理单元(如CUDA核心或流处理器)同时工作。
用户7353950
2024/04/30
4.8K0
英伟达CUDA介绍及核心原理
《C++与简单人工智能算法:开启智能编程之旅》
在当今科技飞速发展的时代,人工智能已经成为了一个热门话题。从智能手机的语音助手到自动驾驶汽车,人工智能技术正在逐渐改变我们的生活。而 C++作为一种高效、强大的编程语言,也可以用来实现简单的人工智能算法。本文将带你探索在 C++中如何实现一个简单的人工智能算法,让你领略人工智能的魅力。
程序员阿伟
2024/12/09
1850
英伟达Volta架构深度解读:专为深度学习而生的Tensor Core到底是什么?
机器之心报道 编辑:CZ、Jenny Huang、李泽南、吴攀、蒋思源 当地时间 5 月 8-11 日,英伟达在加州圣何塞举行了 2017 年的 GPU 技术大会(GTC 2017)。机器之心作为本次大会的特邀媒体,也来到了现场,参阅《现场报道 | 英伟达 GTC 大会开幕,盘点首日三大亮点》。昨天,英伟达 CEO 黄仁勋在大会上正式发布了目前最先进的加速器 NVIDIA Tesla V100。之后,英伟达开发博客又更新了一篇深度解读文章,剖析了 Tesla V100 背后的新一代架构 Volta,其在提供
机器之心
2018/05/08
4.2K0
英伟达Volta架构深度解读:专为深度学习而生的Tensor Core到底是什么?
cuda和cudnn的在windows上下载安装教程
概述 CUDA和cuDNN是由NVIDIA提供的两个关键软件库,用于利用NVIDIA GPU进行高性能计算和深度学习加速。 CUDA是一个由NVIDIA开发的并行计算平台和编程模型,用来加速计算密集型任务 cuDNN是一个GPU加速的深度学习库,是许多深度学习框架(如 TensorFlow、PyTorch、MXNet 等)中不可或缺的组件,因为它能够极大地提高深度学习任务的性能。 简单来说,CUDA 是一个通用的GPU编程平台,而cuDNN则是基于CUDA之上的一个专门用于深度学习的优化库。 安装前提:必须有一块支持CUDA的英伟达显卡,如果电脑没有英伟达显卡,那没办法使用哦。 接下来我将手把手教你们安装cuda和cudnn
云未归来
2025/07/22
9520
cuda和cudnn的在windows上下载安装教程
【玩转 GPU】英伟达GPU架构演变
1999年,英伟达发布第一代GPU架构GeForce 256,标志着GPU时代的开始。随后,英伟达推出了Tesla、Fermi、Kepler、Maxwell、Pascal、Volta、Turing和Ampere等GPU架构,不断增强GPU的计算能力和程序性,推动GPU在图形渲染、人工智能和高性能计算等领域的应用。
疯狂的KK
2023/06/08
12K0
【玩转 GPU】英伟达GPU架构演变
《C++与 Armadillo:线性代数助力人工智能算法简化之路》
在人工智能领域,线性代数运算可谓是构建各类模型与算法的基石。从神经网络中的矩阵乘法、向量运算,到数据处理中的特征分解、奇异值分解等,无一不依赖高效且精准的线性代数计算。而 C++作为一种强大且高效的编程语言,在人工智能开发中有着独特的地位。Armadillo 库的出现,则为在 C++中处理线性代数运算提供了极大的便利,本文将深入探讨如何借助 Armadillo 库简化线性代数运算在人工智能算法中的实现。
程序员阿伟
2024/12/23
4220
《C++与 BLAS、LAPACK:加速人工智能算法的线性代数秘籍》
在人工智能的广袤天地中,基础线性代数运算犹如大厦的基石,支撑着各类复杂算法与模型的构建与运行。从神经网络的层层矩阵运算,到数据处理中的特征分解与线性方程组求解,无不依赖高效精准的线性代数计算。而 C++语言以其卓越的性能和对底层资源的强大掌控力,在人工智能开发中占据重要地位。其中,BLAS(Basic Linear Algebra Subprograms)和 LAPACK(Linear Algebra PACKage)这两个强大的库,成为 C++开发者优化线性代数运算、加速人工智能算法的得力助手。本文将深入探讨如何借助它们达成这一目标。
程序员阿伟
2024/12/18
2820
《C++与 BLAS、LAPACK:加速人工智能算法的线性代数秘籍》
GPU计算加速01 : AI时代人人都应该了解的GPU知识
金融建模、自动驾驶、智能机器人、新材料发现、脑神经科学、医学影像分析...人工智能时代的科学研究极度依赖计算力的支持。提供算力的各家硬件芯片厂商中,最抢镜的当属英伟达Nvidia了。这家做显卡起家的芯片公司在深度学习兴起后可谓红得发紫,如果不聊几句GPU和英伟达,都不好意思跟别人说自己是做人工智能的。
PP鲁
2019/12/26
1.7K0
《C++与人工智能库的完美邂逅:环境配置全攻略》
在当今科技飞速发展的时代,人工智能无疑是最热门的领域之一。而 C++作为一种高效且强大的编程语言,在人工智能开发中依然占据着重要的地位。将 C++与流行的人工智能库相结合,可以充分发挥两者的优势,为开发高性能、智能化的应用程序提供有力支持。本文将详细介绍如何在 C++环境中配置流行的人工智能库,帮助开发者开启 C++人工智能之旅。
程序员阿伟
2024/11/25
4850
《C++与人工智能库的完美邂逅:环境配置全攻略》
小蛇学python(22)pytorch配置cuda实现GPU加速
深度学习如火如荼,使用普通的cpu来跑模型真的让人急死,就算最普通的垃圾显卡,只要支持cuda,就可以实现gpu加速,其速度至少是cpu的5倍。
用户2145057
2020/02/13
1.8K0
GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学!
Python是当前最流行的编程语言,被广泛应用在深度学习、金融建模、科学和工程计算上。作为一门解释型语言,它运行速度慢也常常被用户诟病。著名Python发行商Anaconda公司开发的Numba库为程序员提供了Python版CPU和GPU编程工具,速度比原生Python快数十倍甚至更多。使用Numba进行GPU编程,你可以享受:
PP鲁
2019/12/26
7K0
GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学!
CUDA C/C++总结
需要提下学习CUDA的目的,就是为了加速自己的应用,相比于CPU-only的应用程序,可以用GPU实现较大加速,当然程序首先是计算密集型而非IO密集型
零式的天空
2022/03/08
7230
waifu2x 二次元动漫图片放大/降噪黑科技
这个工具的作用是将二次元插画、动漫截图、甚至真实照片使用深度卷积神经网络进行缩放,以取得比通常缩放算法更优的效果,并对图片进行降噪处理(因为放大的时候会使原有的噪点变得更加明显或者产生更多噪点),使得放大后的图片显得更加自然,甚至你会以为这就是原图
子润先生
2021/06/09
2.1K0
英伟达发布12G显存版3080!AI超级分辨率:1080p帧数、4K画质
Tom's Hardware高级编辑Brandon Hill表示:「事实上,我们对这个产品的发布感到有点惊讶,这显然也是由英伟达的合作伙伴驱动的。」
新智元
2022/02/24
1.2K0
英伟达发布12G显存版3080!AI超级分辨率:1080p帧数、4K画质
推荐阅读
相关推荐
动态 | 英伟达上演GPU「十六合一」,512GB显存独步天下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档