处理器如何与串行设备通信?

问题描述 投票:0回答:1

外部电路是否将来自串行设备的信息放入ram中的已知位置以供处理器读取?如果是这样,怎么办?涉及哪些电路和芯片?

来自串行设备的数据会触发处理器中断吗?如果是这样,怎么办?再次涉及到哪些电路和芯片?

例如,我查看了诸如ICL3221CAZ-T之类的芯片,该芯片似乎给了我两个用于连接至串行设备的引脚,两个用于内部通信。看起来这些被称为“ TTL / CMOS兼容的发送器输入”。使用简单的Intel 8086处理器,我该如何谈这些事情?

这如何与标准c库输入流链接在一起?

assembly serial-port x86-64
1个回答
3
投票

使用简单的Intel 8086处理器...

首先提供一些背景信息:

原则上,一个简单的8位CPU(如6502或6800)通过将“数据总线”的8条线设置为代表数字0x12的组合和16条线,将值0x12写入地址0x3456。 “地址总线”到代表数字0x3456的组合。然后,CPU在“写入”线上输出电压脉冲。 RAM收到此脉冲后,会将值0x12写入地址0x3456。

从RAM读取的工作原理类似:CPU仅设置“地址总线”的导线,并在“读取”的导线上产生脉冲。然后,RAM将“数据总线”的8条线设置为代表存储在地址0x3456中的值的组合。

当然,您也可以在CPU上连接不同的IC,所以地址0到0x3FFF是RAM,而地址0x4000到0x40FF是串行设备。

ARM CPU(在许多手机或Raspberry Pi中都可以找到它们)仍然可以这种方式。

请注意,8086并不像您想象的那么简单:它比6800或6502复杂得多!

x86 CPU具有特殊的地址范围,称为“ I / O端口”。从软件角度来看,访问此地址范围的方式与访问RAM中的地址不同。但是,从硬件的角度来看,这不过是一个不同的地址范围,访问该地址的方式就像访问RAM中的地址一样。

涉及哪些电路和芯片?

首先,您具有“片选”逻辑。该逻辑由简单的门(例如“与”或“或非”门)以及更复杂的逻辑IC(例如74LS138)组成。该逻辑的作用是根据信号生成“选择”特定芯片的信号。

示例:如果地址在0到0x3FFF的范围内,则逻辑将控制RAM的导线设置为“低”;否则将这根线设置为“高”。如果导线为“高”,则RAM知道数据传输将用于另一个芯片。

对于串行数据传输,使用UART IC(如8250)。这样的IC通常覆盖具有多个地址的地址范围。通过将值写入某些地址,您可以控制IC(例如波特率)。通过将值写入某个地址,您可以发送数据。

这些芯片已经产生并接收串行信号。

[不幸的是,这些IC使用0V作为“ 0”,使用5V作为“ 1”,但RS-232标准使用-9V作为“ 1”,而+ 9V作为“ 0”。

“收发器”(如ICL3221CAZ-T用于将0V / 5V串行信号转换为+ 9V / -9V串行信号。

在现代计算机中,较大的芯片(例如“南桥”)包含早期计算机中很多芯片的功能。

来自串行设备的数据会触发处理器中断吗?如果是这样,如何?

这取决于UART芯片的类型及其与CPU的连接方式。

在8086 PC中,UART芯片会将“中断”输出设置为特定电压。这可以通过“可编程中断控制器”(如8259)来识别。然后,该芯片将向8086 CPU发送一些信号。这些信号包含已触发中断(串行IC之一)的信息。

这如何与标准c库输入流链接在一起?

取决于您的计算机的构造。如果您有一台不使用“ I / O端口”地址范围的计算机,则可以通过直接写入某个地址来访问UART芯片。示例:

*(unsigned short *)0x4003 = 0x13;

当今许多微控制器都是这种情况。对于较旧的非x86兼容计算机,它也是标准配置。

如果有PC,则使用需要特殊说明的“ I / O端口”地址范围访问UART。许多MS-DOS编译器的C库以及Linux内核的库均具有此类说明。它们不是“标准C”功能,但它们特定于操作系统。

Windows编译器没有这些说明,因为Windows使用保护机制,该机制不允许程序访问“ I / O端口”地址范围。

如果要编写操作系统并想访问UART,则可能必须使用汇编器。

© www.soinside.com 2019 - 2024. All rights reserved.