Post Go back to editing

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

++++

Parents
  • Hi,

    You can disable the interrupt using adi_int_EnableInt() API. This API enables or disables the specified interrupt. If an interrupt is disabled, the interrupt handler will not be run even if the interrupt is raised. Also you can enable the interrupt later by using the adi_int_EnableInt().

    You can refer the below CCES help for more information about the above API.
    Help > Contents > System Run-Time Documentation > Interrupt Support > Interrupt Handler Header File and Functions

    Regards,
    Santha kumari.K

Reply
  • Hi,

    You can disable the interrupt using adi_int_EnableInt() API. This API enables or disables the specified interrupt. If an interrupt is disabled, the interrupt handler will not be run even if the interrupt is raised. Also you can enable the interrupt later by using the adi_int_EnableInt().

    You can refer the below CCES help for more information about the above API.
    Help > Contents > System Run-Time Documentation > Interrupt Support > Interrupt Handler Header File and Functions

    Regards,
    Santha kumari.K

Children
No Data