赞
踩
UART,SPI,I2C是基础中的基础,需要学会;AMBA协议非常重要
---------------------------------------------------------------------------------------------------------------------------------MCU的外设包括功能外设和通信外设。
功能外设包括:TIMER, 看门狗,中断控制器等。
通信外设包括:UART,SPI,I2C,USB,SDIO等。
MCU内部一般采用AMBA总线,包括AHB,APB,AXI总线。
AHB总线属于高速总线,用于连接MCU内部的高速模块,如内部存储器,DMA控制器等,还连接高速总线外设,如USB总线。
APB总线属于低速总线,用于连接MCU内部的低速模块,如UART, SPI总线等。
全双工:可以同时双向通讯,如SPI,UART。
半双工:任何时刻都只能单向通讯,如I2C。
并行通讯:有多根数据线,一个时钟可以传输多个bit,如PCI总线,SDIO总线。
串行通讯:只有一根数据线(或者说一对差分信号线),如I2C,SPI,USB等。
同步通讯:包含时钟,如I2C总线,SPI总线等。
异步通讯:不包含时钟,如UART总线,USB总线。
一、 UART总线
UART属于全双工,低速,异步总线,常用波特率为115200,没有Master和Slave之分。
接口:
TXD:发送引脚
RXD:接收引脚
连接时,需将A设备的TXD连接至B设备的RXD,反之亦然。
UART时序:
起始位(START): 开始进行数据传输之前发送方需要先发出一个低电平‘0’来表传输字符的开始。
数据位:起始位之后,数据可以是5,6,7,8,9位,构成一个字符,一般是8位。
奇偶校验位:验证数据传输的正确性,可以省略掉该位。
停止位:数据结束标志,可以是1位,1.5位,2位的高电平。
RS232,RS422,RS485的区别:
RS232标准采用负逻辑电平,单端传输方式。通过一根信号线发送,一根信号线接收,一根地线,可实现全双工通讯。RS232只支持一对一通讯。距离小于15米。
RS422由RS232发展而来,但采用差分信号,需要4根线实现全双工通讯,两根TX,两根RX。速率最大可达10M,当速率100kbps时,传输距离可达1200米。RS422允许在一条总线上连接多达10个接收器,从而实现单个设备发送,多个设备接收的功能。
RS485总线同样采用差分信号,但是只有2根信号,由TX/RX共有,所以只能实现半双工。RS485增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,各设备通过使能信号控制发送和接收过程。
二 、I2C总线
I2C属于半双工,低速,同步总线,常用速率有100K,400K,1M等,有Master和Slave之分。
接口:
SCL :时钟引脚,Master负责发送时钟信号。
SDA:数据引脚,Master和Slave都可以发送数据信号。
Master写操作:Master发送对应的Slave设备地址和数据信息。
Master读操作:Master发送对应的Slave设备地址,对应的Slave发送数据信息。
I2C总线的Slave设备都需要配置地址,一般是通过引脚配置。
SCL处于高电平,SDA由高变低为START信号;
SCL处于高电平,SDA由低变高为STOP信号。
三、SPI总线
SPI总线是全双工,同步总线,有Master和Slave之分,速率可达几十M。
接口:
SSN:片选引脚,Master负责发送片选信号。
SCK:时钟引脚,Master负责发送时钟信号。
MOSI:Master Out Slave In数据线,Master发送信号引脚。
MISO:Master In Slave Out数据线,Master读数据引脚。
Master读写操作同步进行,Master发送片选信号和时钟信号,每个时钟周期MOSI和MISO同步传输数据。
原文链接:https://blog.csdn.net/weixin_43758472/article/details/127464755
---------------------------------------------------------------------------------------------------------------------------------
波特率主要运用在异步串行通讯中
如UART通讯,UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。
传输一个字节,如果包含8位数据位(一个字节)包含起始位、停止位、校验位各一个,每传输一个字节需要用到11位。
115200bit/s=115200/11/1024kByte/s=10.23kB/S
例如:波特率115200 = 115200 (位/秒)。 如果没有校验位,就应该除以 10,得到的是每秒字节数:波特率115200 = 115200 (位/秒) = 11520 (字节/秒)。再除以 1024,就是每秒 KB 数:波特率115200 = 115200 (位/秒) = 11.25 (KB/秒)。 如果有一位奇偶校验位,就应该除以 11,得到的是每秒字节数,最后得出:波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)
IIC(Inter-Integrated Circuit,集成电路之间的通信协议)需要使用开漏输出和上拉电阻,主要有以下两个原因:
IIC总线的管脚都是开漏输出,必须外接上拉电阻。这是因为在IIC总线中,SDA和SCL信号线是被多个设备共享的,每个设备都可以通过这两根线来发送和接收数据。为了保证总线的正常通信,必须确保总线上的电平状态一直稳定和可靠。 具体来说,当总线上没有任何设备输出信号时,如果没有上拉电阻,那么SDA和SCL信号线上的电平就会浮动,从而导致总线电平不确定。如果此时有一个设备开始发送数据,那么其他设备就无法正确识别信号的有效性,从而导致通信失败。 因此,为了保证总线的正常通信,必须在SDA和SCL信号线上接上拉电阻,以确保总线上的电平状态稳定。而上拉电阻的阻值大小则会影响总线上信号的传输速度和稳定性。一般来说,阻值越大,总线的传输速度就越慢,但是传输的稳定性会更高。反之,阻值越小,总线的传输速度就越快,但是传输的稳定性会更差。 举个例子来说,如果我们需要在IIC总线上传输大量的数据,那么我们可以选择使用较小的上拉电阻,以提高总线的传输速度。但是,如果我们需要在IIC总线上传输一些对传输速度和稳定性要求较高的数据,比如传输一些实时数据,那么我们应该选择使用较大的上拉电阻,以保证数据传输的稳定性。
在IIC总线中,上拉电阻的阻值大小会影响总线的传输速度和稳定性。一般来说,阻值越大,总线的传输速度就越慢,但是传输的稳定性会更高。反之,阻值越小,总线的传输速度就越快,但是传输的稳定性会更差。因此,我们需要根据总线的传输速度来选择合适的上拉电阻阻值。 以ATmega328芯片为例,它的IIC总线速率可以设置为100kHz或400kHz。在100kHz的速率下,常用的上拉电阻阻值为4.7kΩ或10kΩ;在400kHz的速率下,常用的上拉电阻阻值为1.5kΩ或2.2kΩ。 具体来说,IIC总线的上拉电阻阻值可以通过以下公式计算: R = (Vcc - Voh) / Iol 其中,R为上拉电阻的阻值,Vcc为芯片的供电电压,Voh为芯片的高电平输出电压,Iol为芯片的低电平输出电流。 对于ATmega328芯片来说,当使用4.7kΩ的上拉电阻时,Iol为3mA,Voh为0.4V,Vcc为5V,则计算得到的阻值为: R = (5V - 0.4V) / 3mA = 1.53kΩ 当使用10kΩ的上拉电阻时,Iol为1.6mA,Voh为0.4V,Vcc为5V,则计算得到的阻值为: R = (5V - 0.4V) / 1.6mA = 2.81kΩ 因此,在100kHz的速率下,可以选择4.7kΩ或10kΩ的上拉电阻。如果需要更高的速率,可以选择1.5kΩ或2.2kΩ的上拉电阻。
【数字IC精品文章收录】https://blog.csdn.net/weixin_43698385/article/details/125436708
https://www.cnblogs.com/ChurF-Lin/p/10793111.html
嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。
注:
在此开发板中,是有USART(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器)串口的,USART相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就以UART来讲该通信协议了。
当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。
紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
资料为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
处于逻辑“1”状态,表示当前线路上没有资料传送,进入空闲状态。
处于逻辑“0”状态,表示开始传送下一数据段。
表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。
常用的波特率有:9600、115200……
时间间隔计算:1秒除以波特率得出的时间,例如,波特率为9600的时间间隔为1s / 9600(波特率) = 104us。
接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):
RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O 用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。
发送逻辑对从发送FIFO 读取的数据执行“并→串”转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和停止位。
在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行“串→并”转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO 的数据中。
波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,UART 可以产生所有标准的波特率,而误差很小。
发送时,数据被写入发送FIFO。如果UART 被使能,则会按照预先设置好的参数(波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据(如果FIFO 未空),UART 的忙标志位BUSY 就有效,并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空,且已从移位寄存器发送最后一个字符,包括停止位时才变无效。即 UART 不再使能,它也可以指示忙状态。
在UART 接收器空闲时,如果数据输入变成“低电平”,即接收到了起始位,则接收计数器开始运行,并且数据在Baud16 的第8 个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。
如果起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16 个周期(即一个位周期之后)对连续的数据位进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。
最后,如果Rx 为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO 中。
出现以下情况时,可使UART 产生中断:
FIFO 溢出错误
线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)
奇偶校验错误
帧错误(停止位不为1)
接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)
发送
接收
由于所有中断事件在发送到中断控制器之前会一起进行“或运算”操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数,软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。
FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO 分别配置为以不同深度触发中断。可供选择的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO 选择1/4,则在UART 接收到4 个数据时产生接收中断。
发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。
接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。
收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14 个)后才产生一次中断然后一并处理,这就大大提高了收发效率。
完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置UART 后,就可以放心收发了, FIFO 和中断例程会自动搞定一切。
UART 可以进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx 输入端接收。
https://www.cnblogs.com/deng-tao/p/6004280.html
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一
种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
2、SPI优点
支持全双工通信
通信简单
数据传输速率块
3、缺点
没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据
可靠性上有一定的缺陷。
4、特点
1):高速、同步、全双工、非差分、总线式
2):主从机通信模式
5、协议通信时序详解
1):SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多
个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共
有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
(1)SDO/MOSI – 主设备数据输出,从设备数据输入;
(2)SDI/MISO – 主设备数据输入,从设备数据输出;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设
备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需
要将从设备对应的片选引脚电平拉低或者是拉高。
2):需要说明的是,我们SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配
置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们
可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来
控制我们主设备的通信模式,具体如下:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA
是用来配置数据采样是在第几个边沿:
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿
例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是
SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是
SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
需要注意的是:我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信
那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以我们的
SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是
保持高电平要么是保持低电平。
6、内部工作机制
SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI
时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以
及 Channel-Width 所决定.
IIC:两线式串行总线,它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbs以上。
时钟线SCL:在通信过程起到控制作用。
数据线SDA:用来一位一位的传送数据。
IIC分为软件IIC和硬件IIC
软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。 硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。
补充:
1.硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。 2.IIC是半双工通信方式
https://www.cnblogs.com/-wenli/p/10907967.html
IIC通信过程由开始、结束、发送、响应、接收五个部分构成。
1、(在发送、接收数据的时候)当SCL为高电平时,SDA线不允许变化;当SCL线为低电平时,SDA线可以任意0、1变化。 2、(在任意时候)只有当SCL为高电平时,IIC电路才对SDA线上的电平(0或者1)进行记录,当SCL线为低电平时,无论SDA是高还是低,IIC电路都不对SDA进行采样。
在介绍上面五个部分前,我们首先说说空闲状态,什么是空闲状态,就是没有通信时的状态(初始状态)
I2C总线的SDA和SCL两条信号同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
开始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平。 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。
发送器每发送一个字节,就在时钟脉冲9期间释放数据先,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间位稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。