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


13

我使用的是ATMEGA32HVB微控制器,该微控制器具有用于电池电量平衡的功能,通过该功能我们可以串联4个电池,一次只能使用一个。这对于电源管理非常有用,因此我不能使用其他微控制器。请提出一些添加UART的方法,以便我可以轻松地连接到串行设备。


11
如user26129所述,软件UART方式称为位冲击
Johan.13年

4
只是我非常主观的$ 0.02,但我通常更希望使用单独的专用电池控制器和uC集成的UART,而不是相反的方式。为什么需要将电池管理集成到uC中?
梅尔斯,2013年

我必须使用可充电电池,这些电池将通过太阳能电池板充电,因此我需要串联使用4个电池组,一次只能使用一次
user27475 2013年

4
一个问题是您要使用UART多少个方向。如果您只想生成一个偶然的调试或状态消息,那么在您的处理器没有太多额外需求的时候,位撞击串行输出可能会非常吸引人。有一些滴答声,例如使用针脚更改中断,它们也可以减少具有输入通道的平均负载,但是如果您希望在有其他实时承诺的同时接收高波特率的字符,则可能是一个问题。
克里斯·斯特拉顿

Answers:


17

正如其他人指出的那样,您可以在系统中添加其他硬件以提供UART功能,也可以在软件中进行仿真。如果您可以控制总体硬件设计,并且可以选择添加另一个IC,那么我将强烈考虑基于硬件的方法。您当然可以使用位冲击使软件UART正常工作,但是您可能不想将CPU资源专用于生成所需的时序。

从数据表的外观看,您的微控制器似乎同时具有SPI和I2C(Atmel称之为两线接口(TWI))。这些可能是用来连接外部UART的最佳接口。所述装置可从许多制造商处获得。一些例子:

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

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

  • Maximhttp://www.maximintegrated.com/datasheet/index.mvp/id/2052)具有MAX3110E和MAX3111E器件,它们是SPI连接的UART。这些设备的独特之处在于它们具有集成的RS-232线路驱动器。因此,如果您需要UART与使用RS-232线路电压而不是逻辑电平的设备(例如PC)接口,那么这可能会很有用,因为它将避免您在板上添加其他线路驱动器IC。


哇,我不知道Maxim有这些东西,如果可以的话,会加2。
Tevo D


8

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


3

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

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

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

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

为了避免前两种样式的控制器永远等待可能永远不会出现的数据,读取例程通常会包含一个超时值。请注意,如果一个控制器的循环执行例如“在等待最多100ms的同时获取一个字节,如果没有出现则进行其他处理,然后获取下一个字节,以此类推”。并且在“获取”例程超时与控制器再次开始等待之间到达一个字节,该字节将丢失;与之通信的设备必须期待这种可能性。

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

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


1

您只需使用uC的I / O引脚即可。只有在这些引脚上切换或传输数据时,才应使引脚频率倍增至波特率。这就是UART通常的工作方式,它将在中间对位信号进行采样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.