ARM笔记
可以说,这些是面试的常考考点,也是stm32等必不可少的知识。所以这些必须要懂。
五大总线协议分别是UART、RS232、RS485、IIC、SPI
引言
在分别介绍之前,需要先搞懂一些知识:并行和串行;单工、半双工和全双工;同步和异步。
补充一个概念:波特率
描述UART通信速度,单位bps(每秒传输二进制位bit数量)
并行通信:
系统芯片通过多路并列方式向外部设备传数据
特点:
- 各数据位同时传输,传输速度快、效率高,多用在实时、快速的场合。
- 并行通信不能长距离通信,抗干扰能力差。
串行通信
系统芯片就一条路先后给外部设备传数据
特点:
- 节省传输线,布线简单。
- 抗干扰能力强。
通俗的讲:
有八个仔组成的旅游小团队进车站
- 并行就是开了八个入口,一人一个口,一次性的就过去。很明显并行这样省时间效率高,但是开那么多入口就很浪费资源。而且要是入口通道比较长或者某几个入口机检慢的话你就无法保证同时通过这入口,这时候你团队就会出现缺人情况(线路长了会使干扰增加使数据容易出错)
- 串行就是一个入口,你这八个家伙排队挨个通过,虽然说这样相对耗时间效率较低了,但不会出现掉队的情况了,而且不开那么多入口节省资源
总的来说,串行相对并行通信要使用的广的多。
同步
事情有先后,要一件一件的做;如果前一件事卡在那做不了,后面的事情就阻塞在那没法做,跟着遭殃。
异步
事情也有先后,也是一件一件的来做;但是如果前一件事卡在那做不了,没关系,后面的事情可以接着做,不用跟着遭殃。直到这个卡住的事情能做了,再折回来处理。
通俗的讲:
还是那八个仔,假设现在是这八个家伙排队进一个入口
- 同步就是队里排头的老王过入口时候忘拿身份证出来,然后在那里翻包掏口袋找身份证,后面的七个人陪着等
- 异步就是队里排头的还是老王,还是他忘了拿出身份证,但是他不堵在那,而是跟后面的人说“我先找下身份证你们先过”然后自己离开到一旁找身份证,后面的人继续通过;某时某刻老王终于找到身份证了然后再过去。
单工
只能发送器给接收器发送数据
(只能A给B发,B无法发数据给A)
半双工
双方能互相发送数据,但不能同时进行
(A给B发数据的时候B不能给A发数据只能接收数据,等A不再发B数据时B才可以给A发数据)
全双工
AB可以同时进行收和同时发
正题
UART(串行、全双工、异步)
-
在空闲状态(不发数据)下,必须是高电平。
-
发数据前,先发低电平的起始位,接下来是数据位发送数据,串口规定先发低位再发高位(比如0x55,即01010101,所以先发低位1)。
-
校验位是奇偶校验,比如上例,1的个数是4,即偶数,所以校验位是1(如果1的个数是奇数则校验位是0)
-
停止位是1,即高电平
区分01和0011在于掐时间(和波特率有关),每次只发一个字节数据是为了避免时间误差累计导致延时而出现数据传输出错。
串口输出重定向:
通过串口将打印信息输出到显示终端,方便调试。
void UART_Send_Byte(char Dat)
{
//等待发送寄存器为空,即上个数据发送完成
while(!(UART2.UTRSTAT2 & (1 << 1)));
//将要发送的数据写入发送寄存器 UTXH2
UART2.UTXH2 = Dat;
}
char UART_Rec_Byte(void)
{
char Dat = 0;
//判断接收寄存器是否收到数据
if(UART2.UTRSTAT2 & 1)
{
Dat = UART2.URXH2;
return Dat;
}
else
{
return 0;
}
}
void UART_Send_Str(char *pstr)
{
while(*pstr != '\0'){
UART_Send_Byte(*pstr++);
}
}
int main()
{
char RecDat = 0;
UART_Init();
while(1)
{
UART_Send_Str("Hello World\n");
}
return 0;
}
上述UART_Send_Str(“Hello World\n”);类似printf(“Hello World\n”);
以前的printf是调用c库的,执行在显卡,现在是开发板上实现printf的功能而且是执行在UART,这种情况就是printf的输出重定向
USART(串行、全双工、异步/同步)
USART和UART不同,或者可以说是UART的升级版。
- UART: Universal Asynchronous Receiver/Transmitter通用异步收/发器;
- USART: Universal Synchronous/Asynchronous Receiver/Transmitter通用同步/异步收/发器。
从名字上可以看出,USART在UART基础上增加了同步 (S) 功能,即USART是UART的增强型。
以下引自百科:点此前往
市场上有只支持异步通信和同时支持异步与同步通信的两种硬件可用于UART。前者就是UART名字本身的含义,在摩托罗拉微控制器中被称为串行通信接口(SCI);Microchip微控制器中的通用同步异步收发器(USART)和在富士通微控制器中的UART是后者的两个典型例子。
RS232和RS485
前文的UART存在问题:
- 电气接口不统一
UART只是对信号的时序进行了定义,并未改变接口的电气特性。UART通信时一般直接使用处理器使用的电平,即TTL电平。由于存在处理器差异,而UART没有规定连接器的标准,所以该情况下通信时不能直接相连,从而不同器件之间UART通信连接就很不方便。 - 抗干扰能力差
UART一般是直接使用TTL信号来表示0和1,但TTL信号的抗干扰能力较差,数据在传输过程中很容易出错。 - 通信距离极短
因为TTL信号的抗干扰能力差,自然就受限于传输距离,基本上传输距离就是电路板芯片之间这样而已。
RS232(串行、全双工、异步)
芯片里出来的是TTL信号,需要MAX232芯片模块转换成232信号。
结果发现,虽然统一电气接口了,但只能点对点,信号抗干扰能力还是不够满足,于是就有了升级版RS485
RS485(串行、半双工、异步)
RS485模块使用:点击此处.
上方连接这个是我之前写过的博文:https://blog.csdn.net/weixin_44035986/article/details/116792884
232只能点对点,而485可以形成网络(挂多个设备)
RS485采用两线制,这种连接方式为总线式拓扑结构,在同一总线上可以同时存在多个节点;由于采用两线制,数据的发送和接收都要使用这对差分信号线,发送和接受不能同时进行(半双工),在编程的时候也需要加以处理。
和RS232一样,需要max485模块把TTL转485信号。除此之外,还要在处理器外部添加电路实现差分功能。
差分信号
信号抗干扰能力强。
两根线发送信号差来描述0和1,比如下图,H为5V,L为0V时,H-L>0所以描述1;H为0V,L为5V时,H-L<0所以描述0;
降低信号干扰(共模干扰,即一根线为地线,另一个线的高低电平表示1和0)再浅显的说,比如一条线电压为15V,但由于线长而受干扰变为0V了,如果是共地那种那么就会导致信号出错,而如果是差分信号,另一跟线也会受到同种影响(比如上例H的5V变0V,必然的也会有L的0V变为-5V,作差后结果并不会受到影响)
TTL电平
通常我们采用二进制来表示数据而且规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。
UART特指单片机的UART端口,使用TTL电平:
标准TTL输入高电平最小2V,输出高电平最小2.4V,典型值3.4V,输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
由于电平是一个连续变化的电压范围,为了用这种模拟量的电压来表示数字量的逻辑1和逻辑0,TTL电平规定:
–输出电路:电压大于等于(≥)2.4V为逻辑1;电压小于等于(≤)0.4V为逻辑0;
–输入电路:电压大于等于(≥)2.0V为逻辑1;电压小于等于(≤)0.8V为逻辑0;
IIC(串行、半双工、同步)
IIC不是点对点的通信(不是串口那种TX接RX,RX接TX)
SDA是总线,SCL是时钟
按照上面通信过程,假设单片机A作为主机,控制日历时钟(地址0x03,占数据的7位,后面留1位是用来判断收发状态(数据传送方向)的,如果是0则表示接下来的是主机发从机数据,如果是1则表示接下来是主机从从机那接收数据),首先单片机A发送起始信号启用总线,然后单片机A发送一个字节数据指明从机地址0x03和传送方向,接着对应从机给出回应反馈应答信号,之后就是按照已固定的传送方向进行通信(如果传送方向位是0则后面一直是主机发从机数据然后从机回应反馈应答信号,如果是1则后面一直是从机发主机数据,直到主机不再应答传输数据结束),最后主机发送停止信号释放总线结束信号传输。
和串口的先发低位不同,IIC是先发高位,然后从高到低。
9位=7位从机地址+1位传送方向标志位+1位对齐从机的应答位
9位=8位数据+1位对齐从机的应答位
要确保A发送时B处于接收态,串口是通过起始信号来解决这个问题的,IIC也是这样的原理,利用起始信号。
区分10和1100,串口通过设置波特率来解决,且每次只允许发一个字节避免时间误差。
SCL低电平时是SDA变化态,SCL高电平时读取一位SDA数据(稳态)。IIC不存在时间误差问题,所以进行反复收发,一次可以发任意多个字节。
上图在转接主从时没有P是为了不释放总线避免被其它主机占用。
SPI(串行、全双工、同步)
比如高电平使能,所以CS1发1,CS2等要发0,从而表示跟从机1通信。
一般情况下从机的CS上有一杠则是低电平使能,否则就跟上图那样是高电平使能。
和IIC一样,先发高位再发低位。无应答机制。