1

当我尝试使用 Silicon Labs CP210x USB 转 UART 桥接器接收 USART 信号时。我唯一收到的是:

<0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0 ><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>< 0>等

我选择了正确的设置:波特率: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
    }
} 

代码来源:http ://morf.lv/modules.php?name=tutorials&lasit=29

4

1 回答 1

4

回顾讨论,以便以后对某人有用。

如果您有示波器,请为简单的测试用例捕获轨迹,就像 @DrOctorooi 对“@~00”所做的那样: 在此处输入图像描述

他标记了开始位和停止位,还有数据位(对于串行/UART,它们首先是最不重要的)

这证实了 UART 以某种方式工作。

还应确认电压水平。0-3.2V 看起来差不多。

和时基。在捕获的轨迹上,显示 1 位需要 1.625 毫秒,这意味着波特率约为 615。这与预期的 9600 相差甚远。事实上,这大约慢了 16 倍。

由于错误与时间有关,因此直接的问题是 MCU 时钟和 UART 时钟分频器(以及更复杂的设备,以及中间分频器和时钟)。

事实证明,分频器是为 32MHz 时钟设计的,但是这个 MCU 在复位时有一个 2MHz 的时钟(慢 16 倍,正如我们在上面看到的)。解决方案是重新计算分频器。

于 2015-10-27T15:04:27.243 回答