Получение только "<0><0><0><0><0><0><0>" по сигналу USART

Когда я пытаюсь получить сигнал USART с моего моста Silicon Labs CP210x USB to UART. Единственное, что я получаю, это:

<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. Test_LED (см. Код ниже) на порту E, контакт 0 работает. Я использовал осциллограф, чтобы проверить сигнал 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

1 ответ

Подведем итоги обсуждения, так что это может пригодиться кому-то позже.

Если у вас есть осциллограф, запишите трассировку для простого тестового случая, как @DrOctorooi сделал с "@~00":

Он отметил начальные и конечные биты, а также биты данных (для последовательного /UART они наименее значимы в первую очередь)

Это подтверждает, что UART как-то работает.

Следует также подтвердить уровни напряжения. 0-3,2 В выглядит примерно так.

И база времени. На захваченном графике он показывает, что 1 бит занимает 1.625 мс, что означает скорость передачи около 615. Это довольно далеко от ожидаемого 9600. Фактически, это примерно в 16 раз медленнее.

Так как ошибка связана со временем, непосредственными вопросами являются тактовый генератор MCU и тактовый разделитель UART (и на более сложных устройствах, а также промежуточные делители и тактовые генераторы).

Получается, что делители были предназначены для тактовой частоты 32 МГц, но этот MCU имеет тактовую частоту 2 МГц, когда он выходит из режима сброса (в 16 раз медленнее, как мы видели выше). Решением было пересчитать делители.

Другие вопросы по тегам