|
MSP430F449 UART работает только на 19200 |
|
|
|
Jun 21 2010, 06:58
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 22-06-09
Пользователь №: 50 523

|
Чип MSP430F449IPZ, кварцевый резонатор PK-206 32.768MHz. Комп <-RS232-> MSP430F449 <-> Внешнее устройство С компа передаются данные на внешнее устройство через плату с MSP, внешнее устройство отправляет по запросу данные назад на ПК. В программе начинаю так и все работает: Код #include <msp430x44x.h>
#define P1ON 0x90 #define P2ON 0x60 #define DTR1 0x02 #define DTR2 0x01
void main(void) { WDTCTL = WDTPW + WDTHOLD;
// FLL module FLL_CTL0 |= XCAP0PF; FLL_CTL1= XT2OFF; //SMCLK - on, XT2 - off, MCLK - DC0CLK, SMCLK -DCOCLK, ACLK devider 1 FLL_CTL0 = DCOPLUS; SCFQCTL = 128-1; SCFI0 = FLLD_2 +FN_2; // DCO 1.4 - 12 MHz (FLLD_2 +FN_2) // FLL module
// Порты на комп UCTL0=SWRST; UTCTL0 = SSEL1; // UCLK = SMCLK UBR10 = 0x01; // 8MHz 19200 UBR00 = 0xA0; // 8MHz 19200 UMCTL0 = 0xBB; // 8MHz 19200 UCTL0 = 0x10; // 8n1 P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD P2DIR |= 0x10; // P2.4 output ME1 |= UTXE0 + URXE0; // вкл USART0 TXD/RXD UCTL0 &= ~SWRST; IE1 |= URXIE0; // вкл USART0 RX interrupt
//Внешнее устройство UTCTL1 = SSEL1; // UCLK = SMCLK UBR11 = 0x01; // 8MHz 19200 UBR01 = 0xA0; // 8MHz 19200 UMCTL1 = 0xBB; // 8MHz 19200 UCTL1 = 0x10; // 8n1 P4SEL = 0x03; // P4.0,1 = USART1 TXD/RXD P4DIR = 0xFD; // P4.1 output ME2 |= UTXE1 + URXE1; // USART1 TXD/RXD IE2 &= ~0x30; // откл RxTx interrupts
P4OUT = 0x50; // откл RX and TX
BTCTL = BT_ADLY_125; // BT_fLCD_DIV128 SVSCTL = 0x70; // SVS 2.65 volt
P1IE = DTR1+DTR2; // вкл INT at port 1 and port 2 IE2 |= BTIE; // вкл basic timer WDTCTL = WDT_ARST_1000; // Start WDT (1sec) IE1 |= 0x01; // вкл WDT interrupt;
_EINT(); }
#pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { IFG1 &= ~URXIFG0; while ((IFG2 & UTXIFG1) == 0); TXBUF1 = RXBUF0; }
#pragma vector=UART1RX_VECTOR __interrupt void usart1_rx (void) { IFG2 &= ~URXIFG1; while ((IFG1 & UTXIFG0) == 0); TXBUF0 = RXBUF1; }
#pragma vector=BASICTIMER_VECTOR __interrupt void RTC(void) { IFG2 &= ~BTIFG; // Reset WotchDog Timer WDTCTL = WDT_ARST_1000; } Пытаюсь менять строки: Код UBR10 = 0x01; // 8MHz 19200 UBR00 = 0xA0; // 8MHz 19200 UMCTL0 = 0xBB; // 8MHz 19200 На другую скорость, при этом передаются иероглифы. Пробовал но нескольким файлам расчетов этих параметров. Наверно затупил где-то?
|
|
|
|
|
Jun 21 2010, 08:12
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ArtemTom @ Jun 21 2010, 10:58)  Пробовал но нескольким файлам расчетов этих параметров. Наверно затупил где-то? Наверняка. У меня 115200 от 2МГц спокойно работало на 149-м, без всяких выкрутасов. Не думаю, чтобы в 449 что-то сильно поменялось.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 09:54
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 22-06-09
Пользователь №: 50 523

|
Код while ((IFG2 & UTXIFG1) == 0); Эти чтоль? Как по мануалу, ждём Ready. Да и не в большой скорости дело, просто не могу настроить скорость отличную от 19200. Хотя может быть проблема и во внешнем устройстве.
|
|
|
|
|
Jun 21 2010, 10:14
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ArtemTom @ Jun 21 2010, 13:54)  Код while ((IFG2 & UTXIFG1) == 0); не могу настроить скорость отличную от 19200. Ну так приведите пример, для какой скорости чего настраивали. Хотя я не понимаю, какие могут быть проблемы - входную тактовую частоту UART поделить на битрейт и разнести по двум байтам Цитата(Xenia @ Jun 21 2010, 12:55)  Так у вас же ОЖИДАНИЯ торчат в процедурах обработки прерываний! Это может повлиять на задержки между байтами, но не на формат кадра - то есть были бы пропуски, но между правильными символами
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 10:32
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(MrYuran @ Jun 21 2010, 14:14)  Это может повлиять на задержки между байтами, но не на формат кадра - то есть были бы пропуски, но между правильными символами Это влияет на учет числа принимаемых/отсылаемых байт. Пока МК в прерывании висит на ожидании, новые поступающие по UART байты не учитываются, пропадая всуе. А потом говорится, что байты де пропали. Если ожидания там нет, то и ожидать нечего. Советую ради теста закоментарить ожидания и посмотреть как это скажется на скорости. А вообще-то программы взаимной пересылки между обоими UART'ами так не пишут. Никаких ожиданий быть не должно, а нужна буферизация. Т.е. в прерывании от поступления байта этот байт пишется в (самодельный) FIFO, из которого потом второй UART тоже по прерыванию (на этот раз от опустошения передатчика) забирает байты для передачи. В случае необходимости перекрестной пересылки - заводят два таких буфера для очередей на передачу для каждого из UART. И перехватывают 4 прерывания - по готовности передатчика и наличию в приемнике по каждому UART. Принимаемые байты пишутся в буфера очередей с одновременным разрешением прерывания по опустошению передатчика своего соседа. А в своем прерывании по опустошению передатчика забираешь байт из своего буфера и отсылаешь его. Если же буфер пуст, то маскируешь собственное прерывание по опустошению. Разрешать его будет сосед, когда запишет для тебя что-то в буфер. Где-то так.
|
|
|
|
|
Jun 21 2010, 10:53
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 22-06-09
Пользователь №: 50 523

|
Цитата(Сергей Борщ @ Jun 21 2010, 14:19)  А разве кто-то обещал, что проц будет работать с такой частотой? Ну тут я опечатался немного, не MHz конечно. Пробовал так, для 9600 Код UBR10 = 0x03; UBR00 = 0x41; UMCTL0 = 0xBB; Цитата программы взаимной пересылки между обоими UART'ами так не пишут. Да я пока для примера, получится, буду обделывать. Сейчас постарался поменьше ненужного кода пихать.
|
|
|
|
|
Jun 21 2010, 11:07
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ArtemTom @ Jun 21 2010, 14:53)  Пробовал так, для 9600 Код UBR10 = 0x03; UBR00 = 0x41; UMCTL0 = 0xBB; Вроде никакого криминала, хотя при таком соотношении частот можно смело занулять модулятор. Скорее всего, дело в PC-шной части. Хотя... Сейчас некогда разбираться, а вы случайно половинки регистров от разных УАРТов не перемешали?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 11:15
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 22-06-09
Пользователь №: 50 523

|
Да вроде ничего не перемешивал на 19200 все же работает. Ладно, вроде все правильно, должно работать, наверно дело в чем то другом. Думал может кто подскажет из-за чего всякая лабуда в ком-порт может поступать, как-будто скорость не ту указал. Щас пошаманю немного может получится чего.
|
|
|
|
|
Jun 21 2010, 11:24
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ArtemTom @ Jun 21 2010, 15:15)  Да вроде ничего не перемешивал на 19200 все же работает. Потому что настройки одинаковые. А если вы берёте один байт от новой скорости, а другой - от старой - получится полная каша. Проверьте для успокоения. Похоже на то.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 21 2010, 12:35
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 22-06-09
Пользователь №: 50 523

|
Цитата(rezident @ Jun 21 2010, 15:15)  у вас тактовая частота SMCLK выбрана 12МГц, вы от нее же и тактируете UART, так почему же расчетная частота для тактирования у вас 8МГц? Это раз. Я думал что 8MHz указал. В примерах правда такой вариант есть: Код FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set, freq = xtal x D x N+1 SCFI0 |= FN_4; // x2 DCO freq, 8MHz nominal DCO SCFQCTL = 121; // (121+1) x 32768 x 2 = 7.99 MHz Можете ткнуть пальцем почему в моём случае 12 MHz, а то я видимо не разобрался? Если можно, разъясните пожалуйста по подробней про UMCTL0, не разберусь с этой модуляцией, как её указывать? Цитата а вы случайно половинки регистров от разных УАРТов не перемешали? Проверьте для успокоения. Похоже на то. Тут я видимо тоже не понял. Как проверить? Да, флаги я тоже зря наставил.
|
|
|
|
|
Jun 21 2010, 14:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(ArtemTom @ Jun 21 2010, 18:35)  Можете ткнуть пальцем почему в моём случае 12 MHz, а то я видимо не разобрался? А я на ваши комментарии ориентировался, лень было проверять  Если очень нужно, то давайте вместе разберемся. Цитата(ArtemTom @ Jun 21 2010, 18:35)  Если можно, разъясните пожалуйста по подробней про UMCTL0, не разберусь с этой модуляцией, как её указывать? Когда-то VAI выкладывал здесь экселевский файлик для расчета параметров UART. См. приложение.
|
|
|
|
|
Jun 21 2010, 15:18
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ArtemTom @ Jun 21 2010, 16:35)  Тут я видимо тоже не понял. Как проверить? По даташиту. Всё нормально. Цитата UART0 Transmit buffer UTXBUF0 077h Receive buffer URXBUF0 076h Baud rate UBR10 075h Baud rate UBR00 074h Modulation control UMCTL0 073h Receive control URCTL0 072h Transmit control UTCTL0 071h UART control UCTL0 070h Я думал, что UBR10 и UBR01 можно случайно попутать..
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|