短:
查看ATMEGA16U2固件(https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c)我发现,当您配置/更改USB仿真的串行端口,USART被重置。即使打开Arduino串行监视器(必须配置串行速度等),也会发生这种情况。这会导致您的峰值。
长:
看一下功能:
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
在那里,您会看到几行之后,它通过将其寄存器清零来重置USART:
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
在当前ATMEGA16U2数据表的第168页上,您会发现通过设置UCSR1B的第3位(TXEN1),可以使能发送器,从而覆盖正常的端口操作(即,它变为输出)。引用数据表:
将该位写为1将启用USART发送器。使能后,发送器将覆盖TxDn引脚的正常端口操作。发送器的禁用(将TXENn写入零)在正在进行的和挂起的发送完成之前(即,当发送移位寄存器和发送缓冲寄存器不包含要发送的数据时)将不会生效。禁用后,发送器将不再覆盖TxDn端口。
因此,通过写操作,UCSR1B = 0;
您将不再覆盖将用作输入的TXD1引脚。
ATMEGA16U2 TXD连接到ATSAM3X8E的RX线。在正常工作中,在启用UART的情况下,如果没有数据传输,则该线将保持高电平。如果禁用UART,则该特定行将不再是驱动程序为1。由于初始化代码未在该引脚上设置上拉电阻(并且两者均未配置为输出),因此该引脚将变为浮空输入,并且将有任何泄漏到该引脚。 GND或什至探头的输入阻抗(在您的引脚和GND之间)将使逻辑电平缓慢变为0。
要解决此问题,您应该:1)修改ATMEGA16U2固件,方法是将该PIN设置为OUTPUT,值为1。2)修改ATMEGA16U2固件,通过使能该引脚的上拉功能。3)(建议)在ATSAM3X8E的RX线上启用上拉。