最近的项目使用SPI总线进行 SDRAM读写,这里总结下常用的接口和通信协议UART,SPI,I2C
常用的接口和通信协议
- 串行通信 VS 并行通信
- 异步通信 VS 同步通信
- 单工 VS 半双工 VS 全双工
- 常见接口
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190707161504553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY4Mzk5Mw==,size_16,color_FFFFFF,t_70)
UART
协议层:数据格式
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190707161702672.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY4Mzk5Mw==,size_16,color_FFFFFF,t_70)
- 串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bps(位/秒)
- 常用的波特率有9600、19200、38400、57600以及115200等。
物理层:接口标准
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190707161854465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjY4Mzk5Mw==,size_16,color_FFFFFF,t_70)
代码说明
- 可以根据实际应用设置不同波特率。
- 串口接收为了防止干扰,对于每一位信号进行6次采样,取出次数最多的电平作为最终结果,因此采样时钟是波特率的16倍
串口发送代码
module uart_byte_tx(
Clk, //50M时钟输入
Rst_n, //模块复位
data_byte, //待传输8bit数据
send_en, //发送使能
baud_set, //波特率设置
Rs232_Tx, //Rs232输出信号
Tx_Done, //一次发送数据完成标志
uart_state //发送数据状态
);
input Clk;
input Rst_n;
input [7:0]data_byte;
input send_en;
input [2:0]baud_set;
output reg Rs232_Tx;
output reg Tx_Done;
output reg uart_state;
reg bps_clk; //波特率时钟
reg [15:0]div_cnt;//分频计数器
reg [15:0]bps_DR;//分频计数最大值
reg [3:0]bps_cnt;//波特率时钟计数器
reg [7:0]r_data_byte;
localparam START_BIT = 1'b0;
localparam STOP_BIT = 1'b1;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
uart_state <= 1'b0;
else if(send_en)
uart_state <= 1'b1;
else if(bps_cnt == 4'd11)
uart_state <= 1'b0;
else
uart_state <= uart_state;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
r_data_byte <= 8'd0;
else if(send_en)
r_data_byte <= data_byte;
else
r_data_byte <= r_data_byte;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
bps_DR <= 16'd5207;
else begin
case(baud_set)
0:bps_DR <= 16'd5207;
1:bps_DR <=