BF706 Uart Rx interrupt handler problem

Anonymous
Anonymous

Hello.

I'm writing uart sample code for test.

I'm using BF706 chip and trying to use uart0 and now I can send data via uart0 and have an issue while I'm getting data via uart rx interrupt.

I have searched here and found reference code I can try but it's not working as I expected.

What I referred is below link and I copied uart rx handler code from here.

https://ez.analog.com/dsp/blackfin-processors/bf70x/f/q-a/12856/adsp-bf706-uart-problem

When I install uart_rx_interrupt, I could get interrupt but keep getting even though there is no uart transfer so I have no idea how to clear art rx flag.

If I disable "adi_int_InstallHandler(INTR_UART0_STAT, Uart0Interrupt, NULL, true);" at UartInit(), I could see uart messages coming out via PC terminal so t's working.

If I enable  "adi_int_InstallHandler(INTR_UART0_STAT, Uart0Interrupt, NULL, true);" at UartInit(), I could not see any message coming out.

If I trace code via jtag, I could see that after install handler, handler keep posted so couldn't get next line of code.

I think I missed something what I should do but not sure what I missed.

So could some help how to get uart rx interrupt handler whenever I send data from PC?

+++++

void Uart0Interrupt(uint32_t iid, void* handlerArg)
{
    uint32_t stat = *pREG_UART0_STAT;
    uint32_t intV = *pREG_UART0_IMSK_SET;

    *pREG_UART0_IMSK_SET=0x0101;

    if(stat&0x0001)
    {
    rxBuf[rxCount] = *pREG_UART0_RBR;

    if( (rxBuf[rxCount] == '\r') || (rxBuf[rxCount] == '\n') )
    {
        memcpy(rxBuf, uartRxBuf, rxCount);
        bUartRxFlag = true;
    }

if(rxCount >= (UART_RX_BUFF_LEN - 1))
rxCount = 0;
else
rxCount++;
}
}

void UartInit(uint32_t uartNum)
{
/* open the UART driver in Tx mode only */
adi_uart_Open(uartNum, ADI_UART_DIR_BIDIRECTION, driverMemory, ADI_UART_BIDIR_DMA_MEMORY_SIZE, &hUartDevice);
adi_uart_SetMode(hUartDevice, ADI_UART_MODE_UART);
adi_uart_SetBaudRate(hUartDevice, 115200);
adi_uart_SetNumStopBits(hUartDevice, ADI_UART_ONE_STOPBIT);
adi_uart_SetWordLen(hUartDevice, ADI_UART_WORDLEN_8BITS);

adi_int_InstallHandler(INTR_UART0_STAT, Uart0Interrupt, NULL, true);
}

void UartWrite(uint8_t* pBuf, uint32_t len)
{
/* write data to the UART device using a blocking write */
adi_uart_Write(hUartDevice, pBuf, len);
}

int main(int argc, char *argv[])
{
ADI_UART_RESULT eResult;

/**
* Initialize managed drivers and/or services that have been added to
* the project.
* @return zero on success
*/
adi_initComponents();

/* Begin adding your custom code here */
if(adi_pwr_Init(0, CLKIN) != ADI_PWR_SUCCESS)
{
printf("Failed to initialize power service \n");
return 0;
}

UartInit();

while(1)
{
sprintf((char*)uartTxBuf, "Hello there!!!..%d\n", count++);
UartWrite(uartTxBuf, strlen(uartTxBuf));
delay_ms(100000);

if(bUartRxFlag == true)
{
UartWrite(uartRxBuf, strlen(uartRxBuf));
bUartRxFlag = false;
}
}

return 0;
}

++++