Скачать 1.7 Mb.
|
#include "DRV_UART.h" #include "DSP281x_Device.h"
// количество портов (SCIA и SCIB) #define NUM_PORTS 2 // вектора прерываний #define SCIRXINTA 96 #define SCITXINTA 97 #define SCIRXINTB 98 #define SCITXINTB 99 // прототипы функций обработки прерываний static void txIsr(Ptr portArg); static void rxIsr(Ptr portArg); // структура конфигурационных параметров по умолчанию static DRV_UART_Params defaultParams = DRV_UART_DEFAULTATTRS; // структура объектов портов typedef struct DRV_UART_Obj { Bool inUse; // использование порта Int uartId; // идентификатор порта Uns *bufptr; // указатель на текущие данные в буфере Uns bufcnt; // количество оставшихся байт volatile struct SCI_REGS *regs; // указатель на регистры DRV_UART_Params *params; // указатель на параметры DRV_UART_Tcallback cbFxn; // указатель на функцию возврата } DRV_UART_Obj; // объявление и инициализация объектов static DRV_UART_Obj portObj[NUM_PORTS] = { FALSE, 0, NULL, NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL, };
// Процедура открытия порта DRV_UART_Handle DRV_UART_open(Int uartId, Ptr params, DRV_UART_Tcallback cbFxn) { DRV_UART_Handle port; // указатель на порт HWI_Attrs hwattr; // атрибуты для добавления в таблицу прерываний Int rxId, txId; // вектора прерываний // проверка на допустимый идентификатор порта if (uartId > (NUM_PORTS-1)) return NULL; // проверка на наличие объявления функции возврата if (cbFxn == NULL) return NULL; // проверка на то, что порт не был открыт // задание параметров порта port = &portObj[uartId]; if (port->inUse == TRUE) return NULL; port->inUse = TRUE; port->uartId = uartId; // в зависимости от идентификатора порта: // 1) подается питание на периферию SCI; // 2) инициализируются дискретные ножки для SCI; // 3) определяется указатель на регистры периферии; // 4) разрешаются прерывания по приему и передаче в // таблице векторов; // 5) разрешается уровень прерывания. if (uartId == 0) { asm(" EALLOW"); SysCtrlRegs.PCLKCR.bit.SCIAENCLK = 1; GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; asm(" EDIS"); port->regs = &SciaRegs; rxId = SCIRXINTA; txId = SCITXINTA; PieCtrlRegs.PIEIER9.bit.INTx1 = 1; PieCtrlRegs.PIEIER9.bit.INTx2 = 1; } else { asm(" EALLOW"); SysCtrlRegs.PCLKCR.bit.SCIBENCLK = 1; GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1; GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1; asm(" EDIS"); port->regs = &ScibRegs; rxId = SCIRXINTB; txId = SCITXINTB; PieCtrlRegs.PIEIER9.bit.INTx3 = 1; PieCtrlRegs.PIEIER9.bit.INTx4 = 1; } IER |= M_INT9; // определяется функция возврата port->cbFxn = cbFxn; port->params = (DRV_UART_Params *)params; if (port->params == NULL) port->params = &defaultParams; // добавляются прерывания по приему и передаче в // таблицу векторов прерываний DSP/BIOS hwattr.iermask = 0x1; hwattr.arg = (Arg)port; HWI_dispatchPlug(txId, (Fxn)txIsr, &hwattr); HWI_dispatchPlug(rxId, (Fxn)rxIsr, &hwattr); // осуществляется сброс устройства // (инициализация регистров SCI) DRV_UART_resetDevice(port); //возвращается указатель на порт return (port); }
// сброс устройства Void DRV_UART_resetDevice(DRV_UART_Handle hUart) { volatile struct SCI_REGS *regs = hUart->regs; DRV_UART_Params *params = hUart->params; // проверка открытия порта if (hUart == NULL) return; // сброс SCI и обнуление регистров regs->SCICTL1.all = 0; regs->SCICTL2.all = 0; regs->SCIPRI.all = 0; //задание режима в завимисости от параметров regs->SCICCR.all = params->wordSize | params->stopBits | params->parity; // разрешения приемника и передатчика regs->SCICTL1.bit.RXENA = 1; regs->SCICTL1.bit.TXENA = 1; // задание скорости обмена regs->SCIHBAUD = params->baud >> 8; regs->SCILBAUD = params->baud & 0xff; // задания режима FREE и выход из состояния сброса regs->SCIPRI.bit.FREE = 1; regs->SCICTL1.bit.SWRESET = 1; }
// старт приема Void DRV_UART_write(DRV_UART_Handle hUart, Ptr bufptr, Uns bufcnt) { hUart->bufptr = (Uns *)bufptr; hUart->bufcnt = bufcnt; hUart->regs->SCICTL2.bit.TXINTENA = 1; hUart->regs->SCITXBUF = *hUart->bufptr++; hUart->bufcnt--; } // старт передачи Void DRV_UART_read(DRV_UART_Handle hUart, Ptr bufptr, Uns bufcnt) { hUart->bufptr = (Uns *)bufptr; hUart->bufcnt = bufcnt; hUart->regs->SCICTL2.bit.RXBKINTENA = 1; }
// обработчик прерывания по передаче static void txIsr(Ptr portArg) { DRV_UART_Handle port = (DRV_UART_Handle)portArg; // все байты переданы? if (port->bufcnt > 0) { // передаем следующий байт port->regs->SCITXBUF = *port->bufptr++; port->bufcnt--; } else { // запрещаем прерывание по приему port->regs->SCICTL2.bit.TXINTENA = 0; // осуществляем вызов функции возврата с // аргументом DRV_UART_TXEMPTY (окончание // передачи) port->cbFxn(DRV_UART_TXEMPTY); } // подтверждаем прерывание PieCtrlRegs.PIEACK.bit.ACK9 = 1; } // обработчик прерывания по приему static void rxIsr(Ptr portArg) { DRV_UART_Handle port = (DRV_UART_Handle)portArg; Int data; //считываем данные во временную переменную // (необходимо делать всегда) data = port->regs->SCIRXBUF.bit.RXDT; // в случае возникновения ошибки делаем сброс SCI if (port->regs->SCIRXST.bit.RXERROR) { port->regs->SCICTL1.bit.SWRESET = 0; port->regs->SCICTL1.bit.SWRESET = 1; } else { // сохраняем данные по указателю на буфер *port->bufptr++ = data; port->bufcnt--; // буфер заполнен? if (!port->bufcnt) { // запрещеаем прерывание по приему port->regs->SCICTL2.bit.RXBKINTENA = 0; // осуществляем вызов функции возврата с // аргументом DRV_UART_RXFULL (окончание // приема) port->cbFxn(DRV_UART_RXFULL); } } // подтверждаем прерывание PieCtrlRegs.PIEACK.bit.ACK9 = 1; }
В приведенном ниже примере использования данной библиотеки осуществляется передача буфера длиной 10 байт из порта SCIA в порт SCIB. Примечание. Для использования данного примера необходимо соединить следующие ножки процессора: ножку 3 разъема P8 (SCITXDA) с ножкой 19 разъема P4 (SCIRXDB) и ножку 4 разъема P8 (SCIRXDA) с ножкой 18 разъема P4 (SCITXDB).
#include "DRV_UART.h"
#define NUM_CHANS 2 // количество каналов обмена #define SCIA 0 // идентификатор SCIA #define SCIB 1 // идентификатор SCIB #define FRAME_SIZE 10 // размер буфера данных // структура объекта канала typedef struct ChanObj { DRV_UART_Handle port; // указатель на порт Uns frame[FRAME_SIZE]; // буфер данных Uns frame_count; // количество обработанных кадров } ChanObj; // объявляем объекты каналов ChanObj chans[NUM_CHANS]; // прототипы функций возрата (приведены ниже) static Void scia_callback(Int val); static Void scib_callback(Int val);
chans[SCIA].port = DRV_UART_open(SCIA, NULL, &scia_callback); chans[SCIB].port = DRV_UART_open(SCIB, NULL, &scib_callback); chans[SCIA].frame_count = 0; chans[SCIB].frame_count = 0;
// формирование запроса приема буфера DRV_UART_read (chans[SCIA].port, chans[SCIA].frame, FRAME_SIZE); // формирование запроса передачи буфера DRV_UART_write(chans[SCIB].port, chans[SCIB].frame, FRAME_SIZE);
static Void scia_callback(Int val) { chans[SCIA].frame_count++; // количество переданных // кадров } static Void scib_callback(Int val) { chans[SCIB].frame_count++; // количество принятых // кадров }
Следует отметить, что данный проект обладает следующим достоинствами:
Содержание
|
Учебно-методическое пособие Рекомендовано методической комиссией... Методы молекулярной диагностики: Учебно-методическое пособие. Авторы: А. Д. Перенков, Д. В. Новиков, С. Г. Фомина, Л. Б. Луковникова,... |
Учебно-методическое пособие Елабуга 2016 ббк 74. 58 Учебно-методическое... Методическое пособие предназначено для студентов 1 курса высших учебных заведений неязыковых специальностей |
||
Учебно-методическое пособие по клинической фармакологии Оренбург, 2007 Учебно-методическое пособие предназначено для самостоятельной работы студентов медицинских вузов, обучающихся по специальности «Лечебное... |
Методическое пособие Саратов 2008 г. Организация комплексной системы... Методическое пособие предназначено для руководителей и преподавателей- организаторов обж образовательных учреждений |
||
Учебно-методическое пособие ... |
Организация и технология документационного обеспечения управления учебно-методическое пособие ... |
||
Учебно-методическое пособие «Учебные игры и ситуационные задачи в... Учебные игры и ситуационные задачи в гинекологии: Учебно-методическое пособие / Под ред. А. А. Радионченко. – Томск: Сибгму,... |
Учебно-методическое пособие Казань 2010 Печатается по рекомендации... Учебно-методическое пособие по курсу «Организационное поведение» /Д. М. Сафина. – Казань: Казанский (Приволжский) федеральный университет;... |
||
Учебно-методическое пособие. Новосибирск, 2006 Учебно-методическое пособие предназначено инструкторам детско-юношеского и спортивного туризма с целью повышения уровня знаний и... |
Учебно-методическое пособие к лабораторным занятиям по курсу «Основы кристаллооптики» Практическое руководство по работе с поляризационным микроскопом для исследования петрографических объектов: Учебно-методическое... |
||
Учебно-методическое пособие организация инженерной защиты населения Учебно-методическое пособие разработано применительно к Программе обучения слушателей на курсах гражданской защиты Копейского городского... |
Учебно-методическое пособие Санкт-Петербург 2007 Автор: Черемисов... Учебно-методическое пособие предназначено для подготовки руководящего состава, специалистов гочс и пб, руководителей служб, аварийно-спасательных... |
||
Учебно-методическое пособие для студентов пм. 04.(07.) «Выполнение... Учебно-методическое пособие составлено в соответствии с требованиями Федерального Государственного образовательного стандарта по... |
Учебно-методическое пособие санкт-Петербург 2009г. Автор: Г. П. Подвигин... Учебно-методическое пособие предназначено для должностных лиц, специалистов го и рсчс организаций |
||
Учебно-методическое пособие Кемерово 2015 г. Согласовано: кроо «памск» Учебно-методическое пособие предназначено для студентов стоматологического факультета, гигиенистов стоматологических со средним медицинским... |
Федеральное государственное образовательное учреждение Высшего профессионального... Вакуумный практикум: Учебно-методическое пособие. Ростов-на-Дону, 2008. 55с |
Поиск |