stm32通信概述
本文提到的内容有以下几个方面:
- 通信概述
- 串口通信
- I2C通信
- CAN通信
- SPI通信
- I2S通信
- USB通信
- 其他通信
一、通信概述
按照数据传送方式分:
- 串行通信(一条数据线、适合远距离传输、控制较复杂)
- 并行通信(多条数据线、成本高、抗干扰性差)
按照通信的数据同步方式分:
- 异步通信(以1个字符为1帧、发送与接收时钟不一致)
- 同步通信(位同步、时钟一致)
按照数据的传输方向分:
- 单工(只能往一个方向传播)
- 半双工(数据传输可以沿两个方向,但是需要分时)
- 全双工(同时双向传输)
通信速率通常以比特率来表示,单位是:位/秒(bps),即每秒传输二进制代码的位数。之后会遇到一个波特率
的概念,它表示每秒传输多少个码元。一般情况下,码元都是表示两种状态,即比特率=波特率。
二、串口通信
串口通信属于串行通信方式,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。在此基础上用
户可以建立自己的高层通信协议。
串口通信的接口标准有很多,有RS-232、RS-232C、RS-422A、RS-485等。比较常用的就是RS-232和RS-485。
RS-232有两种接口:25针(DB25、标准)、9针(DB9、非标准),其逻辑电平如下:
在TxD和RxD上:
- 逻辑1(MARK)=-3V~-15V
- 逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
- 信号有效(接通,ON状态,正电压)=+3V~+15V
- 信号无效(断开,OFF状态,负电压)=-3V~-15V
当stm32与计算机串口通信时,需要用电平转换芯片MAX232,进行TTL电平和RS-232电平的转换。
RS-232的通信协议比较简单,通常遵循96-N-8-1格式。其是全双工的,且是异步通讯。
RS485没有规定或推荐任何数据协议,用户根据需要自己建立高层通信协议。
区别于RS232, RS485的特性包括:
1. RS-485的电气特性:采用“2线制”,半双工通信,逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两
线间的电压差为-(2—6)V表示。接口信号电平比RS -232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,
可方便与TTL 电路连接,其收发器芯片一般采用SP3485。
2. RS-485的数据最高传输速率为10Mbps
3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
4. RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只允许连接1个收
发器,即单站能力。而 RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485
接口方便地建立起设备网络。 因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选
的串行接口。因为RS485接口组成的半双工网络 ,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口
连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔) ,与键盘连接的键盘接口RS485采用DB-9(针)。
在stm32中,我们会接触到USART的概念,即通用同步异步收发器,同步和异步主要看其时钟是否需要对外提供。
其能够满足外部设备对串行通信的要求,只不过其是TTL电平,需要进行电平转换。
注:stm32的奇偶校验位是算在数据位中的(8位-9位),与PC不同。
注:串口用于传输ASCII码字符,我们进行数据传送时,要转换为对应ASCII码的16进制数或字符串。
注:TXE是指弹仓满,TC是指枪膛满。
三、I2C通信
I2C是两线式串行总线,接口少、控制简单、通信速率较高。I2C总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。
支持多主控多从控,不过同一时间点只能一个主控,连接节点数受地址限制。通过地址访问从控设备,通过仲裁决定主控设备优先级。因
其采用时钟线,所以是同步传输。I2C还是半双工的。具体通信采用I2C的通信协议(寻址、起始/停止、应答等)。I2C用硬件实现起来较
复杂,一般采用软件模拟I2C,移植方便。
四、CAN通信
CAN(Controller Area Network)是ISO国际标准化的串行通信协议。广泛应用于汽车、船舶等分布式控制系统。具有已经被大家
认可的高性能和可靠性。CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任一时刻,总线上有2种
电平:显性电平和隐性电平。“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平,并且,“隐性”具有
“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)。
总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。
CAN总线是半双工的,虽然没有单独的时钟线,但是其采用位时序的方法进行同步传输。
CAN总线协议具有以下特点:
- 多主控制(ID仲裁)
- 系统的柔软性(没有地址信息)
- 通信速度快、距离远
- 具有错误检测、错误通知和错误恢复功能
- 故障封闭功能
- 连接节点多(理论上无限制,但是受总线时间延迟、电气负载影响,太多会降低速度)
CAN总线有两种标准如下图所示:
CAN总线具有多节点可组网特性,如下图所示:
从上面可以看出,CAN控制器(stm32芯片中带有)和CAN总线直接需要一个CAN收发器,可以采用TJA1040芯片。
当一个站要向其它站发送数据时,该站的CPU将要发送的数据和自己的标识符传送给本站的CAN芯片,并处于准备状态;
五、SPI通信
SPI 是Serial Peripheral Interface的缩写,直译为串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,
是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使MCU有更多的时间处理其他事务。SPI内部结构简
易图如下图所示:
SPI接口一般使用4条线通信,分别如下:
- MISO:主设备输入/从设备输出
- MOSI:主设备输出/从设备输入
- SCLK:时钟信号线
- CS:从设备选择信号线
SPI一般用于一主多从,其结构示意图如下图所示:
此外,SPI通信有4种不同的模式。下图是一种模式下的时序图:
六、I2S通信
I2S是数字音频总线,在嵌入式音频系统设计中,并不是所有的MCU都支持I2S总线格式,再加上I2S还没有统一的接口标准,不同的
厂家生产的设备接口也是五花八门,采用软件模拟实现I2S总线可有效解决在不支持其的MCU和设备之间通过I2S总线实现数据传输时出现
的问题。
I2S为三线总线,3个信号分别为:
(1)串行时钟SCK,也叫位时钟(BCK)。即每发送1位数字音频数据,SCK上都有1个脉冲。SCK的频率=2×采样频率×采样位数。
在数据传输过程中,I2S总线的发送器和接收器都可以作为系统的主机来提供系统的时钟频率。
(2)帧时钟WS,即命令(声道)选择,用于切换左右声道的数据。WS的频率等于采样频率,由系统主机提供。WS为“1”表示
传输的是左声道的数据,WS为“0”表示传输的是右声道的数据。
(3)串行数据信号SD,用于传输二进制补码表示的音频数据。
I2S格式的信号无论有多少位有效数据,数据位的最高位(MSB)总是被最先传输,1次能够发送的数据决定于I2S格式的有效位数。
如下图所示为典型的时序图:
七、USB通信
USB(Universal Serial Bus)是一种新的PC串行通信协议。是PC体系中的一套较新的工业标准,它支持单个主机与多个外设同时进行
数据交换,大大满足了当今计算机外设追求高速度和高通用性的要求。
PC上的USB主机包括3个部分:USB主控制器/根Hub,USB系统软件和用户软件。下图是完整的USB系统组成。
USB主机与设备之间的传输过程是这样的:在PC上,设备驱动程序通过调用USB驱动程序USBD,发出输入输出请求包IRP;这样,
在USB驱动程序接到请求之后,调用主控制器驱动程序HCD,将IRP转化为USB的传输。当然,一个IRP可以包含一个或多个USB传输;
接着,主控制器驱动程序将USB传输分解为总线事务,主控制器以包的形式发送给设备。
USB设备类协议(USB DevICe Class Specification)与USB协议是互为补充的。针对USB的每一种设备类,都有一套特殊的设备类协
议。正是USB采用了设备类的方式来对各种设备进行分类,才使USB总线能够有效的控制和管理各种设备,也使得各种设备的开发变的
规范、简便。
此外,USB OTG既可以充当主机,也可以充当设备。
八、其他通信
stm32通信概述的更多相关文章
- STM32经典概述(干货 )
STM32经典概述(干货 ) 首先,在学习Cortex-M3时,我们必须要知道必要的缩略语. 在网上看的,觉得挺好的,分享过来了 整理如下: AMBA:先进单片机总线架构 ADK:AMBA设计套 ...
- 树莓派使用modbus与stm32通信
树莓派+stm32开发板通信树莓派上使用java+jamod实现.jamod官网stm32使用freemodbus实现
- 实现Python与STM32通信
断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官网找了一下 , ...
- Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
<一>线程间通信方法 全局变量方式:进程中的线程共享全局变量,可以通过全局变量进行线程间通信. 参数传递法:主线程创建子线程并让子线程为其服务,因此主线程和其他线程可以通过参数传递进行通信 ...
- web基础知识通信概述URI与http
1.url是什么,有什么作用: 说白了就是我们常说的网址:正规来说就是统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上的每个文件都有一个 ...
- stm32之通信
本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...
- STM32下载方法
一.JLINK下载方法 1.硬件设置 Boot0,Boot1 = 0,*(测试通过) Boot0,Boot1 = 1,0或者0,1(未测试) 2.软件设置 MDK设置 ① 选择Project -> ...
随机推荐
- 【paper】KDD15 - Interpreting Advertiser Intent in Sponsored Search
Interpreting Advertiser Intent in Sponsored Search 主要内容是搜索广告的相关性预估模型,使用learning to rank的方法.亮点在于使用了 ...
- Java 堆和栈 垃圾回收 2015/9/16
http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html Java内存: 1.堆内存:基本类型的变量和对象的引用变量. 2.栈内存:由ne ...
- ueditor编辑器【实际项目使用】
[页面效果] [代码] 说明: ueditor插件的公共代码: 如果是一个可以放在对应模块的js代码中 如果有多个就要提到全局的高度(即提到公共部分) <script type=" ...
- canvas globalCompositeOperation
source-over 默认,相交部分由后绘制图形的填充(颜色,渐变,纹理)覆盖source-in 只绘制相交部分,由后绘制图形的填充覆盖,其余部分透明 source-out 只绘制后绘制图形不相 ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- 字符串处理scanf("%d%*c",&n);
"*"表示该输入项读入后不赋予任何变量,即跳过该输入值.这在减小内存开支上面还是有一点用处的,不需要的字符直接跳过,免得申请没用的变量空间 你的例子中的%*c的作用是读入'\n', ...
- Byte.parseByte(String s,int radix)的解释
1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...
- Nginx——安装Nginx(二)
安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. gcc 安装 安装 nginx 需要先将官 ...
- Django的MultipleChoiceField处理小技巧
1.如果遇到多选择的,在收到数据时一般需要做处理 tag_id = fields.MultipleChoiceField( choices=[], widget=widgets.CheckboxSel ...
- C# 导出图片到Word (通过XML实现)
private void ExportDataToWord(string content) { StringBuilder sbMain = new StringBuilder(); #region ...