Part Number: CC3220SF-LAUNCHXL
Other Parts Discussed in Thread: CC3220SF
Tool/software: Code Composer Studio
Hello! I try define UART interrupt using in my application based on netwotk_terminal_CC3220SF_LAUNCHXL_tirtos_ccs. The UART drivers are not compatable with my UART protocol processing and I need have my own interrupt, that process my UART packet.
My first error was, that UART interrupt called forever, and application don't work. I fixed it by using MAP_UARTIntDisable(hwAttrs->baseAddr,0xFFFF);
Now I have problem, that interrupt generate only for even symbol, and when I can read two received symbols. After I send one character to UART, I don't get interrupt, then I send second symbol - UART interrupt generate and I can read two character. But I need get interrupt for every symbol received. UART FIFO is disabled. What error I make, when configuring UART interrupt?
P.S. I tryed use HWI instead MAP_UARTIntRegister(hwAttrs->baseAddr,UART0_Handler), but it have same effect.
Thank you!
My code:
static void UART0_Handler(uintptr_t arg)
{
char UART_STATUS = 0;
char byBuf;
int i=0;
UARTCC32XX_HWAttrsV1 const *hwAttrs = rfidHandle->hwAttrs;
UART_STATUS = UARTIntStatus(hwAttrs->baseAddr, true);
MAP_UARTIntClear(hwAttrs->baseAddr,UART_STATUS);
if((UART_STATUS & UART_INT_RX) && MAP_UARTCharsAvail(hwAttrs->baseAddr))
{
//clear the receive interrupt
MAP_UARTIntClear(hwAttrs->baseAddr, UART_INT_RX);
//receive data here
byBuf = (unsigned char)MAP_UARTCharGetNonBlocking(hwAttrs->baseAddr);
/* My own code process UART message */
}
}
void RFIDUartInit()
{
UART_Params uartParams;
pthread_t uartmonThread;
pthread_attr_t attrs;
struct sched_param priParam;
int retc;
ClockP_FreqHz freq;
uint16_t pin;
uint16_t mode;
long lFIFOLvlRx;
long lFIFOLvlTx;
byRecCntRfid=0;
rfidHandle = (UART_Handle)&(UART_config[Board_UART0]);
UARTCC32XX_Object *object = rfidHandle->object;
UARTCC32XX_HWAttrsV1 const *hwAttrs = rfidHandle->hwAttrs;
/* Get the Power resource Id from the base address */
object->powerMgrId = getPowerMgrId(hwAttrs->baseAddr);
if (object->powerMgrId == (unsigned int)-1) {
DebugP_log1("UART:(%p) Failed to determine Power resource id",
hwAttrs->baseAddr);
return (NULL);
}
/*
* Register power dependency. Keeps the clock running in SLP
* and DSLP modes.
*/
Power_setDependency(object->powerMgrId);
pin = (hwAttrs->rxPin) & 0xff;
mode = (hwAttrs->rxPin >> 8) & 0xff;
MAP_PinTypeUART((unsigned long)pin, (unsigned long)mode);
pin = (hwAttrs->txPin) & 0xff;
mode = (hwAttrs->txPin >> 8) & 0xff;
MAP_PinTypeUART((unsigned long)pin, (unsigned long)mode);
MAP_UARTDisable(hwAttrs->baseAddr);
ClockP_getCpuFreq(&freq);
MAP_UARTConfigSetExpClk(hwAttrs->baseAddr,freq.lo,
RFIDUART_BAUDRATE,(UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
MAP_UARTFlowControlSet(hwAttrs->baseAddr, UART_FLOWCONTROL_NONE);
MAP_UARTFIFODisable(hwAttrs->baseAddr); //disable fifo
MAP_UARTFIFOLevelSet(hwAttrs->baseAddr,0,0);
//here we will configure the UART-0 interrupt based communication
MAP_UARTIntDisable(hwAttrs->baseAddr,0xFFFF);
MAP_UARTIntEnable(hwAttrs->baseAddr,UART_INT_RX);
//Here I try use direct register interrupt function
// MAP_UARTIntRegister(hwAttrs->baseAddr,UART0_Handler); //enable interrupts
//Here I use HWI
HwiP_Params hwiParams;
HwiP_Params_init(&hwiParams);
hwiParams.arg = (uintptr_t)rfidHandle;
hwiParams.priority = hwAttrs->intPriority;
object->hwiHandle = HwiP_create(hwAttrs->intNum, UART0_Handler,
&hwiParams);
if (object->hwiHandle == NULL) {
System_printf("UART:(%p) HwiP_create() failed", hwAttrs->baseAddr);
// UARTCC32XX_close(handle);
return (NULL);
}
Swi_Params swiPar;
Swi_Params_init(&swiPar);
swiPar.priority=1;
RFIDRecSWI=Swi_create(RFIDRec,&swiPar,NULL);
MAP_UARTEnable(hwAttrs->baseAddr);
return(rfidHandle);
}