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

Просмотров:   4512

Комментарии

чт, 07/14/2016 - 20:51
Владимир_Грехов

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

вт, 07/26/2016 - 13:18
Griska

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

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!