目录
《 KeyStone Architecture Universal Asynchronous Receiver/Transmitter (UART) User Guide SPRUGP1—November 2010》
IIC、SPI、UART、USART、USB、CAN等通讯协议原理及区别
串行外设接口(Serial Peripheral Interface, SPI)
I2C详解(一)
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART)
1. Design Spec
1.1. Function Description
USART,如同UART依旧是全双工、串行,与UART不同的是USART具备同步传输模式。其实USART就是在UART基础上加入了同步时钟SCK,就类似于SPI主从之间在同时钟域。
但与SPI也不相同,SPI是只能全双工工作、不可如UART那样半双工工作,这是因为SPI本质是spi master与spi slave之间循环移位寄存器实现数据传输,即发数必收数。而USART则要类似UART那样具备半双工工作模式,即发数和收数完全隔离。
有一种思路就是USART由USART_TX和USART_RX组成,将USART_TX看作是SPI_MASTER、将USART_RX看作是SPI_SLAVE
但USART1与USART2通信的时候只将USART1_TX.sck与USART2_RX.sck、USART1_TX.mosi与USART2_RX.miso相连,而USART1_TX.miso与USART2_RX.mosi断开.
这样就消除了SPI循环移位寄存器导致的不可半双工工作的问题,如下图。
驱动沿和采样沿
然后这里说一下波特率的问题,既然是可以实现同步传输,那么速度就会有提升,这个没问题。
这里想说的是,但凡是芯片间慢速通信接口,例如UART、SPI、I2C,都有一个特点就是驱动沿与采样沿不同,如下图所示
其中,R = CLK_FREQ/ BAUD_RATE
表示每驱动1bit数据花费的clk周期数。
● uart_tx驱动txd 在baud_cnt == R
处驱动,但uart_rx采样rxd则是在baud_cnt == R/2
处
● spi_master驱动mosi 在sck下降沿处驱动, 但spi_slave采样mosi 则是在 sck上升沿处
● i2c_master驱动sda 在scl低电平驱动,但i2c_slave采样sda 则是在scl高电平
SPI CPHA模式的意义
那么为什么不像平时设计时,一个模块内信号的采样和驱动在同一边沿呢?这个原因在 串行外设接口(Serial Peripheral Interface, SPI)有介绍,其实就是STA问题,
T s e t u p S I < T S C K + T S C K 2 S I − ( T S C K 2 M O + T C K 2 Q M O + T M O 2 S I ) (a) T^{SI}_{setup}<T_{SCK}+T_{SCK2SI}-(T_{SCK2MO}+T^{MO}_{CK2Q}+T_{MO2SI}) \tag{a} TsetupSI<TSCK+TSCK2SI−(TSCK2MO+TCK2QMO+TMO2SI)(a)
T h o l d S I < T S C K 2 M O + T C K 2 Q M O + T M O 2 S I − T S C K 2 S I (b) T^{SI}_{hold}<T_{SCK2MO}+T^{MO}_{CK2Q}+T_{MO2SI}-T_{SCK2SI} \tag{b} TholdSI<TSCK2MO+TCK2QMO+TMO2SI−TSCK2SI(b)
因为 T S C K T_{SCK} TSCK比较大, T s e t u p S I T^{SI}_{setup} TsetupSI一般可以满足。但是 T h o l d S I T^{SI}_{hold} TholdSI则不好说,如果SCK走线时间和MOSI走线时间差距比较大的话,可能会违背。
但如果对MO/CK和SI/CK在SCK不同沿的话, ( b ) (b) (b)式就会在左侧多一个 1 2 T S C K \frac{1}{2}T_{SCK} 21TSCK,就可以保证。
那么对于USART来说,也可以参照SPI这样的驱动采样双边沿的形式
1.2. Feature List
本文要实现的具体内容如下:
● 实现基于APB协议的USART,上升沿驱动、下降沿采样
● 波特率为10MHZ
● 具备奇校验功能
1.3. Register Description
本文为简易USART设计,暂不添加寄存器描述
1.4. Block Diagram
USART基本架构如下,注意APB信号不能直接输入至USART_TX或USART_RX模块内,需要在USART中作调度,如下图所示:
1.5. Interface Description
接口描述如下
usart
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn_sck | input | 1 | tx_sck时钟复位信号 |
pclk | input | 1 | APB时钟 |
prstn | input | 1 | 复位信号 |
paddr | input | PADDR_WIDTH | 用于访问usart_tx和usart_rx内部FIFO |
pwrite | input | 1 | 1表示写,0表示读 |
psel | input | 1 | 是否对usart选通 |
penable | input | 1 | APB使能 |
pwdata | input | PDATA_WIDTH | 写数据 |
prdata | input | PDATA_WIDTH | 读出的数据 |
pready | output | 1 | usart准备标志 |
rx_sck | input | 1 | usart_rx波特率时钟 |
rxd | input | 1 | usart通信单bit总线 |
tx_clk | output | 1 | usart_tx的波特率时钟 |
txd | output | 1 | usart通信单bit总线 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
BAUD_RATE | bit | 设定的波特率 |
PCLK_FREQ | bit | pclk的时钟频率 |
PADDR_WIDTH | bit | 地址宽度 |
PDATA_WIDTH | bit | 数据宽度 |
ASYNC_FIFO_DEPTH | bit | USART_TX和USART_RX中异步FIFO深度 |
baud_clk_gen
用于产生波特率时钟sck
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn_sck | input | 1 | tx_sck的复位信号 |
pclk | input | 1 | SPI的用户时钟 |
tx_sck | output | 1 | 波特率时钟 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
BAUD_RATE | bit per second | 设定的波特率 |
PCLK_FREQ | HZ | clk的时钟频率 |
usart_rx
USART的接受器
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn | input | 1 | 复位信号 |
pclk | input | 1 | USART_RX的用户时钟 |
rx_sck | input | 1 | USART_RX的波特率时钟 |
rxd | input | 1 | USART通信单bit总线 |
fifo_rdata | output | PDATA_WIDTH | USART_RX接受模块数据 |
fifo_rdata_val | output | 1 | USART_RX接受模块数据有效 |
fifo_rd_en | input | 1 | USART_RX外部模块读请求信号 |
fifo_empty | output | 1 | USART_RX中FIFO空标志 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
PDATA_WIDTH | bit | UART_RX接受模块数据宽度 |
ASYNC_FIFO_DEPTH | bit | USART_TX和USART_RX中异步FIFO深度 |
usart_tx
Signal | Direction | Width(bits) | Description |
---|---|---|---|
prstn | input | 1 | 复位信号 |
pclk | input | 1 | USART_TX的用户时钟 |
tx_sck | input | 1 | USART_TX的波特率时钟 |
txd | output | 1 | USART通信单bit总线 |
fifo_wdata | input | PDATA_WIDTH | USART_TX发送模块数据 |
fifo_wdata_val | input | 1 | USART_TX发送模块数据有效 |
fifo_full | output | 1 | USART_TX中FIFO满标志 |
之后是参数描述
Parameter | Units | Description |
---|---|---|
PDATA_WIDTH | bit | UART_TX发送模块数据宽度 |
ASYNC_FIFO_DEPTH | bit | USART_TX和USART_RX中异步FIFO深度 |
2. Design Flow
3. Design Verification
选择参数为
parameter BAUD_RATE = 10000000;
parameter PCLK_FREQ = 50000000;
parameter PADDR_WIDTH = 1;
parameter PDATA_WIDTH = 16;
parameter ASYNC_FIFO_DEPTH = 4096;
回环测试,总体波形图
以及transacript
从log中可以看出写入的数据均被正确读出来了
3.1. APB 握手
波形中可以看出基于APB协议能够实现正确的数据写入和读出