STM32F103ZET6 5串口通信问题

STM32F103ZET6 5串口通信问题
STM32F103ZET6 5串口通信问题

STM32F103ZET6 5串口通信问题

今天调试成功STM32F103ZET6 5串口通信,其中主要是注意点是:

1、USATR1和USATR2,USATR3,UATR4,UA TR5挂载的时钟不一样,第一个挂载在

APB2上,其余四个挂载在APB1上;例如:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //USART1时钟配置

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //USART2时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //USART3时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); //UART4时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE); //UART5时钟配置;

2、如上例中红色字显示一样,UART4和UART5是不一样的,

UART:universal asynchronous receiver and transmitter通用异步收发器

USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器。一般而言,单片机中,名称为UART的接口一般只能用于异步串行通讯,而名称为USART的接口既可以用于同步串行通讯,也能用于异步串行通讯。

下面贴出我的代码:

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

void USART_Configuration(void);

int main(void)

{

RCC_Configuration(); //系统时钟初始化

GPIO_Configuration();//端口初始化

USART_Configuration();

NVIC_Configuration();

while(1);

}

void RCC_Configuration(void)

{

SystemInit();//72m

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //USART2时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //USART2,3端口复用;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //USART1端口复用;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //USART3时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); //UART4时钟配置;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE); //UART5时钟配置;}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//LED

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//USA TR2_TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//USA TR2_RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA TING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//USA TR3_TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//USA TR3_RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA TING;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//UA TR4_TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//UA TR4_RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA TING;

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//USA TR5_TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//USA TR5_RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA TING;

GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //LED1

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //LED0

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOE,&GPIO_InitStructure);

}

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

//USART2的中断优先级配置

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//USART3的中断优先级配置

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//USART4的中断优先级配置

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//USART5的中断优先级配置

NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

//USART2的串口配置

USART_https://www.360docs.net/doc/b09193994.html,ART_BaudRate=9600;

USART_https://www.360docs.net/doc/b09193994.html,ART_WordLength=USART_WordLength_8b;

USART_https://www.360docs.net/doc/b09193994.html,ART_StopBits=USART_StopBits_1;

USART_https://www.360docs.net/doc/b09193994.html,ART_Parity=USART_Parity_No;

USART_https://www.360docs.net/doc/b09193994.html,ART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_https://www.360docs.net/doc/b09193994.html,ART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_Init(USART2,&USART_InitStructure);

USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

USART_Cmd(USART2,ENABLE);

USART_ClearFlag(USART2,USART_FLAG_TC);

//USART3的串口配置

USART_https://www.360docs.net/doc/b09193994.html,ART_BaudRate=9600;

USART_https://www.360docs.net/doc/b09193994.html,ART_WordLength=USART_WordLength_8b;

USART_https://www.360docs.net/doc/b09193994.html,ART_StopBits=USART_StopBits_1;

USART_https://www.360docs.net/doc/b09193994.html,ART_Parity=USART_Parity_No;

USART_https://www.360docs.net/doc/b09193994.html,ART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_https://www.360docs.net/doc/b09193994.html,ART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_Init(USART3,&USART_InitStructure);

USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

USART_Cmd(USART3,ENABLE);

USART_ClearFlag(USART3,USART_FLAG_TC);

//USART4的串口配置

USART_https://www.360docs.net/doc/b09193994.html,ART_BaudRate=9600;

USART_https://www.360docs.net/doc/b09193994.html,ART_WordLength=USART_WordLength_8b;

USART_https://www.360docs.net/doc/b09193994.html,ART_StopBits=USART_StopBits_1;

USART_https://www.360docs.net/doc/b09193994.html,ART_Parity=USART_Parity_No;

USART_https://www.360docs.net/doc/b09193994.html,ART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_https://www.360docs.net/doc/b09193994.html,ART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_Init(UART4,&USART_InitStructure);

USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);

USART_Cmd(UART4,ENABLE);

USART_ClearFlag(UART4,USART_FLAG_TC);

//USART5的串口配置

USART_https://www.360docs.net/doc/b09193994.html,ART_BaudRate=9600;

USART_https://www.360docs.net/doc/b09193994.html,ART_WordLength=USART_WordLength_8b;

USART_https://www.360docs.net/doc/b09193994.html,ART_StopBits=USART_StopBits_1;

USART_https://www.360docs.net/doc/b09193994.html,ART_Parity=USART_Parity_No;

USART_https://www.360docs.net/doc/b09193994.html,ART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_https://www.360docs.net/doc/b09193994.html,ART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_Init(UART5,&USART_InitStructure);

USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);

USART_Cmd(UART5,ENABLE);

USART_ClearFlag(UART5,USART_FLAG_TC);

}

一下为中断代码:

void USART2_IRQHandler(void)

{

u32 k;

if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)

{

k=USART_ReceiveData(USART2);

if(k =='a')

{

GPIO_ResetBits(GPIOE,GPIO_Pin_5);

USART_SendData(USART2,'1');

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

}

else

{

GPIO_SetBits(GPIOE,GPIO_Pin_5);

USART_SendData(USART2,'3');

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

}

}

}

void USART3_IRQHandler(void)

{

u32 k;

if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)

{

k=USART_ReceiveData(USART3);

if(k =='c')

{

GPIO_ResetBits(GPIOE,GPIO_Pin_5);

USART_SendData(USART3,'1');

while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);

}

else

{

GPIO_SetBits(GPIOE,GPIO_Pin_5);

USART_SendData(USART3,'3');

while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);

}

}

}

void UART4_IRQHandler(void)

{

u32 k;

if(USART_GetITStatus(UART4,USART_IT_RXNE)!=RESET)

{

k=USART_ReceiveData(UART4);

if(k =='c')

{

GPIO_ResetBits(GPIOE,GPIO_Pin_5);

USART_SendData(UART4,'1');

while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)==RESET);

}

else

{

GPIO_SetBits(GPIOE,GPIO_Pin_5);

USART_SendData(UART4,'3');

while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)==RESET);

}

}

}

void UART5_IRQHandler(void)

{

u32 k;

if(USART_GetITStatus(UART5,USART_IT_RXNE)!=RESET)

{

k=USART_ReceiveData(UART5);

if(k =='c')

{

GPIO_ResetBits(GPIOE,GPIO_Pin_5);

USART_SendData(UART5,'1');

while(USART_GetFlagStatus(UART5,USART_FLAG_TXE)==RESET);

}

else

{

GPIO_SetBits(GPIOE,GPIO_Pin_5);

USART_SendData(UART5,'3');

while(USART_GetFlagStatus(UART5,USART_FLAG_TXE)==RESET);

}

}

}

基于FPGA串口通信的电路和程序设计

中北大学 毕业设计中期总结 学生姓名:袁财源学号:1206044145 学院:仪器科学与技术 专业:电子科学与技术 设计题目:基于FPGA串口通信的 电路和程序设计 指导教师: 郭涛 2015 年1月5日

毕业设计中期总结

1.开题以来所做的具体工作和取得的进展或成果(方案、图纸、代码等支撑,任务书要求与已完成工作对照表) 1.设计方案 RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道,在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。使用RS232串口通信接口模块的目的是用于电平转换。由于FPGA输出的TTL电平与串口发送的电平不一致,因此,采用电平转换器MAX232。MAX232是一种双组驱动器/接收器,片内含有一个电容性电压发生器,以便在单5V 电源供电时提供EIA/TIA-232-E电平,来实现RS232信号和单片机串口信号之间的电平转换。其工作电压3.0-5.5V,可将TTL电平转换成RS-232标准电平。从而实现了FPGA 与上位机之间的串口通信。 FPGA上位机 MAX232 电路主要框图 2.相关知识

MAX232芯片结构 第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v 和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14脚(T1OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。 第三部分是供电。15脚GND、16脚VCC(+5v)。 RS232 (DB9)引脚定义 1 :DCD :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。 2 :RXD:此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD 指示灯在闪烁,说明RXD引脚上有数据进入。 3 :TXD:此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD 指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。 4 :DTR:数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。 5 :GND:信号地;此位不做过多解释。 6 :DSR:数据设备就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。 7 :RTS:请求发送;此脚由计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。 8 :CTS: 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。 9 :RI : Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定。

基于FPGA的通用异步收发器设计(串口通信)

FPGA串行通用异步收发器设计 实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法; 3、学习用FPGA实现接口电路设计。 实验内容: 本实验目标是利用FPGA逻辑资源,编程设计实现一个串行通用异步收发器。实验环境为EDA实验箱。电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。 1、UART简介 UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。 UART的基本特点是: (1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。 (8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。 FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块; 2、模块设计:

串行通信接收接口(LED)

串行通信接收接口(LED) 基本要求:掌握RS232串口的协议,运用DE2的串口进行接收PC的数据。波特率为9600,8位数据位,无奇偶校验,一个停止位。 硬件验证要求:在PC机通过“串行通信调试助手”软件 发送数据,DE2通过串口接收数据,完成接收数据后在LED上面进行显示。 在完成基本要求的基础上,可以通过拨码开关来选择奇偶校验的类别。 分频模块流程图: 分频模块的程序 module clk_div (clk_in,nreset,clk_out); input clk_in; input nreset; output clk_out; reg clk_out=0;

reg [8:0]cnt=0; parameter T = 217; always @(posedge clk_in or negedge nreset) begin if(nreset == 0) begin cnt <= 0; clk_out <= 0; end else if(cnt == T) begin clk_out <= ~clk_out; cnt <=0; end else cnt<=cnt+1; end endmodule 发送模块的程序: module rx(clk,nreset,rxd,data); input clk,rxd,nreset; //clk=0.1152MHz output [7:0] data; reg [3:0] t; reg [3:0] s; reg [7:0] data0; reg [7:0] data; always @(posedge clk or negedge nreset ) //baud=9600hz if(nreset ==0) begin data <= 8'h00; s <= 0; t <= 0; data0 <= 8'h00; end else begin case(s) 0:if(rxd==1) begin s<=1;t<=0;end 1:if(rxd==0) begin s<=2;t<=t+1;end 2:if(t==6)begin if(rxd==0) begin s<=3;t<=0;end

串口通信实验讲解

课程名称:Zigbee技术及应用实验项目:串口通信实验指导教师: 专业班级:姓名:学号:成绩: 一、实验目的: (1)认识串口通信的概念; (2)学习单片机串口通信的开发过程; (3)编写程序,使单片机与PC通过串口进行通信。 二、实验过程: (1)根据实验目的分析实验原理; (2)根据实验原理编写C程序; (3)编译下载C程序,并在实验箱上观察实验结果。 三、实验原理: 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干条控制信号线。因为一次只能传送一位,所以对于一个字节的数据,至少要分8位才能传送完毕,如图3-1所示。 图2-1串行通信过程 串行通信制式: (1)单工制式 这种制式是指甲乙双方通信时只能单向传送数据,发送方和接收方固定。 (2)半双工制式 这种制式是指通信双方都具有发送器和接收器,即可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送。

(3)全双工制式 这种制式是指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,因此全双工制式可实现甲乙双方同时发送和接收数据,发送时能接收,接收时能发送。 三种制式分别如图3-2所示 图3-2串行通信制式 3.1硬件设计原理 CC2530有两个串行通信接口USART0和USART1,两个USART具有同样的功能,可已分别运行于UART模式和同步SPI模式。 CC2530的两个串行通信接口引脚图分布如表3-1所示 表3-1 CC2530串行通信口引脚图分布 本实验CC2530模块使用的是USART1的位置2,P1_6和P1_7。

基于fpga的串口通信

基于FPGA的串口通信设计 学号: 姓名: 班级: 指导教师: 电子与控制工程学院

一、串行通信系统 1.1概述 在计算机系统和微机网络的快速发展领域里串行通信在数据通信及控制系统中得到广泛的应用。UART 即Universal AsynchronousReceiver Transmitter 通用异步收发器 协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议 在实际工业生产中有时并不使用UART的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是UART的三个核心功能模块 利用Verilog-HDL语言对这三个功能模块进行描述并加以整合UART是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口 一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件 这类芯片已经相当复杂有的含有许多辅助的模块 如FIFO有时我们不需要使用完整UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog -HDL将UART的核心功能集成从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术 基于FPGA/CPLD器件设计与实现UART。 通信指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法使用何种媒质 将信息从某方准确安全传送到另方。通信在不同的环境下有不同的解释在出现电波传递通信后通信(Communication)被单一解释为信息的传递是指由一地向另一地进行信息的传输与交换其目的是传输消息。然而通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。在各种各样的通信方式中利用“电”来传递消息的通信方法称为电信(Telecommunication) 这种通信具有迅速、准确、可靠等特点且几乎不受时间、地点、空间、距离的限制 因而得到了飞速发展和广泛应用。 1.2串行通信简介 计算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信并行通信依靠I/O接口来实现。并行通信中数据有多少位就需要多少条信号传输线。这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信通常传送距离小于30米。当距离大于30米时则多采用串行通信方式串行通信是指外部设备和计算机间使用一根数据线另外需要地线可能还需要控制线进行数据

RS232串行接口实现GPIB接口的发送和接收

摘要:本文的目的是利用一台电脑RS232串行接口实现GPIB接口的发送和接收,并有能力跟RS232及周边设备的GPIB进行连接。其主要特点在于串行通信的波特率可以由用户和被自动化的数据流调整。 1、引言 如今,越来越多的测试和测量仪器可连接到通用接口总线(GPIB),这使该技术的掌握和交流更为容易。所以,必须有一个GPIB接口。在一般情况下,如果该仪器是基于个人计算机(PC ),则现有的PCI-GPIB卡或USB接口的GPIB卡都可以使用,但成本较高。此外,有大部分是基于微控制器上的,它有RS232接口但不具备PCI或USB接口。因此,RS232 - GPIB接口是一种扩大GPIB的功能的低成本的解决方案。尽管还有一些的RS232- GPIB卡,我们证实简化RS232 - GPIB接口架构和加快串行通信的速度可以来满足更高的要求。 2硬件设计研究的RS232 - GPIB接口 2.1硬体架构的界面 该RS232 - GPIB接口,其核心部分是8051单片机,有两个端口,一个是RS232端口另一个是GPIB的端口。它不仅可以通过RS232串口端口连接PC,而且还可以连接其他设备来扩大GPIB接口。串行设备为了满足不同波特率的串行传输,可以由用户来设置波特率。此外,在数据量和处理速度的基础上数据流可以自动控以确保数据传输的可靠性。除微控制器外最重要的部分是RS232 - GPIB接口的TNT4882 GPIB接口芯片。 2.2 TNT4882使用范围 国际TNT4882提供了一个单片机向GPIB发送/接收的接口。它有三个不同的内部硬件架构:单芯片模式,涡轮7210模式,与Turbo 9914模式。其中第一个芯片的模式是最简单和最快的TNT4882体系机构,其中先入先出(先进先出)缓冲器的TNT4882是直接连接到GPIB 的。它可以很容易地接到任何16 或8位微处理器。除了一个40 MHz的时钟电路外,TNT4882可以直接连接到GPIB的。 在设计方面,bus B(D7类- 0 )的TNT4882是用于8位输入/输出通道,连接到8051数据总线。32个寄存器分别位于8051外部数据存储器和32字节输入/输出内存0x00 ? 0x1f 。该TNT4882可以中断处理器断言其中断信号INTR以及哪些是活跃高的。因为8051的IRQ线是低作用的,所以INTR以及信号TNT4882必须倒置,然后连接到一个可用的中断线路。因此,一个通用阵列逻辑(GAL器件)芯片是用来锁存地址总线信号,并产生了积极的CSN和中断信号。此外,max708是用来复位的8051微控制器和TNT4882 。 2.3波特率调整和串行通信的流量控制串行通信 RS232 - GPIB接口可通过一个RS-232C电缆连接到串口设备。由于串行通信设备的波特率相关性,连接到8051单片机端口1的一组交换机的波特率可以从1200到115200中设置。 作为核心部分的RS232 - GPIB接口,8051单片机串行通信提供与RXD (串行输入端口)边和TXD脚发送(串行输出端口)密码的功能。无流量控制线定义了RS232系列的标准,当在处理时间内接收缓冲区满或没有接收准确的数据时,数据可能会丢失。为了提高传输的可靠性,免插脚的8051采用硬件握手方式,以允许或拒绝转让信息请求。硬件握手功能始终活跃在串行数据传输。该p1.0的8051 ,被作为RTS的信号线来连接到一级转换芯片的RS232连接器的CTS线9针的标准。当RTS的路线是中断的,它表明RS232 - GPIB接口准备好从串行设备中接收数据。同时,以串口设备接收和发送的信号作为CTS的信号。如果

串口通信实验

实验报告(附页) 一、实验内容 1、串口通信设置: 波特率为115200bps, 数据位为8位,停止位为1位; 2、按键传输数据到串口助手显示; (1)按1,串口显示:“This is Key 1”; D5亮 (2)按2,串口显示:“This is Key 2”; D6亮 (3)按3,串口显示:“This is Key 3”; D7亮 (4)按4,串口显示:“This is Key 4”; D8亮 (5)按“*”Key ,串口显示“All LEDs is Closed” ; 灯全灭; (6)按其它Key,串口显示:”Wrong Key” 3、通过串口小肋手,向实验设备发送信息: 发送字符:”D5”、”D6”、”D7”、”D8” ,则对应的D5、D6、D7、D8亮;若发送“5”、“6”、“7”、“8”则对应的D5、D6、D7、D8灭,如发送其它字符,则在串口助手中显示:“Error Code”; 二、实验方法 (1)利用参考代码构建工程。 (2)编写实验要求的实现实验要求的功能。 (3)连接实验箱,写入程序,测试代码。 三、实验步骤 1)正确连接JLINK 仿真器到PC 机和stm32 板,用串口线一端连接STM32 开发板,另一端连接PC 机串口。 2)用IAR 开发环境打开实验例程:在文件夹05-实验例程\第2 章\2.3-uart 下双击打开工程uart.eww,Project->Rebuild All 重新编译工程。 3)将连接好的硬件平台通电(STM32 电源开关必须拨到“ ON”),接下来选择Project->Download and debug 将程序下载到STM32 开发板中。4)下载完后可以点击“Debug”->“Go”程序全速运行;也可以将STM32 开发板重新上电或者按下复位按钮让刚才下载的程序重新运行。 5)通过串口小助手检验实验结果 四、实验结果 Main函数 #include"stm32f10x.h"

串口通信FPGA实现

FPGA设计与应用 串口通信实验报告 班级:1105103 姓名:苏林效 学号:1110510321 日期:2014年10月29日

实验性质:验证性实验类型:必做 开课单位:电信院学时:2学时 一、实验目的 1、了解串口通信的基本原理; 2、掌握锁相环的基本原理和使用方法; 3、掌握起始位和停止位的含义及实现方法; 4、掌握VHDL状态机的基本使用方法; 5、掌握基本的接口设计和调试技巧; 二、实验准备 2.1 串口通信原理(1分) 串口通信是以字节为单位,按位传输数据和接收数据的。 先看一下发送数据:串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等),之后进行传输,①当没有数据传输的时候,发送端向数据线上发送“1”;②当要传输数据时,发送端先发送一个“0”来表示要传输数据了,这样当接收端检测到“0”便可以知道有数据到来了;③开始传输后,数据以约定的速度和格式传输;④每次传输完成一个字节之后,都在其后发送一个停止位“1”。这样,发送数据就结束了。 再来看接收数据,初始状态是等待状态,接收的一直是“1”,当检测到0时进入检验状态,在检验状态下如果再检测到0(一般采用过采样)则进入接收数据状态,当接收完8位比特数后判断是否有停止位,如果有则此字节接收结束,重新进入等待状态准备接受下一字节。 2.2 锁相环的基本原理(1分) 锁相环是以锁定输入载波信号的相位为目标的一种载波环实现形式。它由三部分组成:鉴相器(PD)、环路滤波器(LPF)和压控振荡器(VCO)。如上图。 锁相环的工作原理:压控振荡器的输出经过采集并分频,后与基准信号同时

输入鉴相器。鉴相器通过比较上述两个信号的相位差,输出结果通过环路滤波器,滤除噪声和高频分量,然后输出一个直流脉冲电压,用它来控制VCO ,使它的频率改变,使()lim 0c p t θ=。经过较短时间后,VCO 的输出稳定于某一值。环路一旦进入锁定状态后,压控振荡器的输出信号与环路的输入信号(参考信号)相位时刻保持一致。 三、代码及测试 3.1程序及分析(2分) 顶层原理图如上所示,主要包括三个模块,锁相环(输出57.69MHz )、分频(输出接受时的10倍采样速率和数码管显示速率)、接受(按57.6kbps 接受从串口发来的数据)。 分频模块代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DIV IS PORT(CLK : IN STD_LOGIC; --锁相环输出时钟57.69M COUT1 : OUT STD_LOGIC; --分频器输出采样时钟576k COUT2 : OUT STD_LOGIC);

串行通信技术-模拟信号转换接口

微机原理与应用实验报告6 实验9 串行通信技术 实验10A 模拟信号转换接口 实验报告

实验九串行通信技术 一、实验目的 1. 了解异步串行通信原理; 2. 掌握MSP430异步串行通信模块及其编程方法; 二、实验任务 1. 了解MSP430G2553实验板USB转串口的通信功能,掌握串口助手的使用 (1)利用PC机的串口助手程序控制串口,实现串口的自发自收功能 为实现PC串口的自发自收功能,须现将实验板上的扩展板去下,并将单片机板上的BRXD和BTXD用杜邦线进行短接,连接图如下所示: 由此可以实现PC串口的自收自发功能。 (2)思考题:异步串行通信接口的收/发双方是怎么建立起通信的 首先在异步通信中,要求接收方和发送方具有相同的通信参数,即起始位、停止位、波特率等等。在满足上面条件的情况下,发送方对于每一帧数据按照起始位数据位停止位的顺序进行发送,而接收方则一直处于接受状态,当检测到起始位低电平时,看是采集接下来发送方发送过来的数据,这样一帧数据(即一个字符)传送完毕,然后进行下一帧数据的接受。这样两者之间就建立起了通信。 2. 查询方式控制单片机通过板载USB转串口与PC机实现串行通信 (1)硬件连接图

(2)C语言程序 采用SMCLK=1.0MHz时,程序如下:

其中SMCLK=1MHz,波特率采用的是9600,采用低频波特方式,则N=1000000/9600=104.1666…,故UCA0BR1=0,UCA0BR0=104,UCBRS=1; 当采用外部晶振时,时钟采用默认设置即可,程序如下:

也是采用了低频波特率方式,所以关于波特率设置的相关计算和上面是一样的。 (3)思考:如果在两个单片机之间进行串行通信,应该如何设计连线和编程? 由于在上面的连线中将单片机上的P1.2和BRXD相连,P1.1和BTXD相连,所以若要在两个单片机之间进行通信,首先应该将两个单片机的P1.2和P1.1交叉相连,并根据上面的程序进行相同的关于端口和波特率相关的设置即可实现两个单片机之间的通信。 3. (提高)利用PC机RS232通信接口与单片机之间完成串行通信 (1)硬件连接图 在实验时,采用了将PC机的串口com1直接连接至MSP430F149的孔型D9连接器上,G2553单片机的输出引脚P1.1和P1.2分别与F149单片机上的URXD1和UTXD1相连接,连接图如下所示:

FPGA串口通信汇总

FPGA实验报告 目录 FPGA实验报告 (1) 目录 (1)

基于VHDL的串口通信实现设计 (3) 摘要 (3) 正文 (3) 1.研究背景知识 (3) 1.1串口简介 (3) 1.2串口通信参数 (3) 2.系统整体设计 (5) 2.1 系统框图 (5) 2.2原理图 (5) 2.3管脚介绍: (6) 3. 系统模块设计 (6) 3.1分频模块 (6) 3.11流程图 (6) 3.12程序 (7) 3.2接收模块 (8) 3.21流程图 (8) 3.22程序 (9) 3.3发送模块 (10) 3.31流程图 (10) 3.32程序 (11) 4. 系统调试 (12) 4.1 时序调试 (12) 4.2硬件调试 (13) 5.总结 (14)

基于VHDL的串口通信实现设计 摘要 串口是计算机上一种非常通用设备通信的协议,其特点是通信线路简单,成本低,特别适用于远距离通信,因此有较为广泛的应用。为了深入了解串口,本课程设计基于VHDL语言,利用FPGA开发板实现了板间串口通信。在程序设计中,考虑到串口波特率、数据格式等参数,共采用了四个模块:分频模块(即波特率产生模块),接受模块,发送模块,显示模块。通过软件和开发板调试,实现了板和串口调试助手收发数据,软件改变波特率等参数,并在数码管显示的功能。 关键词:串口VHDL FPGA 分频接收发送显示 正文 1.研究背景知识 1.1串口简介 串行接口Serial Interface是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。 串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式。 1.2串口通信参数 双方为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: 1.数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位

FPGA与单片机实现数据RS232串口通信的设计

FPGA与单片机实现数据RS232串口通信 的设计 发布时间:2010-9-2 发布人:21世纪电子网 摘要:本文针对由FPGA构成的高速数据采集系统数据处理能力弱的问题,提出FPGA与单片机实现数据串行通信的解决方案。在通信过程中完全遵守RS232协议,具有较强的通用性和推广价值。 1 前言 现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU系统来实现数据的处理功能,这就使FPGA系统与其他CPU系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。 整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA 波特率发生控制模块,FPGA总体接口模块以及单片机数据接收模块。本文着重对FPGA数据发送模块实现进行说明。 2 FPGA数据发送模块的设计 根据RS232 异步串行通信来的帧格式,在FPGA发送模块中采用的每一帧格式为:1位开始位 8位数据位 1位奇校验位 1位停止位,波特率为2400。本系统设计的是将一个16位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧,再发送高位帧,在传输数据时,加上文件头和数据长度,文件头用555555来表示,只有单片机收到555555时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL源程序。 Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity atel2_bin is port( txclk: in std_logic; --2400Hz的波特率时钟 reset: in std_logic; --复位信号 din: in std_logic_vector(15 downto 0); --发送的数据 start: in std_logic; --允许传输信号 sout: out std_logic --串行输出端口 ); end atel2_bin; architecture behav of atel2_bin is signal thr,len: std_logic_vector(15 downto 0); signal txcnt_r: std_logic_vector(2 downto 0); signal sout1: std_logic;

串口通信测试方法

串口通信测试方法 1 关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2 实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种

约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC 机与单片机之间进行通信,在设计过程中,有如下约定:

串口通信实验报告全版.doc

实验三双机通信实验 一、实验目的 UART 串行通信接口技术应用 二、实验实现的功能 用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。 三、系统硬件设计 (1)单片机的最小系统部分 (2)电源部分 (3)人机界面部分

数码管部分按键部分 (4)串口通信部分 四、系统软件设计 #include #define uchar unsigned char #define uint unsigned int void send(); uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示 sbit H1=P3^6; sbit H2=P3^7;

sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; uint m=0,i=0,j; uchar temp,prt; /***y延时函数***/ void delay(uint k) { uint i,j; //定义局部变量ij for(i=0;i

{ m=1; //KEY1键按下 return(m); } if(H2==0) { m=4; //KEY4键按下 return(m); } } } if(L2==0) { delay(5); if (L2==0) { L2=0;H1=1;H2=1; if(H1==0) { m=2; //KEY2键按下 return(m); } if(H2==0) { m=5; //KEY5键按下 return(m); } } } if(L3==0) { delay(5); if (L3==0) { L3=0;H1=1;H2=1; if(H1==0) { m=3; //KEY3键按下

基于FPGA的串口控制器设计

基于FPGA的串口控制器设计 简介 使用硬件描述语言 (HDL) 设计和开发验证FPGA的成为当前的主流因素。使用行为级描述不只增加了产品的设计效率,也在设计中有独特的验证方式。目前最流行的HDL语言为Verilog 和 VHDL。这篇文章将会举例说明用 Verilog语言的设计和验证数字异步串行收发器UART。 UART介绍 通用异步串行收发器UART中有二个独立的VHDL模块。一个模块实现发射功能, 当另一个实现接收功能,发射和接收功能模块在顶端设计时组合到一起使用,接收和发射的组合是通信通道所必需的。数据写入发射器,从接收器读出,所有的数据是以二进制8字节的信号通过CPU接口。在顶端设计时,地址有发射器映射,而且接收器通道能容易地建立从儿进入接口,两者工用一个称为mclkx 16主控时钟,在每个模块中 mclkx 16 被分成独立的波特率时钟。 UART的功能概况 UART的基本功能概况见下表. 在左边显示传输保持记录,移位记录,传输控制时钟,全部集中在发射机的txmit端。在右边的是显示接收移位寄存器, 接收记录和控制逻辑时钟,所有都包含在接收模块的rxcver端,这两个模组都单独的投入与产出,大部分的控制线,只有双向数据总线, 主时钟和复位线共享的模块。

顶层UART系统的I/O功能描述 UART的标准数据格式 图3显示了UART的串行数据格式,串行数据包含在帧8个数据字节,以及编码信息比特,在连续传输线路高通,在传输初始化时开始低一点.,接下来的低一点开始到8比特的数据信息, 低位对于后边高位有重要的作用。然后后边的8 bits数据进行奇偶校验 ,反馈8位数据的结果。 UART时序图 下面显示怎么将从寄存器里出来的数据写给移位寄存器,并在上升沿速率时钟时,转向tx输出。 发送时间如下表,如何得到数据从rx传输到接收移位寄存器然后存储。

串口通信发送接口-(LED)

硬件描述语言设计报告设计题目串行通信接收接口(LED) 学院电子信息学院 班级电子101 姓名梁嘉诚 学号1011002006 设计时间2013年1月7~11日

引言: 随着计算机系统的应用和微机网络的发展,通信功能越来越显的重要。这里所说的通信是只计算机与外界的信息交换。因此,通信既包括计算机与外部设备之间,也包括计算机和计算机之间的信息交换。由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微机应用系统常用的接口。 许多外设和计算机按串行方式进行通信,这里所说的串行方式,是指外设与接口电路之间的信息传送方式,实际上,CPU与接口之间仍按并行方式工作。 RS-232C标准的全称是EIA-RS-232C标准(Electronic Industrial Associate-Recommended Standard 232C)是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。232标准与CCITT的V.24基本相同。 它适合于数据传输速率在0~20,000bit/s范围内、传输距离在15m以内的通信。由于通信设备厂商大都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机串行通信接口中广泛采用。 RS-232C标准最初是为远程通信连接数据终端设备DTE与数据通信设备DCE而制定的。因此,这个标准的制定,并未考虑计算机系统的应用要求。但目前它又广泛地被借来用于计算机(更准确地说,是计算机接口)与终端或外设之间的近端连接标准。很显然,这个标准的有些规定及定义和计算机系统是不一致的,甚至是相矛盾的。 RS-232C标准中所提到的“发送”和“接收”,都是站在DTE的立场上,而不是站在DCE的立场来定义的。由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,因此双方都能发送或接收 通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,一般个人计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。 RS-232 标准规定的数据传输速率为每秒150、300、600、1200、2400、4800、9600、19200波特。 RS-232 标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。 设计原理: 串行通信是指使用一条数据线(另外需要地线,可能还需要控制线),将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。

UART串口通信实验报告

实验四UART串口通信 学院:研究生院学号:1400030034姓名:张秋明 一、实验目的及要求 设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就就是“通用异步收发器”。 二、实验原理 UART就是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输与接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器与其它器件,如EEPROM通信。 UART作为异步串口通信协议的一种,工作原理就是将传输数据的每个字符一位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以就是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它就是一个字符数据的结束标志。可以就是1位、1、5位、2位的高电平。由于数据就是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅就是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但就是数据传输率同时也越慢。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:就是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就就是120baud,比特率就是120*8=960bit/s。这两者的概念很容易搞错。 三、实现程序 library ieee; use ieee、std_logic_1164、all; use ieee、std_logic_arith、all; use ieee、std_logic_unsigned、all; entity uart is port(clk : in std_logic; --系统时钟 rst_n: in std_logic; --复位信号 rs232_rx: in std_logic; --RS232接收数据信号; rs232_tx: out std_logic --RS232发送数据信号;); end uart; architecture behav of uart is

基于FPGA的串口通信电路设计与实现

基于FPGA的串口通信电路设计与实现 发表时间:2018-11-07T09:39:41.587Z 来源:《防护工程》2018年第17期作者:马龙[导读] 由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。 陕西烽火电子股份有限公司陕西宝鸡 721000 摘要:由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。在工业监控和实时监控系统中得到了广泛应用。由于监测设备的增加。PC机原有的串口不能再满足通信的需求,传统的设计方法是使用硬件扩展八个串口,但是额外增加了硬件设计成本和实际编程的难度。然而FPGA的UARTIP可灵活定制的优点使得基于黜的设计方法无需额外的硬件串口扩展,减少了硬件开发调试的难度,同时满足串行传输的要求。基于此,本文主要对基于FPGA的串口通信电路设计与实现进行分析探讨。 关键词:基于FPGA;串口通信;电路设计;实现 1、前言 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是作为专用集成电路领域中一种半定制电路出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA中具有丰富的触发器和I/O口,采用描述语言(VHDL和VerilogHDL)进行设计,用户可以根据需要,描述出具有各种功能的电路。基于以上原因,我们可以利用FPGA实现多串口通信中的数据转换和中断控制功能,从而简化电路、缩小PCB面积,也可以很方便的进行升级改动和模块移植。 2、设计要求 整个设计的硬件电路以DSP和FPGA为主构架,DSP和FPGA之间通过DSP的EMIF接口连接。其中,DSP是主处理器,用于实现串口数据的处理,FPGA作为DSP的外围电路,实现UART模块的串行数据的接收和发送、数据的串并/并串转换及接收中断的产生,同时,实现多串口的中断控制功能。当有接收数据时,FPGA通过中断方式通知DSP。 UART模块的数据格式:波特率可以按标准波特率设置;按字节接收,每个字节前包含一个起始位(低电平,逻辑值0),无校验位,最后是一位停止位和不定长度的空闲位(高电平,逻辑值1);接收到一个完整字节后产生一个中断(高电平,逻辑值1),当数据被读取后,中断信号复位(低电平,逻辑值0)。中断控制器应能实现8路UART模块的中断接收和处理,最后给DSP输出一个中断信号,输入的各中断信号之间无优先级设定。 3、设计方案 完整的设计由时钟管理模块、接口模块、UART模块和中断控制器组成。时钟管理模块产生设计中所需各种时钟,包括主处理时钟和接收与发送的波特率时钟;接口模块实现DSP和FPGA之间的中断、读写功能;UART模块由接收和发送子模块组成,实现数据的串行接收和串行发送功能;中断控制器由中断采样子模块和中断处理子模块组成,实现8路UART中断接收和处理功能。下面分别对这些模块的设计给予描述。 3.1 时钟管理模块 设输入FPGA的时钟为50MHz,则主处理时钟设计为50MHz。U A R T 的接收和发送采用相同的波特率进行,本设计中采用115200b/s进行收发,这就需要对50MHz时钟进行分频以产生所需的波特率。 3.2 接口模块 接口模块连接时钟管理模块、UART模块和中断处理器,并与DSP采用EMIF总线相连接。与DSP相关的信号有:wr_n、rd_n、cs_n、addrs、data_bus和dsp_int,在cs_n和wr_n有效时,DSP通过addrs选通不同的UART模块,将需要发送的并行数据发送给发送寄存器,执行发送功能。DSP响应外部中断时,在cs_n和rd_n有效时,通过addrs读取中断控制器的中断矢量和UART模块接收的数据。 3.3 UART模块 3.3.1 发送模块 根据UART模块的数据格式,发送状态机如图1所示。

相关文档
最新文档