d7d1cd 0 5 августа, 2012 Опубликовано 5 августа, 2012 · Жалоба Привет всем! Подскажите, могу ли я организовать передачу по USART (в режиме UART) без использования вектора прерывания для передачи? Сразу извиняюсь, если вопрос глуп... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 5 августа, 2012 Опубликовано 5 августа, 2012 · Жалоба Есть такая возможность: http://we.easyelectronics.ru/msp430/duplek...re-timer_a.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 5 августа, 2012 Опубликовано 5 августа, 2012 · Жалоба Есть такая возможность: http://we.easyelectronics.ru/msp430/duplek...re-timer_a.html Спасибо за интересную статью, но мне не нужно "изобретать" модуль UART. Я хочу работать с имеющимся, только отправку реализовать без использования возможности прерывания. Хочу попробовать реализовать следующий алгоритм. Адрес начала отправляемого блока данных и количество отправляемых байт передается через регистры. Использую отправку через USART0. 1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку); 2. Отправляю в регистр U0TXBUF очередной байт из блока данных; 3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3; 4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт; 5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2; 6. Разрешаю маскируемые прерывания. Скажите, будет работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 6 августа, 2012 Опубликовано 6 августа, 2012 · Жалоба 2. В регистр UCA0TXBUF. 3. бит UCA0TXIFG. Ваш алгоритм работать будет. Только всё равно, правильно через прерывание, тот же самый алгоритм, только бит отправки проверять не надо, запрещать глобально прерывания не надо, если последний байт - запретить прерывание опустошения буфера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 7 августа, 2012 Опубликовано 7 августа, 2012 · Жалоба Спасибо за комментарий. Вот только регистра UCA0TXBUF и бита UCA0TXIFG я в своем микроконтроллере MSP430F149 не нашел... И еще, если этот же алгоритм применять в обработке прерывания на отправку, то как инициировать саму отправку, то есть что сделать, чтобы сработало прерывание на отправку? Установить бит UTXIFG0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 7 августа, 2012 Опубликовано 7 августа, 2012 (изменено) · Жалоба Да, в 1 и во 2 семействе разные USART. Я почему то подумал, что у вас 2-го семейства. Если не ошибаюсь, нужно в основном цикле первый байт послать самому, перед этим разрешить прерывание передатчика. Изменено 7 августа, 2012 пользователем KARLSON Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 7 августа, 2012 Опубликовано 7 августа, 2012 · Жалоба Вырвано из старого (2005г) прожекта, надеюсь поможет. Функции для работы по готовности там закомментированы, для работы через них не нужно разрешать прерывания при инициализации (убрать строку enable_USART0_RX_interrupt;). USART0_430.c.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Подскажите, могу ли я организовать передачу по USART (в режиме UART) без использования вектора прерывания для передачи?Можно, по опросу флага UTXIFGx. Только состояние этого флага перед загрузкой нового байта а UTXBUFx нужно будет сбрасывать программно, т.е. сбросом бита UTXIFGx в регистре IFGx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 9 августа, 2012 Опубликовано 9 августа, 2012 · Жалоба ... состояние этого флага перед загрузкой нового байта а UTXBUFx нужно будет сбрасывать программно, ... Это лишнее, у MSP430 UART нормальный, правильный: UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/13.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 11 августа, 2012 Опубликовано 11 августа, 2012 · Жалоба UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUFПравильно. А если это конец передачи и передавать больше не нужно, то флаг можно сбросить только программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 12 августа, 2012 Опубликовано 12 августа, 2012 · Жалоба Правильно. А если это конец передачи и передавать больше не нужно, то флаг можно сбросить только программно. Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид? 1. Запрещаю маскируемые прерывания (чтобы не сработало прерывание на отправку); 2. Отправляю в регистр U0TXBUF очередной байт из блока данных; 3. Проверяю состояние бита UTXIFG0. Если бит не установлен, то перехожу к пункту 3; 4. Инкрементирую адрес блока данных, декрементирую количество отправляемых байт; 5. Если количество отправляемых байт не равно нулю, то перехожу к пункту 2; 6. Сбрасываю бит UTXIFG0. 7. Разрешаю маскируемые прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 12 августа, 2012 Опубликовано 12 августа, 2012 · Жалоба Скажите, тогда мой алгоритм отправки блока данных должен иметь такой вид?В общем-то SSerge прав. UTXIFGx вам вообще можно не трогать. Точно также не нужно разрешать/запрещать немаскируемые прерывания все сразу. Исходно лишь UTXIEx в регистрах IEx должны быть сброшены. do { if ((IFG1 & UTXIFG0) !=0) //передатчик готов? { U0TXBUF = *pBuf++; --bufSize; } } while (bufSize != 0); где pBuf - указатель на буфер отправляемых данных, bufSize - размер буфера для отправки. Чтобы не зациклится здесь навсегда можно дополнительно в цикл ввести счетчик, по превышению которого определять "неисправность" UART (отсутствие готовности передатчика по истечение времени отправки одного символа) и переинициализировать его. Только не очень понятно, для чего вам нужен именно такой алгоритм работы? С UART "выгоднее" работать по прерываниям, т.к. скорости его обычно на порядок или два ниже тактовой частоты ядра. Вот при работе с SPI на максимально возможной частоте (MCLK/2) - там да, выгоднее по опросу флага готовности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 12 августа, 2012 Опубликовано 12 августа, 2012 · Жалоба Если я начну объяснять зачем мне именно такой алгоритм, то нарушу правила данного форума. А за алгоритм спасибо. Буду пробовать реализовывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 28 сентября, 2012 Опубликовано 28 сентября, 2012 · Жалоба Ребят, подскажите такой момент. Чтобы определить готов ли передатчик USART0 к передачи очередного символа, необходимо проверить бит UTXIFG0. В руководстве пользователя сказано, что этот бит устанавливается, когда U0TXBUF пуст. И написано, что будет ожидаться прерывание на передачу. Но ведь тогда получается, что если разрешить прерывание на передачу, а в обработке прерывания ничего не делать (просто делать возврат из прерывания), то прерывание на передачу будет вызываться бесконечно. Правильно это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 28 сентября, 2012 Опубликовано 28 сентября, 2012 · Жалоба Но ведь тогда получается, что если разрешить прерывание на передачу, а в обработке прерывания ничего не делать (просто делать возврат из прерывания), то прерывание на передачу будет вызываться бесконечно. Правильно это? Скорей всего так и будет - прерывание будет происходить постоянно. Это довольно стандартное решение для МК. Чтобы прерывание не происходило постоянно нужно или послать что-нибудь в uart или запретить прерывание, если передавать нечего. Если возникла необходимость передать данные, то прерывание разрешается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться