В этой статье расскажу о конфигурировании и использовании 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 это какая-то торговая марка или на название патент действует.
может создает атмосферу закрытости и элитности 😉