Project Home
Project Home
Documents
Documents
Wiki
Wiki
Discussion Forums
Discussions
Project Information
Project Info
Forum Topic - uart read/write interrupt problem: (1 Item)
   
uart read/write interrupt problem  
Dear All,

we are using iMX6 platform, and we implemeted uart read/write in interrupt mode,
and we are able to receive the data from another serial port, but problem is when we  are trying to read data from 
another serial terminal(tera term) rx interrupt updating very 1st time,but when i am trying to read multiple times its 
not updating the value(myvar value), so here i am having doubt like when i am reading multiple times interrupt may be 
not getting called, so if any one faced this kind of problem? if yes kindly help me to solve this issue,and
following are the code details,


//uart initializations
int uart_init()
{
	uint32_t temp=0;
	uint32_t baud=115200;
	uint32_t uartstsreg1val=0;
	uint32_t uartstsreg2val=0;
	uint32_t ucr2Val=0;
	uint32_t ucr4Val=0;
	uint32_t ucr1Val=0;
	uint32_t ucr3Val=0;
                 	uartbase[1]=mmap_device_io( MX6X_UART_SIZE, UART1_BASE );
	devstr.uartbase=uartbase[1];
	ccmbase=mmap_device_io( MX6X_CCM_SIZE, MX6X_CCM_BASE );
	anatopbase=mmap_device_io( MX6X_ANATOP_SIZE, MX6X_ANATOP_BASE );
	interruptret=InterruptAttach(58,inthandler,&devstr,0,_NTO_INTR_FLAGS_TRK_MSK);
	temp = in32(ccmbase + MX6X_CCM_CCGR5);
	temp |= (0x0F << 24);
	out32( ccmbase + MX6X_CCM_CCGR5, temp );
	out32(uartbase[1] + UMCR, 0x0000);
	out32(uartbase[1] + UCR1, 0x0001);//0x2201); //UCR1_UARTEN);
	out32(uartbase[1] + UCR2,0x6041);//0x6027); //0x0);
                 out32(uartbase[1] + UCR3, 0x00000004);
                 out32(uartbase[1] + UCR4, 0x0000);
	set_baudrate(baud);#if 1
	ucr4Val=in32(uartbase[1]+UCR4);
	out32(uartbase[1]+UCR4,ucr4Val|((UCR4_TCEN)));
#if 1
	ucr1Val=in32(uartbase[1]+UCR1);
	out32(uartbase[1]+UCR1,ucr1Val|((UCR1_TXMPTYEN|UCR1_TRDYEN)));
#endif
	ucr2Val=in32(uartbase[1]+UCR2);
	out32(uartbase[1]+UCR2,ucr2Val|UCR2_TXEN);
	//Enabling the RXDSEN bit
	ucr3Val=in32(uartbase[1]+UCR3);

	out32(uartbase[1]+UCR3,ucr3Val|(UCR3_RXDSEN));

	//Enabling the Receive Ready bit
	ucr1Val=in32(uartbase[1]+UCR1);
	out32(uartbase[1]+UCR1,ucr1Val|UCR1_RRDYEN);
	ucr2Val=in32(uartbase[1]+UCR2);
	out32(uartbase[1]+UCR2,ucr2Val|UCR2_RXEN);

	return 0;
}

//uart clock configuration
#define MX6X_HCLK_FREQ			24000000 //24000000
static uint32_t mx6x_pll3_freq()
{
	uint32_t pll3_retval = 0;
	uint32_t div = in32(anatopbase + MX6X_ANATOP_PLL3_USB1_OTG) & 0x3;
	printf("div val=%d\n", div);
	pll3_retval = MX6X_HCLK_FREQ * (20 + (div << 1));
	printf("pll3_retval=%d\n", pll3_retval);
	//return MX6X_HCLK_FREQ * (20 + (div << 1));
	return pll3_retval;
}

static uint32_t mx6x_get_uart_clk(uint32_t freq)
{
   uint32_t reg, podf;
   reg = in32(ccmbase + MX6X_CCM_CSCDR1);
   printf("ccm_cscdr1 val =%d\n", reg);
   podf = (reg & MX6X_CCM_CSCDR1_UART_CLK_PODF_MASK) >>
        MX6X_CCM_CSCDR1_UART_CLK_PODF_OFFSET;
   printf("podf val =%d\n", podf);
    freq /= (podf + 1);
    printf("uart clk is :%d\n", freq);
    return freq;
}

//ISR routine
void rx_interrupt(intrinfo *dev)
{
	uint32_t sts=0;
	uint32_t ucr1Val=0;
		uint32_t ucr2Val=0;
		uint32_t ucr3Val=0;

	ucr1Val=in32(dev->uartbase+UCR1);
	out32(dev->uartbase+UCR1,ucr1Val&(~(UCR1_RRDYEN)));

	ucr3Val=in32(dev->uartbase+UCR3);
	out32(dev->uartbase+UCR3,ucr3Val&(~(UCR3_RXDSEN)));

	usr2Val=in32(dev->uartbase+USR2);
	usr1Val=in32(dev->uartbase+USR1);
	out32(dev->uartbase+USR1, usr1Val&(~USR1_RRDY));

		
    while(in32(dev->uartbase+USR2) & USR2_RDR)
	//if((usr2Val & USR2_RDR))
	{
	//rxdata = in32(dev->uartbase + URXD);
    	//key = rxdata & 0xFF;
		sts +=1;
		myVar = sts+1;
		//usr2Val = in32(dev->uartbase+USR2);
	}
}
void tx_interrupt(intrinfo *dev)
{
	uint32_t ucr1Val=0;
	uint32_t...
View Full Message