|
Передача по USART |
|
|
|
Aug 5 2012, 17:14
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(sidy @ Aug 5 2012, 20:18)  Спасибо за интересную статью, но мне не нужно "изобретать" модуль UART. Я хочу работать с имеющимся, только отправку реализовать без использования возможности прерывания. Хочу попробовать реализовать следующий алгоритм. Адрес начала отправляемого блока данных и количество отправляемых байт передается через регистры. Использую отправку через USART0. 1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку); 2. Отправляю в регистр U0TXBUF очередной байт из блока данных; 3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3; 4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт; 5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2; 6. Разрешаю маскируемые прерывания. Скажите, будет работать?
|
|
|
|
|
Aug 9 2012, 15:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(rezident @ Aug 9 2012, 01:41)  ... состояние этого флага перед загрузкой нового байта а UTXBUFx нужно будет сбрасывать программно, ... Это лишнее, у MSP430 UART нормальный, правильный: Цитата UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/13.htm
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 12 2012, 05:15
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(rezident @ Aug 11 2012, 22:03)  Правильно. А если это конец передачи и передавать больше не нужно, то флаг можно сбросить только программно. Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид? 1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку); 2. Отправляю в регистр U0TXBUF очередной байт из блока данных; 3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3; 4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт; 5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2; 6. Сбрасываю бит UTXIFG0. 7. Разрешаю маскируемые прерывания.
|
|
|
|
|
Aug 12 2012, 12:12
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Aug 12 2012, 10:15)  Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид? В общем-то SSerge прав. UTXIFGx вам вообще можно не трогать. Точно также не нужно разрешать/запрещать немаскируемые прерывания все сразу. Исходно лишь UTXIEx в регистрах IEx должны быть сброшены. Код do { if ((IFG1 & UTXIFG0) !=0) //передатчик готов? { U0TXBUF = *pBuf++; --bufSize; } } while (bufSize != 0); где pBuf - указатель на буфер отправляемых данных, bufSize - размер буфера для отправки. Чтобы не зациклится здесь навсегда можно дополнительно в цикл ввести счетчик, по превышению которого определять "неисправность" UART (отсутствие готовности передатчика по истечение времени отправки одного символа) и переинициализировать его. Только не очень понятно, для чего вам нужен именно такой алгоритм работы? С UART "выгоднее" работать по прерываниям, т.к. скорости его обычно на порядок или два ниже тактовой частоты ядра. Вот при работе с SPI на максимально возможной частоте (MCLK/2) - там да, выгоднее по опросу флага готовности.
|
|
|
|
|
Sep 28 2012, 15:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Sep 28 2012, 18:13)  Но ведь тогда получается, что если разрешить прерывание на передачу, а в обработке прерывания ничего не делать (просто делать возврат из прерывания), то прерывание на передачу будет вызываться бесконечно. Правильно это? Скорей всего так и будет - прерывание будет происходить постоянно. Это довольно стандартное решение для МК. Чтобы прерывание не происходило постоянно нужно или послать что-нибудь в uart или запретить прерывание, если передавать нечего. Если возникла необходимость передать данные, то прерывание разрешается.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|