TMS320 для начинающих: UART (SCI) в tms320

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

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Владимир_Грехов

    Пример работает в Proteus 8 !!! Отличный пример!!!

    Ответить
  2. Griska

    а не добавишь описание epwm?

    Ответить
  3. Владимир_

    Спасибо за статью. Не понятно вот, зачем в TI известный всем UART надо было называть SCI, как будто UART это какая-то торговая марка или на название патент действует.

    Ответить
    1. lamazavr

      может создает атмосферу закрытости и элитности 😉

      Ответить