赞
踩
数据按照协议的规定在这些引脚上进行输入和输出,从而实现通信。
(1)USART
TX(D):数据发送脚;RX(D):数据接收脚。
(2)I2C
SCL(Serial Clock):时钟;SDA(Serial Data):数据。
(3)SPI
SCLK:(Serial Clock):时钟; MOSI(Master Output Slave Input):主机输出数据脚; MISO(Master Input Slave Output):主机输入数据脚; CS(Chip Select):片选,用于指定通信的对象。
(4)CAN
CAN_H和CAN_L:差分数据脚(这两个数据表示一个差分数据)。
(5)USB通信
DP(Data Positive)D+ 和DM(Data Minus)D-:一对差分数据脚。
(1)全双工:通信双方能够同时进行双向通信,一般来说,全双工的通信都要两根通信线,发送线路和接收线路互不影响。(串口:TX发送,RX接收,SPI:MOSI发送,MISO接收)
举例:全双工比半双工进了一步。在A 给B发信号的同时,B也可以给A发信号。典型的例子就是打电话,双方都能说,对方也能听到。
(2)半双工:半双工数据传输允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。(I2C、CAN、USB都只有一根数据线(CAN和USB的两根差分线组合成一根数据线))
举例:指A 能发信号给B,B也能发信号给A,但这两个过程不能同时进行。可以想象一下对讲机,你收到的回复并不是都马上就有的。而且前提是双方不能在同一个状态,如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。
计算机主机用串行接口连接显示终端时, 在半双工方式中,输入过程和输出过程使用同一通路 。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在发送到主机的同时就被送到终端上显示出来,而不是用回送的办法, 所以避免了接收过程和发送过程同时进行的情况。
(3)单工:数据传输只支持数据在一个方向上传输。(数据只能从一个设备到另一个设备,不能反着来)
举例:意思就是A只能发信号,B只能接受信号,通信是单向的。类比于灯塔发发出光信号,航船只能接受信号。
时钟信号告诉接收方什么时候需要采集数据。
(1)同步:I2C和SPI有单独的时钟线,所以它们是同步的,接收方可以在时钟信号的指引下进行采样。
(2)异步:USART、CAN、USB没有时钟线,需要双方约定一个采样频率,这就是异步通信,并且还需要增加一个帧头帧尾,进行采样位置的对齐。
(1)单端信号:引脚的高低电平都是对GND的电压差。单端信号通信的双方必须要共地(把GND接在一起)。USART、I2C、SPI都应该加一个GND引脚,否则无法通信。
(2)差分信号:CAN和USB是差分信号,靠两个差分引脚的电压差来传输信号,可以不需要接GND。传输速度和距离都非常高。但USB有些协议需要单端信号,所以还是需要接地。
(1)点对点:USART和USB都是点对点设备。(只有两个设备,直接传输数据即可)
(2)多设备:I2C!,SPI,CAN都可以在总线上挂载多个设备。(多设备,一个设备面向很多个设备,需要要一个寻址的过程,以确定通信的对象)
图一:USB转串口模块
功能:(CH340)芯片可以把串口协议转换为USB协议,一边是USB口可以插在电脑上,一边是串口的引脚,可以接在支持串口的芯片上,这样就能实现单片机和电脑的通信了。
图二:陀螺仪传感模块
功能:可以测量角速度,加速度这些姿态参数,左右各有四个引脚,一边是串口的引脚,一边是I2C的引脚。
图三:蓝牙串口模块
功能:下面四个引脚是串口通信的引脚,上面的芯片可以和手机互联,实现手机遥控单片机的功能。
比特率(每秒传输比特(位)的个数,在二进制调制情况下,比特率=波特率)
1000bp(bite)/s :1s要发1000位,每一位的时间就是1ms,发送方每隔1ms发生一位,接收方每隔1ms接收一位,这就是波特率,它决定了每隔多久发送和接收一位
作用:按照串口协议来产生和接收高低电平信号,实现串口通信。
TDR和RDR占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR(Data Register),在硬件中实际为两个数据寄存器。
TDR(只写):当进行写操作时,数据就写入到TDR
发送移位寄存器作用:把一个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位,当数据从TDR移动到移位寄存器时,会置一个标志位叫TXE(TX Empty),发送寄存器空,如果标志位置1,我们就可以在TDR写入下一个数据了,TXE置1时,数据还没发送出去,只要数据从TDR转移到发送移位寄存器,TEX就会置1,然后发送移位寄存器会在发送器的控制下向右移位,一位一位地把数据输出到TX引脚
接收移位寄存器作用与发送移位寄存器同理。
RDR(只读):当进行读操作时,数据就从RDR读出来。
硬件数据流控:如果发送设备发的太快,接收设备来不及处理,就会发生丢失或覆盖数据,硬件数据流控可以避免这个问题。流控有两个引脚,一个是nRTS,一个是nCTS。
nRTS(Request To Send):是请求发送,是输出脚,也就是告诉别人我现在能不能接收。
nCTS(Clear To Send):是清除发送,是输入脚,用于接收别人nRTS信号的。(n的意思是低电平有效)
当我们的TX和外界的RX连接时,RTS要发送一个请问能不能输出的信号,接收到外界来的CTS,当能接收时,RTS就置低电平,请求对方发送,对方的CTS接收到之后,就可以一直发,当没有及时数据数据/数据处理不过来时,RTS就会置高电平,对方CTS接收到之后,就会暂停发送。
TX和CTS是一对的,RX和RTS是一对的。(TX和RX交叉连接,CTS和RTS也要交叉连接)
SCLK控制:发送寄存器每移位一次,同步时钟电平就跳变一个周期。(时钟告诉对方,我移出去一位数据了,你看要不要我这个时钟信号来指导你一下。)这个时钟支持输出,不支持输入,所以两个USART之间不能实现同步的串口通信。
SCLK作用:
1.兼容SPI协议(串口+时钟)
2.自适应波特率(接收设备不知道发送设备给的什么波特率,那么就可以通过时钟周期来计算波特率)
唤醒单元:实现多设备功能
串口的输出TX比输入RX简单,输出只需要定时翻转高低电平即可,输入需要保证采样频率和波特率一致,还要保证每次输入采样的位置正好处于每一位的正中间,这样读取的高低电平才是最可靠的,如果采样点过于靠前或靠后,那有可能高低电平还正在翻转,电平还不稳定,或者稍有误差,数据就采样错了,另外输入最好对噪声有一定的判断能力,如果是噪声,最好能置个标志位提醒一下。
输入部分的电路对采样时钟进行了细分,以波特率的16倍进行采样,也就是在一位的时间里,可以进行16次采样。
最开始空闲状态是高电平,那采样就一直是1,在某个位置突然采到0,那就说明在这两次采样之间产生了下降沿,如果没有任何噪声,那之后就应该是起始位了,在起始位会进行连续的16次采样,如果没有噪声,16次采样都是0,但在实际过程中是有噪声的,所以后续要再采样几次,以防万一。
如果每3位里面只有一个0,那么可能是噪声引起的,此时电路就忽略前面的数据,重新开始捕捉下降沿。(STM32对噪声的处理)
数据采样
对于包头、数据、包尾这3种状态,我们要有不同的处理逻辑,所以需要设计一个能记住不同状态的机制,在不同状态执行不同的操作,同时还要进行状态的合理转移,这种程序设计思维,就叫做状态机 。每个状态都需要用变量来标志,状态机有多标志位!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。