我的微控制器上没有 UART,那么如何添加一个?

电器工程 微控制器 UART
2022-01-18 14:34:05

我正在使用ATMEGA32HVB微控制器,它具有电池平衡功能,我们可以通过它串联 4 节电池并一次使用一个。这对电源管理非常有用,所以我不能使用不同的微控制器。请提出一些添加UART的方法,以便我可以轻松地连接到串行设备。

4个回答

正如其他人所指出的,您可以向系统添加额外的硬件以提供 UART 功能,也可以在软件中模拟一个。如果您可以控制整体硬件设计并且可以选择添加另一个 IC,我会强烈考虑基于硬件的方法。您当然可以使用bit-banging使软件 UART 工作,但您可能不想将 CPU 资源专用于生成所需的时序。

从数据表一目了然,您的微控制器似乎同时具有 SPI 和 I2C(Atmel 将其称为双线接口 (TWI))。这些可能是用于连接外部 UART 的最佳接口。所述设备可从许多制造商处获得。一些例子:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) 提供一系列 SPI/I2C 1 和 2 通道 UART 设备,涵盖 ~1.6- 3.3V 工作范围。我没有专门使用这些部件中的任何一个,但我过去使用过 Exar 设备(带有并行内存总线接口),它们运行良好。

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) 有一系列 SPI/I2C UART/IrDA/GPIO 设备可用,也在 1- 和 2 -在几个电压范围内的通道品种。我过去曾广泛使用这些部件(特别是 SC16IS762)并取得了巨大的成功。

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) 拥有 MAX3110E 和 MAX3111E 器件,它们是 SPI 连接的 UART。这些设备的一个独特功能是它们具有集成的 RS-232 线路驱动器。因此,如果您需要 UART 连接到使用 RS-232 线路电压而不是逻辑电平的设备(例如 PC),这可能会很有用,因为它可以避免您在板上添加另一个线路驱动器 IC。

如果您正在寻找硬件解决方案,Maxim 有几个带有 SPI 接口的 UART IC 到微控制器(包含在您的部件中)。在此处查看 MAX3100 或其他选项:http: //www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm

您将需要使用软件 UART 驱动程序。根据您对该 UART 的期望,您可以使用AVR305(非常紧凑,但除了阻塞半双工发送/接收之外没有其他功能)、AVR274(中断驱动,功能相当完整),您可以编写自己的软件 UART 驱动程序或您可以使用在互联网上找到的一个,例如通过谷歌搜索“avr software uart”

关于软件“UART”设计的简要说明:根据要求,至少可以采用不同的方法:

  • “接管一切”位爆炸驱动程序将禁用所有中断并使用循环计数代码为每个位计时。使用“接管一切”驱动程序接收数据要求当数据到达时,控制器除了等待之外什么都不做。

  • “接管主循环”位爆炸驱动程序的行为与上述非常相似,只是它将使用计时器资源进行位计时而不是循环计数。不需要太长时间服务的中断可以保持启用状态。对于串行传输,固定速率的定时器资源可以与其他用途共享;然而,对于串行接收,bit-bang 驱动程序必须能够在起始位到达时重新加载计时器,以使其在每个传入位时间的中间到期。

  • 完全中断驱动的 bit-bang 驱动程序使用固定速率定时器,该定时器以数据速率的某个倍数运行,最好是(3x 和 5x 都优于 4x),并通过该定时器完成所有操作。这样的驱动程序可以与其他所有驱动程序同时运行,但需要比以前的驱动程序类型更快的 CPU。

为了避免前两种类型的控制器永远等待可能永远不会到来的数据,读取例程通常包含一个超时值。请注意,如果控制器的循环确实“在等待长达 100 毫秒的同时获取一个字节,如果没有,则执行其他操作,然后获取下一个字节,等等。” 在“get”例程超时和控制器再次开始等待之间有一个字节到达,该字节将丢失;它与之通信的设备将不得不期待这种可能性。

只有第三种类型的驱动程序能够处理在传输数据字节时数据字节开始到达的可能性。但是,如果控制器只需要在说话时说话,则前两种样式可以用于某些全速全双工通信协议。诀窍是有一个“读取和写入数据”例程,它将等待传入的起始位,当检测到一个开始位重叠时,控制器会在即将检查传入数据时发送每个位。一旦控制器检测到输入的起始位,它将准确地知道何时应该查找下一个 8 个数据位和停止位,从而知道它可以安全地使用其间的时间来输出自己的数据。

分页说明:使用前两种位爆炸 uart 中的一种来接收数据的控制器必须在下一个字节的起始位下降沿之前处理每个字节的数据,以避免数据丢失。如果控制器知道处理将花费至少半位时间,它可以通过在获取最后一个数据位后立即接受每个字节而不是等待停止位来最大化可用于处理的时间。然而,作为给控制器更多时间的另一种方法,让为其提供数据传输的设备使用两个停止位而不是一个停止位可能会有所帮助。如果可以配置“标记奇偶校验”,那将增加另一个额外的位时间。在例如 115200-8-M-2 上的传输将允许比 57600-8-N-1 更多的处理时间,即使它提供数据的速度是 1.6 倍以上。