Atmega128. Передача данных - Передатчик УСАПП
Передача данных - Передатчик УСАПП
Работа передатчика УСАПП разрешается путем установки бита разрешения передачи (TXEN) в регистре UCSRB. После разрешения, функция вывода TxD как обычного порта заменяется на функцию выхода последовательной передачи данных. Скорость связи, режим работы и формат посылки должны быть установлены однократно перед началом какой-либо передачи. Если используется синхронная работа, то функция вывода XCK также заменяется на альтернативную - синхронизация передачи.
Передача посылок с 5…8 битами данных
Начало передачи инициируется записью передаваемых данных в буфер передатчика. ЦПУ может загрузить буфер передатчика путем записи в регистр UDR, расположенный в памяти ввода-вывода. Буферизованные данные в буфере передатчика будут перемещены в сдвиговый регистр, после того как он будет готов к отправке новой посылки. Запись в сдвиговый регистр новых данных происходит в состоянии ожидания (когда передача завершена) или сразу после завершения передачи последнего стоп-бита предыдущей посылки. Если в сдвиговый регистр записаны новые данные, то начинается передача одной посылки на скорости, определенной в регистре скорости связи, битом U2X или XCK в зависимости от выбранного режима работы.
В следующих примерах представлены простые функции передачи через УСАПП, использующие опрос флага освобождения регистра данных (UDRE). Если используется посылка с менее 8 бит данных, то старшие биты записанные в UDR игнорируются. Перед вызовом данной функции должна быть выполнена инициализация УСАПП. Для кода на Ассемблере предполагается, что передаваемые данные записаны в регистр R16 перед вызовом процедуры.
Пример кода на Ассемблере (1) |
USART_Transmit: ; Ожидание освобождения буфера передатчика sbis UCSRA,UDRE rjmp USART_Transmit ; Помещение данных (r16) в буфер, отправка данных out UDR,r16 ret |
C Code Example (1) |
void USART_Transmit( unsigned char data ) { /* Ожидание освобождения буфера передатчика */ while ( !( UCSRA & (1<<UDRE)) ); /* Помещение данных в буфер, отправка данных */ UDR = data; } |
Прим. 1: В примере предполагается, что подключен файл специфических заголовков. Для регистров ввода-вывода, которые расположены в области памяти расширенного ввода-вывода необходимо заменить инструкции "IN", "OUT", "SBIS", "SBIC", "CBI" и "SBI" на инструкции, осуществляющие доступ к расширенной памяти ввода-вывода. Обычно это инструкции "LDS" и "STS" в сочетании с "SBRS", "SBRC", "SBR" и "CBR".
Перед загрузкой новых данных для передачи в данной функции осуществляется ожидание освобождения буфера передатчика путем опроса флага UDRE.
Отправка посылок с 9 битами данных
Если необходимо передавать 9 бит данных (UCSZ = 7), то 9-ый бит данных должен быть записан в бит TXB8 регистра UCSRB, перед тем как младший байт будет записан в UDR. В следующих примерах показаны функции для передачи 9 бит данных. Для кода на Ассемблере предполагается, что отправляемые данные предварительно записаны в регистры R17:R16.
Пример кода на Ассемблере (1) |
USART_Transmit: ; Ожидание освобождения буфера передатчика sbis UCSRA,UDRE rjmp USART_Transmit ; Копирование 9-го бита из r17 в TXB8 cbi UCSRB,TXB8 sbrc r17,0 sbi UCSRB,TXB8 ; Помещение мл. байта данных (r16) в буфер, отправка данных out UDR,r16 ret |
Пример кода на Си (1) |
void USART_Transmit( unsigned int data ) { /* Ожидание освобождения буфера передатчика */ while ( !( UCSRA & (1<<UDRE)) ); /* Копирование 9-го бита в TXB8 */ UCSRB &= ~(1<<TXB8); if ( data & 0x0100 )UCSRB |= (1<<TXB8); /* Помещение данных в буфер, отправка данных */ UDR = data; } |
Прим.1: Данные функции записаны как функции общего назначения. Они оптимизированы под статическое содержимое UCSRB. Т.е. когда после инициализации в регистре UCSRB изменяется только бит TXB8. Для регистров ввода-вывода, которые расположены в области памяти расширенного ввода-вывода, необходимо заменить инструкции "IN", "OUT", "SBIS", "SBIC", "CBI" и "SBI" на инструкции, осуществляющие доступ к расширенной памяти ввода-вывода. Обычно это инструкции "LDS" и "STS" в сочетании с "SBRS", "SBRC", "SBR" и "CBR".
9-ый бит данных может использоваться для индикации адреса посылки в многопроцессорном режиме связи или в других протоколах.
Флаги и прерывания передатчика
Передатчик УСАПП имеет два флага, которые индицируют его состояние: флаг освобождения регистра данных УСАПП (UDRE) и флаг завершения передачи (TXC). Оба флага могут использоваться для генерации прерываний. Флаг освобождения регистра данных (UDRE) индицирует готовность буфера передатчика принять новые данные. Данный бит устанавливается при освобождении передающего буфера и сбрасывается, когда буфер передатчика содержит данные для передачи, но которые еще не были переданы в сдвиговый регистр. Для совместимости с будущими микроконтроллерами в данный бит необходимо записывать ноль во время записи в регистр UCSRA.
Если записать лог. 1 в бит разрешения прерывания по освобождению регистра данных (UDRIE) в регистре UCSRB, то прерывание по освобождению регистра данных УСАПП будет выполняться всякий раз, когда устанавливается бит UDRE (с учетом того, что общие прерывания разрешены). UDRE сбрасывается при записи в UDR. Если используется управление связью по прерываниям, то в процедуре обработки прерывания по освобождению регистра данных необходимо или записать новые данные в регистр UDR для сброса флага UDRE или выключить прерывание по освобождению регистра данных. В противном случае при выходе из процедуры обработки прерывания сразу возникнет новое прерывание.
Флаг завершения передачи (TXC) принимает единичное значение, если вся посылка в сдвиговом регистре передатчика была полностью сдвинута и в буфере передатчика отсутствуют новые данные для передачи. Флаг TXC автоматически сбрасывается при переходе на вектор обработки прерывания по завершению передачи или программно сбрасывается путем записи в него лог. 1. Флаг TXC полезно использовать при организации полудуплексной связи (например, стандарт RS485), где имеется необходимость перевода передающей стороны в режим приема после завершения передачи, тем самым достигая освобождения шины.
Если разрешено прерывание по завершению передачи (TXCIE=1) в регистре UCSRB, то прерывание по завершению передачи УСАПП выполняется всякий раз, когда флаг TXC принимает единичное состояние (с учетом, что активно общее разрешение прерываний). При переходе на вектор обработки прерывания по завершении передачи УСАПП нет необходимости сбрасывать флаг TXC, т.к. это происходит автоматически.
Генератор паритета
Генератор паритета вычисляет бит паритета для включения в состав последовательной посылки. Если бит паритета установлен (UPM1 = 1), то управляющая логика передатчика вставляет бит паритета между последним битом данным и первым стоп-битом в отправляемой посылке.
Отключение передатчика
Отключение передатчика после сброса TXEN наступит только тогда, когда завершится текущая и ожидаемая передача, т.е. когда в сдвиговом регистре передатчика и буфере передатчика не будет данных для передачи. После отключения передатчика отменяется альтернативное назначение вывода TxD.
<< Предыдущая страница | Оглавление | Следующая страница >> |