11.3.2. Приемник модуля SCI
(Руководство разработчика по микроконтроллерам семейства HCS08)Приемник модуля SCI состоит из сдвигового регистра RSR (Receive Shift Register) с последовательным входом и параллельным выходом и блока управления, который определяет режим работы приемника и линии входа данных RxD.
Для приема данных приемник необходимо включить, установив бит RE в регистре управления SCIC2, и корректно настроить. Большинство установок, рассмотренных для передатчика, применимы и к приемнику. В частности, скорость обмена обязательно должна быть одинаковой для приемника и для передатчика в составе одного модуля SCI.
Состояние линии приема данных RxD, которая автоматически настраивается на ввод при включении модуля, проверяется с частотой в 16 раз выше, чем скорость передачи данных модуля SCI, установленная с помощью регистров SCIBD. Это позволяет детектировать шум на линии при приеме данных. Как будет показано далее, при регистрации шума на линии устанавливается флаг ошибки.
Принимаемые по линии RxD данные записываются в программно недоступный сдвиговый регистр приемника RSR, пока все биты кадра обмена не будут приняты, включая стоп-бит. После этого принятые данные автоматически переносятся в регистр данных SCID, и устанавливается флаг завершения приема данных RDRF в регистре состояния SCIS1.
Если приемник работает в режиме приема 9-битного кадра (SCIC1:M = 1), то девятый бит данных записывается в бит R8 регистра SCIC3. Для обеспечения корректной работы модуля SCI в этом режиме перед чтением регистра SCID, в который записываются младшие 8 бит принятых данных, должен быть прочитан бит R8.
На Рис.11.13 показана упрощенная структурная схема приемника модуля SCI.
Рис.11.13. Структурная схема приемника модуля SCI.
Приемник включает в себя блок обнаружения ошибки, которая позволяет определить следующие нарушения работы:
- Переполнение приемника. Флаг ошибки OR в регистре SCIS1 указывает на то, что следующий байт данных был принят до того момента, как из регистра SCID был прочитан предыдущий принятый байт. В этом случае последние принятые данные теряются, и устанавливается бит OR.
- Шум на линии RxD. Флаг ошибки NF в регистре SCIS1 указывает на то, что при считывании одного и того же бита несколько раз были получены разные значения. Поскольку частота считывания линии RxD выше частоты изменения данных на ней, то каждый бит данных считывается приемником несколько раз. Если считанные значения одного и того же бита отличаются из-за шума на линии, то устанавливается флаг NF.
- Нарушение формата кадра. Флаг ошибки FE в регистре SCIS1 указывает на то, что приемнику модуля SCI не удалось обнаружить корректный стоп-бит.
- Нарушение паритета кадра (ошибка четности). Флаг ошибки PF в регистре SCIS1 указывает на то, что рассчитанное значение бита контроля четности отличается от принятого в кадре значения бита контроля четности.
Приемник модуля SCI не может принять новые данные, пока установлен бит FE. Если он установлен, то необходимо программно прочитать значение регистра SCIS1, а затем прочитать cодержимое регистра SCID. Таким образом, можно сбросить флаг FE и разрешить прием новых данных.
В Примере 11.8 показано, как сконфигурировать передатчик и приемник модуля SCI. При приеме символа от ПК будет возвращаться следующий символ. Например, при приеме символа «A» будет возвращен символ «B». При приеме каждого символа изменяется состояние светодиода LED2 на демонстрационной плате DEMO9S08QG8.
Пример 11.8. Передача и прием данных по интерфейсу SCI
//ДемонстрационнаяплатаDEMO9S08QG8
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"/*Этонашфайлсобъявлениями!*/
#defineLED2PTBD_PTBD7
voidmain(void)
{
charrxchar;
SOPT1=bBKGDPE;//ВключениелинииотладкиBKGD
PTBDD_PTBDD7=1;//НастройкалинииPTB7навывод
//ПослесбросаBUSCLK=4МГц
SCIBD=26;//СкоростьпередачиSCI=4МГц/(16*26)=9615бит/с
SCIC2=bTE|bRE;//Включениепередатчика
while(1)
{
while(!SCIS1_RDRF);//Ожидание,покабудетпринятсимвол
while(!SCIS1_TDRE);//Ожидание,покаосвободитсябуферпередатчика
rxchar=SCID;//Чтениепринятогосимвола
SCID=rxchar+1;//Посылаемchar+1поинтерфейсуSCI
LED2=!LED2;//Изменяемсостояниесветодиода
}
}
В следующем Примере 11.9 все символы, переданные от ПК, возвращаются назад, и светодиод меняет состояние при приеме каждого символа. Когда пользователь нажимает на кнопку ENTER, выводится сообщение.
Пример 11.9. Передача символов/строк
//ДемонстрационнаяплатаDEMO9S08QG8
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"/*Этонашфайлсобъявлениями!*/
#defineLED2PTBD_PTBD7
//ФункцияпередачистрокипоинтерфейсуSCI
voidSCI_send_string(char*string)
{
while(*string)//Длякаждогосимволастроки
{
while(!SCIS1_TDRE);//Ожидание,покабуферпередатчиканеопустеет
SCID=*string;//Записьтекущегосимволавбуферпередатчика
string++;//Увеличиваемномерсимволастроки
}
}
voidmain(void)
{
charrxchar;
SOPT1=bBKGDPE;//ВключениелинииотладкиBKGD
PTBDD_PTBDD7=1;//НастройкалинииPTB7навывод
//ПослесбросаBUSCLK=4МГц
SCIBD=26;//СкоростьпередачиSCI=4МГц/(16*26)=9615бит/с
SCIC2=bTE|bRE;//РазрешениеработыпередатчикамодуляSCI
SCI_send_string("HelloWorld!");//Передачастрокипоинтерфейсу
while(1)
{
while(!SCIS1_RDRF);//Ожидание,покабудетпринятсимвол
while(!SCIS1_TDRE);//Ожидание,покаосвободитсябуферпередатчика
rxchar=SCID;//Чтениепринятогосимвола
SCID=rxchar;//ПередачасимволаназадкПК
LED2=!LED2;//Изменяемсостояниесветодиода
if(rxchar==13)SCI_send_string("HCS08rules!/r/n");
}
}
Приемник модуля SCI обладает некоторыми дополнительными функциями.
Инверсия данных на линии RxD
Для МК с модулем версии SCIv4 посредством бита RXINV в регистре SCIS2 можно выбрать полярность линии RxD между стандартной и инверсной.
Детектирование неактивного состояния линии
Приемник модуля SCI включается в себя специальную схему, которая позволяет определять, когда линия RxD не активна. Неактивное состояние линии (Idle) характеризуется ВЫСОКИМ уровнем на линии в течение времени передачи одного байта данных. Если было обнаружено неактивное состояние линии, то бит IDLE в регистре SCIS1 устанавливается до тех пор, пока он не будет сброшен программно. Флаг IDLE сбрасывается при чтении регистра SCIS1 перед чтением содержимого регистра SCID.
Существует два режима распознавания аппаратными средствами неактивного состояния линии, которые выбираются битом ILT регистра SCIC1. Если бит ILT = 0, то отсчет неактивного времени начинается после идентификации старт-бита. Если бит ILT = 1, то отсчет неактивного времени начинается после идентификации стоп-бита.
Если бит IDLE программно сброшен, то он устанавливается аппаратно после приема следующего байта данных (SC1SI:RDRF = 1).
Обнаружение фронта
Модуль SCI версии SCIv4 включает в себя также схему обнаружения фронта на линии RxD, которая позволяет выводить МК из режимов пониженного энергопотребления (wait, LPrun, LPwait или Stop3). Данная функция включается установкой бита RXEDGIE в регистре SCIBDH.
Если функция обнаружения фронта включена, то при детектировании спадающего (при RXINV = 0) или нарастающего (при RXINV = 1) фронта на линии RxD микроконтроллер выходит из режима пониженного энергопотребления, и модуль SCI принимает входящие данные. При обнаружении выбранного фронта устанавливается бит RXEDGIF регистра SCIxS2.
11.3.2.1. Распознавание адреса на линии
Приемник модуля SCI может быть сконфигурирован на свой собственный режим ожидания (не путать с режимом Wait микроконтроллера). В этом режиме приемник будет находиться до тех пор, пока не будет обнаружено событие, способное вывести его из данного режима. В режиме ожидания приемник осуществляет заполнение сдвигового регистра TSR при соответствующих изменениях сигнала на его входе, но никакие флаги не формируются. Поэтому ЦП не реагирует на заполнение сдвигового регистра, и данные не принимаются. Такой режим крайне удобен именно для ЦП, поскольку он не тратит время на прерывания и считывание ненужных ему байтов данных.
Существует два возможных события, которые способны вывести приемник модуля SCI из режима ожидания:
- обнаружение на линии неактивного состояния Idle;
- распознавание в передаваемом по линии коде признака адреса ведомого устройства.
Оба способа перевода приемника в активное состояние используются для организации взаимодействия нескольких ведомых МК с одним ведущим при создании локальной информационной сети на основе интерфейса SPI. Каждому устройству в такой сети присваивается свой собственный адрес.
При использовании режима адресации с неактивной линией шина SPI в течение некоторого времени между сеансами обмена должна обязательно находиться в неактивном состоянии Idle. Тогда первый байт данных, который будет передаваться по шине после состояния Idle, будет интерпретироваться прикладной программой как адрес ведомого, с которым ведущий собирается производить обмен. Программа каждого МК будет сравнивать принятый адрес с назначенным ранее адресом устройства в сети и продолжать обмен, если коды адресов совпали. Если же адреса не совпали, то ЦП принудительно переведет приемник своего модуля SCI опять в ждущий режим. Далее обмен по шине будет осуществлять ведущий с другим ведомым, чей адрес был передан по линии в первом байте сеанса обмена. Окончание сеанса ведущий отмечает переводом шины SCI в неактивное состояние. Для того чтобы это техническое решение функционировало правильно, необходимо, чтобы ведущий в течение одного сеанса обмена выдавал данные на линию с промежутками, не превышающими установленной длительности распознавания состояния Idle.
На Рис.11.14 показана временная диаграмма, иллюстрирующая состояние шины SCI для режима адресации с неактивной линией. Ведущее устройство посылает три блока данных для трех разных ведомых устройств. Поле «A» каждой посылки содержит в себе адрес ведомого, поле «D» — байты данных. На Рис.11.14 показано, что временной интервал (a) между передачей каждого байта одного сеанса не превышает 10 интервалов передачи бита, т.е. не превышает времени распознавания приемником состояния Idle на линии. Напротив, длительность временного интервала (b) между сеансами обмена достаточна для распознавания неактивного состояния Idle.
Сеанс 1 | Сеанс 2 | Сеанс 3 | ||||||||||||||||
A | D | A | D | D | D | A | D | D | ||||||||||
a | b | a | a | a | b | a | a |
Рис.11.14. Временная диаграмма обмена для режима адресации с неактивной линией.
При использовании режима с маркером адреса код, передаваемый по линии SCI, содержит в себе специальное битовое поле, по которому принимающий МК может различить, передаются по линии данные или адрес. Обычно поле маркера использует старший бит передаваемого кадра. Если бит равен 1, то это код адреса; если бит маркера равен 0, то это код данных.
На Рис.11.15 показана временная диаграмма, иллюстрирующая состояние шины SCI для режима адресации с маркером. Ведущее устройство посылает два блока данных для двух разных ведомых устройств. Поле «s» — это старт-бит, поле «S» — стоп-бит, посередине расположено поле «Address», в котором записан код адреса, потому что старший бит поля «A» равен 1. Все ведомые считывают байт с маркером адреса и программно определяют, принимать или нет следующие байты, которые отмечены маркером данных A= 0.
Сеанс 1 | Сеанс 2 | ||||||||||||||||||||
s | address | 1 | S | s | data | 0 | S | s | data | 0 | S | s | address | 1 | S | s | data | 0 | S | ||
A | A | A | A | A |
Рис.11.15. Временная диаграмма обмена для режима с маркером адреса.
Каждый из рассмотренных способов имеет свои достоинства и недостатки. Способ с передачей маркера уменьшает размер представления данных на 1 бит, однако не предъявляет жестких требований к периодичности следования байтов в пределах одного сеанса обмена. Способ с передачей адреса после неактивной линии, наоборот, позволяет увеличить на 1 бит разрядность представления данных, но требует соблюдения малых интервалов времени между передачей байтов одного сеанса обмена.
Выбор способа вывода приемника SCI из режима ожидания назначается битом WAKE регистра SCIC1.
Если WAKE = 0, то назначается режим с передачей адреса после неактивной линии. В указанном режиме приемник переводится в режим ожидания посредством установки бита SCIC2:RWU. После этого приемник остается в режиме ожидания до тех пор, пока не распознает на линии состояние Idle. Затем приемник автоматически просыпается, т.е. переходит в активный режим работы (биты IDLE и RDRF в этом случае не устанавливаются), и ожидает передачи ему адреса ведомого. Первый принятый байт будет воспринят как адрес. Рассматриваемый ведомый сравнит принятый адрес с адресом, который записан в его памяти, и если адреса совпадают, то будет принимать следующие байты. Если адреса не равны, то снова будет установлен бит SCIC2:RWU, и приемник модуля SCI опять перейдет в режим ожидания.
Если WAKE = 1, то назначается режим с передачей маркера. В этом режиме приемник также переводится в режим ожидания посредством установки бита SCIC2:RWU. Затем приемник остается в режиме ожидания до тех пор, пока по шине SCI не поступит байт с маркером адреса. Если M = 0, т.е. реализуется режим обмена 8-битными данными, то маркером адреса является бит D7. Код адреса при этом должен быть 7-битным. Если установлен режим обмена 9-битными данными (M = 1), то маркером адреса является бит D8.
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>