繁体   English   中英

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

[英]How does a processor talk to a serial device?

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

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

例如,我看过 ICL3221CAZ-T 等芯片,它似乎给了我两个引脚来连接到我的串行设备,两个引脚用于内部通话。 看起来这些被称为“TTL/CMOS 兼容的发送器输入”。 使用一个简单的 Intel 8086 处理器,我如何让这些东西说话?

这一切如何与标准 c 库输入流联系起来?

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

先来一些背景资料:

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

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

当然,您也可以将不同的 IC 连接到 CPU,因此地址 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,你可能必须使用汇编程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM