当我尝试使用Silicon Labs CP210x USB到UART桥接器接收USART信号时。我收到的唯一一件事是:
&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT ;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&LT 0 GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;&℃,GT;等等
我选择了正确的设置:波特率:9600个数据位:8个奇偶校验:无停止位:1
我使用的是ATmega128A3U。端口E引脚0上的test_LED(参见下面的代码)正在工作。我用示波器检查了uart信号。见图:http://imgur.com/dPxkdZ6
有人知道这方面的解决方案吗?
有谁知道如何修复框架错误? (我的UART软件发出此错误)
CODE:
#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
}
}
答案 0 :(得分:3)
回顾讨论,以便稍后对某人有用。
如果您有示波器,请捕获一个简单测试用例的跟踪,就像@DrOctorooi使用“@ ~00”一样:
他标记了起始位和停止位,以及数据位(对于串行/ UART,它们首先是最不重要的)
这证实了UART在某种程度上有效。
还应该确认电压水平。 0-3.2V看起来是正确的。
时间基础。在捕获的跟踪上,它显示1位需要1.625ms,这意味着波特率约为615.这远远低于预期的9600.实际上,这大约慢了16倍。
由于错误与时间有关,因此当前的问题是MCU时钟和UART时钟分频器(以及更复杂的器件,中间分频器和时钟)。
事实证明,分频器适用于32MHz时钟,但该MCU在复位时的时钟频率为2MHz(如上所述,速度慢16倍)。解决方案是重新计算分隔线。