电子说
在当今的通信系统设计中,如何实现高效、稳定的串口通信一直是工程师们关注的核心问题。今天,我将为大家深入剖析一款名为 XR17C152 的 5V PCI 总线双串口通用异步收发传输器(UART)芯片,它在诸多应用场景中都展现出了卓越的性能。
XR17C152 隶属于 Exar 公司的 PCI 总线 UART 系列,是一款将两个增强型 16550 UART 功能与 PCI 本地总线接口、非易失性存储器接口、16 位定时器/计数器、8 个多功能输入/输出以及片上振荡器集成于一体的单芯片解决方案。其设计旨在满足当今 32 位 PCI 总线以及通信系统对高带宽的需求,凭借全局中断源寄存器,能够为两个通道提供完整的中断状态指示,有效加快中断解析的速度。
具备强大的处理能力,能够同时处理两个通道的数据传输,有效提高系统的通信效率。
确保与市场上大多数支持 PCI 总线的设备兼容,提高了芯片的通用性和适用性。
为高速数据传输提供了稳定的时钟信号,保证数据传输的准确性和可靠性。
支持 32 位的数据传输,大幅提高了数据传输速率。同时,EEPROM 接口可用于存储设备的配置信息,实现设备的即插即用功能。
为两个 UART 提供统一的中断管理,方便工程师进行中断处理和系统调度。
支持字节、字和双字的数据传输格式,以及数据的读写突发操作,进一步提高了数据传输的效率。
该接口符合 PCI 本地总线规范 2.2 版本,采用同步时序总线,所有总线事务都与总线时钟相关联。XR17C152 能够在高达 33.34MHz 的总线时钟下稳定工作,支持 8 位、16 位、24 位或 32 位的数据传输格式。其中,32 位数据操作可将总线上的数据传输速率提升至 132MByte/sec,相比 8 位 ISA 总线,使整个系统的通信性能提高了 16 倍。
这些寄存器为 PCI 本地总线操作系统提供了设备的厂商 ID、产品 ID、子厂商 ID、产品型号以及资源和功能等信息。在系统上电或复位后的自动配置阶段,操作系统会收集总线上所有设备的这些数据,然后为每个设备定义并下载操作条件,其中包括将基地址加载到基地址寄存器(BAR)中,确定设备在 PCI 本地总线内存空间中的工作位置。
外部的 93C46 EEPROM 主要用于存储厂商的 ID 和型号,以及子厂商的 ID 和产品型号。这些信息在 PCI 总线的即插即用自动配置过程中发挥着重要作用,能够实现硬件的自动安装。EEPROM 接口由 EEDI、EEDO、EECS 和 EECK 四个信号组成。当应用中不需要自动配置功能时,可不使用 EEPROM;但如果设计需要非易失性存储器用于其他目的,也可以通过特殊的 PCI 设备配置寄存器在 EEPROM 上存储和检索数据。
主要负责为设备在 PCI 本地总线中设置工作环境。其预定义的操作参数会被操作系统中的 PCI 总线即插即用自动配置管理器读取。在收集完总线上所有设备的数据后,操作系统会为每个设备定义并下载内存映射信息,包括设备的操作内存地址位置和条件,其中操作内存映射地址位置会被下载到基地址寄存器(BAR)中。需要注意的是,该自动配置功能仅在使用外部 93C46 EEPROM 时可用。
可直接通过 PCI 数据总线进行访问,方便工程师对设备的一般操作参数进行编程,并监测各种功能的状态。这些寄存器占用 1K 的 PCI 总线内存地址空间,其地址偏移到基本内存地址(即加载到 PCI 本地总线配置寄存器组中的基地址寄存器(BAR)的值)。该寄存器组控制或报告两个通道 UART 的多项功能,如中断控制和状态、16 位通用定时器控制和状态、多功能输入/输出控制和状态、睡眠模式控制、软复位控制以及设备标识和版本等。
XR17C152 拥有一个 32 位宽的寄存器(由 INT0、INT1、INT2 和 INT3 组成),用于提供中断信息,并支持两种中断方案。第一种方案使用 8 位指示器(INT0)的 0 到 1 位分别表示 XR17C152 的通道 0 和通道 1,便于中断程序快速定位并处理相应的 UART 通道。第二种方案则为每个 UART 通道提供详细的中断源信息,所有中断被编码为每个通道的 3 位代码,通过单次 DWORD 读取操作即可获取两个通道的中断状态,有效减少了服务间隔,降低了主机带宽需求。当设备从睡眠模式唤醒时,会产生一个特殊的中断条件,通过读取 INT0 寄存器可清除该中断。
这是一个 16 位的递减定时器,可作为通用定时器或计数器使用。其时钟源可从内部晶体振荡器或外部引脚 TMRCK 中选择,能够设置为单次触发模式或可重触发模式。当定时器超时,可在 INT 寄存器中产生中断。该定时器通过 4 个配置寄存器(TIMERCNTL、TIMER、TIMELSB 和 TIMERMSB)进行控制,可实现启动/停止以及单次触发或可重触发操作。定时器的超时输出可设置为为系统或事件警报生成中断。
还包括 8XMODE 寄存器(用于选择每个 UART 通道的 8X 或 16X 采样率)、RESET 寄存器(可对 UART 进行软件复位)、SLEEP 寄存器(可使每个 UART 单独进入睡眠模式,降低功耗)、DVID 和 DREV 寄存器(分别用于设备标识和版本信息)、REGB 寄存器(可同时对两个 UART 的配置寄存器进行写入控制,还可用于与非易失性存储器设备进行接口)以及多功能输入/输出寄存器(如 MPIOINT、MPIOLVL、MPIO3T、MPIOINV 和 MPIOSEL,用于对 8 个多功能输入/输出引脚进行编程和控制)。
每个 UART 都配备了自己的波特率发生器(BRG)和预分频器,预分频器由 MCR 寄存器中的软件位控制,可将输入的晶体或外部时钟除以 1 或 4。BRG 进一步将时钟除以一个可编程的除数(范围为 1 到 (2^{16}-1)),以获得 16X 或 8X 采样时钟的串行数据速率。该采样时钟用于发送器的数据位移位和接收器的数据采样。在初始化时,必须对 BRG 进行编程,以设置所需的工作数据速率。
发送器部分包括 64 字节的 FIFO、一个字节宽的发送保持寄存器(THR)和一个 8 位的发送移位寄存器(TSR)。在非 FIFO 模式下,THR 从主机接收一个数据字节;在 FIFO 模式下,当 FCR 位 - 0 使能时,THR 从 FIFO 接收数据字节。TSR 以 16X 或 8X 内部时钟将每个数据位移出。发送器会先发送起始位,然后是数据位,根据需要插入奇偶校验位,最后添加停止位。THR 和 TSR 的状态会在线路状态寄存器(LSR 位 - 5 和位 - 6)中报告。
接收器部分包含一个 8 位的接收移位寄存器(RSR)和接收保持寄存器(RHR)。RSR 使用 16X 或 8X 时钟进行定时,在每个数据位的中间位置对输入字符的每一位进行验证和确认。在起始位或假起始位的下降沿,内部接收器计数器开始以 16X 或 8X 时钟速率计数。经过 8 或 4 个时钟周期后,起始位周期应处于起始位的中心位置,此时对起始位进行采样。如果起始位仍为逻辑 0,则认为起始位有效,这种方式可防止接收器组装错误的字符。其余的数据位和停止位也以同样的方式进行采样和验证,以防止错误的帧格式。如果出现任何错误,会在 LSR 位 1 - 4 中报告,并在 IER 位 - 2 使能时立即产生 LSR 中断。从 RHR 卸载接收数据字节后,接收 FIFO 指针会自动更新,LSR 位也会立即更新以反映 RHR 中数据字节的状态。RHR 可在接收到字符时产生接收数据就绪中断,或在达到 FIFO 触发级别时延迟产生中断。此外,当接收数据未达到接收 FIFO 触发级别时,通过接收数据就绪超时功能可确保数据能够可靠地传递给主机,该超时延迟为 4 个字长加上 12 位时间。
自动硬件 RTS/CTS 或 DTR/DSR 流控制用于防止本地接收器 FIFO 和远程接收器 FIFO 发生数据溢出。RTS#/DTR# 输出引脚用于请求远程设备暂停/重新启动数据传输,而 CTS#/DSR# 输入引脚则用于监测以暂停/重新启动本地发送器。这些自动流控制功能可根据具体应用需求单独选择,并通过 EFR 位 - 6 和 7 以及 MCR 位 - 2 进行启用。
每个 UART 都包含一个与 IrDA(红外数据协会)版本 1.0 兼容的红外编码器和解码器。输入引脚 ENIR 可方便地激活两个 UART 通道以启动红外模式,该全局控制引脚会使每个 UART 通道寄存器中的 MCR 位 - 6 功能生效。在系统上电或复位后,软件可根据需要覆盖 MCR 位 - 6 的设置。ENIR 和 MCR 位 - 6 还会在发送器发送数据时禁用接收器,以防止回声数据进入接收器。全局激活 ENIR 引脚可防止在系统启动时红外发射器开启并消耗大量电流。当启用红外功能时,发送数据输出(TX[1:0])将空闲在逻辑 0 电平,同样,接收输入(RX[1:0])将假设为逻辑 0 的空闲电平。红外编码器会为发送数据流中的每个“0”位发送一个 3/16 位宽的脉冲,这种信号编码方式可减少红外 LED 的导通时间,从而降低功耗。红外解码器会从 RX 引脚的红外感应二极管接收输入脉冲,每次检测到光脉冲时,会将逻辑 0 返回给数据流。通过内部寄存器设置,可在将 RX 输入信号传递给解码器之前对其进行反相,以支持市场上某些提供反相输出的红外模块。
每个 UART 通道都具备内部环回功能,可用于系统诊断。通过将 MCR 寄存器位 - 4 设置为逻辑 1 可启用该模式。在内部环回模式下,所有常规 UART 功能正常运行,发送移位寄存器的输出数据会内部路由到接收移位寄存器的输入,使系统能够接收自己发送的数据。此时,TX、RTS# 和 DTR# 引脚保持高电平(空闲或未激活状态),而 CTS#、DSR#、CD# 和 RI# 输入将被忽略。
在开始从任何 UART 通道的特殊接收 FIFO 数据和状态寄存器(通道 0 的地址为 0x180)卸载数据之前,建议先对设备配置寄存器中的设备 ID(DVID)寄存器进行一次虚拟读取。这样,在后续多次读取特殊接收 FIFO 数据和状态寄存器时,只要在数据卸载期间不访问其他寄存器(除了 DVID 寄存器),就不会出现字节交换问题。如果必须访问其他寄存器,只需再次对 DVID 寄存器进行虚拟读取,然后继续进行数据卸载操作。
// 示例:使用中断服务卸载接收数据
void receive_data_service_routine() {
// 读取全局中断寄存器 INT0
uint32_t int0 = read_register(0x080);
if (int0 & 0x01) { // 检查通道 0 是否有中断
// 读取 DVID 寄存器
read_register(0x8D);
uint32_t data_with_status;
do {
// 读取特殊接收 FIFO 数据和状态寄存器
data_with_status = read_register(0x180);
// 处理数据和状态
process_data(data_with_status);
} while (data_with_status & 0x01); // 检查 LSR 状态字节的位 - 0
}
}
// 处理数据和状态的函数
void process_data(uint32_t data_with_status) {
uint8_t data = data_with_status & 0xFF;
uint8_t lsr_status = (data_with_status > > 8) & 0xFF;
// 根据 LSR 状态处理数据
if (lsr_status & 0x01) {
// 数据就绪,处理数据
handle_received_data(data);
}
// 处理其他 LSR 状态
if (lsr_status & 0x02) {
// 溢出错误
handle_overrun_error();
}
// 其他错误处理...
}
在这个示例中,我们定义了一个中断服务程序 receive_data_service_routine,用于处理接收数据的中断。首先,读取全局中断寄存器 INT0 检查通道 0 是否有中断。如果有中断,读取 DVID 寄存器以确保后续数据读取的正确性。然后,循环读取特殊接收 FIFO 数据和状态寄存器,直到数据读取完毕(通过检查 LSR 状态字节的位 - 0)。在 process_data 函数中,我们将数据和 LSR 状态分离,并根据 LSR 状态进行相应的处理。
XR17C152 作为一款功能强大、性能卓越的 5V PCI 总线双 UART 芯片,在通信系统设计中具有广泛的应用前景。通过对其特性、功能和编程方法的深入了解,工程师们可以充分发挥该芯片的优势,设计出更加高效、稳定的通信系统。在实际应用中,我们需要根据具体的需求合理配置芯片的寄存器和功能,同时注意硬件电路的设计和编程过程中的细节,以确保系统的可靠性和稳定性。希望本文能对大家在使用 XR17C152 进行设计时提供一些帮助,如果你有任何疑问或建议,欢迎在评论区留言交流。
全部0条评论
快来发表一下你的评论吧 !