【发布时间】:2016-01-25 14:24:54
【问题描述】:
当我尝试使用 Silicon Labs CP210x USB 转 UART 桥接器接收 USART 信号时。我唯一收到的是:
等
我选择了正确的设置:波特率:9600 数据位:8 奇偶校验:无停止位:1
我使用的是 ATmega128A3U。端口 E 引脚 0 上的 test_LED(参见下面的代码)正在工作。我用示波器检查了UART信号。看图在这里:http://imgur.com/dPxkdZ6
有人知道解决方案吗?
有人知道如何解决框架错误吗? (我的 UART 软件出现此错误)
代码:
#define F_CPU (32000000UL) // CPU clock speed
#include <avr/io.h>
#include <util/delay.h>
void USARTF0_init() {
USARTF0_BAUDCTRLB = 0; //BSCALE is 0
USARTF0_BAUDCTRLA = 0xCF; //BSEL is 207
USARTF0_CTRLA = 0; //Disable interrupts
USARTF0_CTRLC = USART_CHSIZE_8BIT_gc; //8 data bits, no parity and 1 stop bit
USARTF0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; // //Enable receive,transmit and high speed mode
PORTF_OUTSET = PIN3_bm; // Port F pin 3 as TX
PORTF_DIRSET = PIN3_bm; // TX pin as output
PORTF_OUTCLR = PIN2_bm; // Port F pin 2 as RX
PORTF_DIRCLR = PIN2_bm; // RX pin as input
}
void sendChar(char c) {
while( !(USARTF0_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTF0_DATA = c;
}
void sendString(char *text) {
while(*text) {
sendChar(*text++);
}
}
int main(void) {
USARTF0_init();
PORTE.DIRSET = PIN0_bm; // make port E pin 0 output (test_LED)
while(1)
{
_delay_ms(10);
sendString("Hello World!\n\r");
PORTE.OUTTGL = PIN0_bm; // test_LED Toggle
}
}
【问题讨论】:
-
嗯,你可以看到一些信号被发送到UART线。检查范围跟踪。您应该能够快速计算出时钟速率(它会确认它是否真的是 9600)并将数据解码为 ASCII。另一方面,也许您只是在 USB UART 桥接器上混淆了 RX/TX 引脚。
-
感谢您的回复。我已将字符串更改为“@~00”,因此信号更短。这个 ASCII 字符:@ = 01000000 ~ = 01111110 0 = 00110000 imgur.com/vAQH85M 在这张图片中,您可以看到除了最后一个字符之外,每个字符后面都有“10”。这是停止位吗?为什么最后一个字符没有停止位?我还检查了位时间,这应该是 104 微秒,但是当我计算位时间时,它是 608 微秒。我怎样才能解决这个问题?请回复
-
很好,这最后一张照片做得很好。位看起来不错。 1 个起始位(低),位 LSB 在前,1 个停止位(高)。
-
我不确定您是如何计算位长的。如果所有 4 个字节都是 62.5ms,那么 1 位应该在 62.5/40.0 = 1.56 左右。这意味着波特率为 1/0.00156 = 641 波特。如果我换一种方式,1 位 608us,这意味着波特率为 1/0.000608 = 1644 波特。无论哪种方式,您的波特率似乎都不正确 - 检查 F_CPU 和波特率分频器。
-
感谢您的回复。你说的对。我的计算是错误的。所以应该是这样的:imgur.com/eXftd43green:起始位;蓝色:停止位。我的 F_CPU 应该是 32 MHz,因为我使用的是 ATxmega128A3U,并且看不到分频器有任何问题。 :(
标签: microcontroller uart usart tx