16550求助

lzero13199 lzero13199 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
实现16550串口双机通讯
我现在只想简单的实现一个机子发,另一个机子收
以下是源程序
发送机程序:
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADD EQU 0034H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 021H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 020H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0DFH ;INTR对应的中断屏蔽字
PCI_INTCSR EQU 0EC38H ;PCI卡中断控制寄存器地址
IOY0 EQU 0E000H ;片选IOY0对应的端口始地址
;****************************************************************
MY16550_0 EQU IOY0+00H*4 ;16550数据缓冲寄存器端口地址
MY16550_1 EQU IOY0+01H*4 ;16550中断允许寄存器端口地址
MY16550_3 EQU IOY0+03H*4 ;16550线路控制寄存器端口地址
MY16550_5 EQU IOY0+05H*4 ;16550线路状态寄存器端口地址

STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS

DATA SEGMENT
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

START: MOV AX,DATA
MOV DS,AX
CLI

MOV DX,MY16550_3 ;设置16550线路控制寄存器
MOV AL,80H ;准备设置波特率除数寄存器
OUT DX,AL

MOV DX,MY16550_0 ;设置除数寄存器低字节0CH
MOV AL,0CH ;000C对应9600 bit/s
OUT DX,AL

MOV DX,MY16550_1 ;设置除数寄存器高字节00H
MOV AL,00H
OUT DX,AL

MOV DX,MY16550_3 ;设置线路控制寄存器,初始化数据格式
MOV AL,1BH ;偶校验,1位停止位,字符宽度为8
OUT DX,AL

MOV DX,MY16550_1 ;设置中断允许寄存器
MOV AL,00H ;不允许接收缓冲寄存器满产生中断
OUT DX,AL

STI

MOV SI,3000H ;建立缓冲区,存放输入键值
MOV AL,00H
MOV [SI],AL

LOP:
MOV AH,08H ;判断PC键盘是否有按键按下
INT 21H

CMP AL,1BH ;是否是ESC退出
JZ QUIT

MOV [SI],AL ;保存输入键值
MOV DL,AL
MOV AH,02H ;显示键值
INT 21H

LL: MOV DX,MY16550_5 ;查询方式
IN AL,DX
TEST AL,20H ;是否可发送
JNZ SEND
JMP LL
SEND: MOV DX,MY16550_0
MOV AL,[SI]
OUT DX,AL
JMP LOP
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
CODE ENDS
END START

接收机程序:
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADD EQU 0034H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 021H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 020H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0DFH ;INTR对应的中断屏蔽字
PCI_INTCSR EQU 0EC38H ;PCI卡中断控制寄存器地址
IOY0 EQU 0E000H ;片选IOY0对应的端口始地址
;****************************************************************
MY16550_0 EQU IOY0+00H*4 ;16550数据缓冲寄存器端口地址
MY16550_1 EQU IOY0+01H*4 ;16550中断允许寄存器端口地址
MY16550_3 EQU IOY0+03H*4 ;16550线路控制寄存器端口地址
MY16550_5 EQU IOY0+05H*4 ;16550线路状态寄存器端口地址

STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS

DATA SEGMENT
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

START: MOV AX,DATA
MOV DS,AX
CLI

MOV DX,MY16550_3 ;设置16550线路控制寄存器
MOV AL,80H ;准备设置波特率除数寄存器
OUT DX,AL

MOV DX,MY16550_0 ;设置除数寄存器低字节0CH
MOV AL,0CH ;000C对应9600 bit/s
OUT DX,AL

MOV DX,MY16550_1 ;设置除数寄存器高字节00H
MOV AL,00H
OUT DX,AL

MOV DX,MY16550_3 ;设置线路控制寄存器,初始化数据格式
MOV AL,1BH ;偶校验,1位停止位,字符宽度为8
OUT DX,AL

MOV DX,MY16550_1 ;设置中断允许寄存器
MOV AL,00H ;不允许接收缓冲寄存器满产生中断
OUT DX,AL

STI
CHECK: MOV AH,01H ;判断PC键盘是否有按键按下
INT 16H
JNZ QUIT
MOV DX,MY16550_5
IN AL,DX
TEST AL,01H ;是否可接收
JNZ RECEIVE
JMP CHECK
RECEIVE: MOV DX,MY16550_0
IN AL,DX
MOV DL,AL
MOV AH,02H
INT 21H
JMP CHECK
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
CODE ENDS
END START

现在的问题是,发送机可以正常显示键入的字符,接收机貌似也可以接收,但是接收机显示乱码。。。。。为什么会显示乱码呢?
...全文

相关推荐

UART16550技术文档

为芯片提供时钟信号UART16550芯片的寄存器包括:* 16550A兼容寄存器:包括数据寄存器、状态寄存器、控制寄存器等* 调试寄存器:用于调试UART16550芯片的操作UART16550芯片的操作模式包括

qdsuper

ZYNQ axi uart16550 IP核扩展485接口使用

UART16550除了拥有AXI UART Lite的全部功能外,还提供1.5bit和2bit停止位,在可配置波特率的基础上还可以使用外部时钟供给串口接收模块,经测试发现,其波特率可以达到linux中tty设备定义的最大波特率,也就是4.5Mbps。5,将启动文件复制到SD卡,打开PC端的串口调试助手,查看/dev下的文件,可以看到系统中多了ttyS0~ttyS15,本次系统中可以使用的是ttyS2~ttyS11, 因为在aliases节点下ARM端的两个串口已经占用了serial0和serial1。

寒听雪落

16550_serpi-master_16550_16550驱动_linux串口_UART16550_

在Linux操作系统中,对16550串口驱动的支持是通过内核驱动程序来实现的,这个驱动程序使得用户可以利用16550 UART进行数据传输。

慕酒

16550串口芯片

驱动器禁止信号输出DDIS:每当CPU从16550读取数据时,DDIS=0。其余时候均为高电平,禁止挂在CPU与16550之间的数据线上的收发器与16550通信。

changwenchao2008

uart_16550

16550是UART的一种经典实现,它在80年代由Intel公司推出,相比于早期的8251等UART,16550提供了更高的数据传输速率和更丰富的功能。

xingkong052465
评论 7
收藏 已收藏
分享
返回顶部
lzero13199
汇编语言 21,500 成员 41,619 内容