2015-10-26 10 views
1

При попытке получить сигнал USART с моей Silicon Labs CP210x USB в UART Bridge. Единственное, что я получаю это:только прием "<0><0><0><0><0><0><0>" на 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 , 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

+0

Ну, вы можете видеть, что какой-то сигнал отправляется на линию UART. Проверьте трассировку области.Вы должны быстро вычислить тактовую частоту (и это подтвердит, действительно ли это 9600), а также декодировать данные в ASCII. С другой стороны, возможно, вы просто перепутали контакты RX/TX на мосту USB UART. – domen

+0

Спасибо за ваш ответ. Я изменил строку на «@ ~ 00», чтобы сигнал был короче. Эти символы в ASCII: @ = 01000000 ~ = 01111110 0 = 00110000 http://imgur.com/vAQH85M На этой картинке вы можете увидеть, что каждый персонаж получает "10" за ним, за исключением последнего , Это стоповый бит? Почему последний символ не получает бит остановки? Также я проверил bittime, это должно быть 104 мкс, но когда я вычисляю bittime, это 608 мкс. Как я могу это исправить? Пожалуйста, ответьте – DrOctorooi

+0

Ницца, хорошая работа на этом последнем снимке. Биты выглядят хорошо. 1 бит начала (низкий), бит LSB сначала, 1 стоповый бит (высокий). – domen

ответ

2

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

Если у вас есть осциллограф, записи трассировки для простого теста, так как @DrOctorooi сделал с «@ ~ 00»: enter image description here

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

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

Необходимо также подтвердить уровни напряжения. 0-3.2V выглядит правильно.

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

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

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

Смежные вопросы