В этой статье расскажу о конфигурировании и использовании UART в микроконтроллерах tms320. В общем то это и не UART. В Техасе данный модель микроконтроллера назвали SCI, что расшифровывается как Serial Communications Interface.
Ничего суперсложного в данном модуле нет. Вот его структура:
Как и для SPI необходимо настроить ножки tms320 для работы с модулем последовательного порта SCI, указать используем ли мы прерывания и затактировать модуль.
Для настройки предусмотрено довольно обильное количество регистров.
Наиболее важным (на мой взгляд) является SCICCR

Тут Вы можете настроить наиболее важные параметры передачи.
Длина слова данных настраивается в поле SCI CHAR.
Поле состоит из трех бит. Соответственно может быть длина от 1 до 8 бит.
Также тут присутствует чудодейственный бит LOOPBACKENA, который можно использовать для тестирования. Как в модуле SPI данный бит закорачивает линии TX и RX.
PARITY ENABLE – разрешает бит четности
EVEN/ODD PARITY – настраивает поведение бита четности
STOP BITS – переключает количество стоп битов. 0 – один стоп бит. 1 – два стоп бита.
Дальше в нашем списке регистр SCICTL1
Данный регистр может сбрасывать (бит SW RESET) модуль SCI.
Также тут включают (RXERRINTENA) генерацию прерывания по появлению бита ошибке в регистре статуса.
В этом же регистре мы можем включить/отключить приемник и передатчик при помощи бит RXENA и TXENA.
Когда поведение последовательного порта настроено ему необходимо настроит baudrate. Для этого воспользуемся регистром SCILBAUD и SCIHBAUD.
Тут мы по формуле с картинки выше рассчитываем значение регистра и вписываем его целиком.
В регистре SCICTL2 включаются прерывания по приему/передаче.
Кроме того в этом же регистре находятся флаги TXRDY, TX EMPTY сигнализирующие о готовности к передаче и пустоте буфера.
Для отслеживания состояния приемника необходимо использовать регистр SCIRXST. В нем есть флаги ошибки четности, готовности модуля к приему и пр.
Для передачи данных пользуемся регистром SCITXBUF, а для приема SCIRXBUF.
Как и в модуле SPI у контроллеров tms320 в модуле SCI присутствует FIFO буфер.
Для его настройки предусмотрена целая куча регистров, которые ничем принципиально не отличаются от регистров буфера SPI.
Надеюсь доберусь и сделаю отдельную статью о FIFO в tms320f28027.
Вот так инициализируем выводы микроконтроллера для работы с SCI:
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // подтяжка на GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; // откл подтяжки на GPIO29 (SCITXDA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // асинхронный вход GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // GPIO28 --> SCIRXDA
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // GPIO29 --> SCITXDA
EDIS;
Теперь настраиваем UART на 256000 бод, 1 стоп бит, без четности:
void scia_echoback_init()
{
// Тактирование модуля было включено в
// InitSysCtrl() --> InitPeripheralClocks()
SciaRegs.SCICCR.all =0x0007; // 1 стоп бит, без loopback
// без проверки четности, 8 бит,
// асинхронная передача
SciaRegs.SCICTL1.all =0x0003; // вкл TX, RX, internal SCICLK,
// откл RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
// SCI BRR = LSPCLK/(SCI BAUDx8) - 1
// 9600 бод
// 194 = 15000000 / (9600*8) - 1
// 256000 бод
// 6 = 15000000 / (256000*8) - 1
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x0006; // для 256000 бод
SciaRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
}
После настройки модуля придется настроить FIFO.
void scia_fifo_init()
{
SciaRegs.SCIFFTX.bit.SCIRST = 1; // сброс линий rx/tx
SciaRegs.SCIFFTX.bit.SCIFFENA = 1; // разрешаем FIFO
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1; // сбрасываем FIFO
SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; // очищаем флаг прерывания
// дублирует то, что выше одной строкой
//SpiaRegs.SPIFFTX.all=0xE040;
}
Ну а для теста я предлагаю вывести сообщение, после чего предлагать ввести символ и отправлять его обратно на компьютер.
scia_fifo_init(); // настройка SCI FIFO
scia_echoback_init(); // настройка SCI
msg = "Hello World!\0";
scia_msg(msg);
msg = "\r\nYou will enter a character, and the DSP will echo it back! \n";
scia_msg(msg);
for(;;)
{
msg = "\r\nEnter a character:";
scia_msg(msg);
// ждем пока не появятся данные
while(SciaRegs.SCIFFRX.bit.RXFFST != 1) { } // ждем XRDY = 1 for empty state
// Получаем символ
ReceivedChar = SciaRegs.SCIRXBUF.all;
// Отправляем обратно
msg = " You sent: ";
scia_msg(msg);
scia_xmit(ReceivedChar);
LoopCount++;
}
Вот так это выглядит:
В с2000 launchpad очень удобно сделан UART. Он разведен во второй канал преобразователя usb — com вроде того, что делал я. Т.е. у Вас всегда под рукой высокоскоростной последовательный порт и даже не нужно возится с проводами! Он просто использует тот же самый кабель, который нужен для программирования контролера.
Ссылка на проект: https://www.dropbox.com/s/l2u180x44akab5e/tms320_sci.zip
Документация на SCI от TI: https://www.dropbox.com/s/lnug1h04ptmtglv/tms320_sci.pdf



Пример работает в Proteus 8 !!! Отличный пример!!!
а не добавишь описание epwm?
Спасибо за статью. Не понятно вот, зачем в TI известный всем UART надо было называть SCI, как будто UART это какая-то торговая марка или на название патент действует.
может создает атмосферу закрытости и элитности 😉