Post Go back to editing

BF706 Uart Rx interrupt handler problem

FormerMember
FormerMember

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;
}

++++