AnsweredAssumed Answered

UART imx6 trash problem

Question asked by João Silva on Dec 3, 2016

Hello everyone,


I am trying to port FreeRTOS to execute in the imx6 smart devices board and I'm developing the needed drivers to do it and I am facing an issue trying to use the serial port, I have seen many examples using the serial port but everything I do goes the same way. If I use a function to print just one character. I am able to print the character, like one by one(Calling the same function separately), but if I use a function to print a string for example, that is nothing more than print some characters one after the other i only get trash in my port. I will put my code here, if you could help me would be great.


This function I use for the serial port configuration.


int mxc_serial_init(void)
int tmp;
__REG((0x020e0000) + 0x280) = 0x00000003; // ALT3 CSI0_DAT10 TxD
__REG((0x020e0000) + 0x284) = 0x00000003; // ALT3 CSI0_DAT11 RxD
__REG((0x020e0000) + 0x920) = 0x00000001; //UART1_UART_RX_DATA_SELECT_INPUT
tmp=__REG((0x020c4000) + 0x24) & 0x0000003F ; //CSCDR1 uart_podf div by 1
__REG((0x020c4000) + 0x24) = tmp; // UART refclk = 80MHz

// Enable UART1
// enable uart1, ignore RTS, wordsize 8bits, 1 stop bit, no parity
__REG(UART1_BASE + UCR2) = 0x01; // reset UART state machines
__REG(UART1_BASE + UCR2) = 0x2006; // UCR2 = CTSC,TXEN,RXEN=1,reset
__REG(UART1_BASE + UCR1) = 0x0001; // UARTEN = 1,enable the clock
__REG(UART1_BASE + UCR2) |= UCR2_IRTS; // configure IRTS bit
__REG(UART1_BASE + UCR3) |= 0x00000004; // set RXD_MUX_SEL bit
__REG(UART1_BASE + UCR1) |= 0x0201; // recieve ready interput enable

// disable parity
__REG(UART1_BASE + UCR2) &= ~(0x00000100);

tmp = __REG(UART1_BASE + UCR1); // save UFCR to default value
__REG(UART1_BASE + UFCR) = 5<<7; // set RFDIV to div-by-1 or b101
__REG(UART1_BASE + UFCR) |= tmp; // set other UFCR bits back to default
__REG(UART1_BASE + UBIR) = 0x4;
__REG(UART1_BASE + UBMR) = 0xD8;


These next two functions I use to print a character.


int mxc_can_putc(void)
unsigned int status = __REG(uart_address_global + UTS);

if (status & UTS_TXFULL)
return FALSE;
return TRUE;

void mxc_serial_putc(signed char c)
/* wait for transmitter to be ready */
while (!mxc_can_putc());
//while(__REG(uart_address_global + UTS) & UTS_TXFULL)


And this one I use to print a string:


void mxc_serial_puts(char *s)
//int aaa = 0;
while (*s)
//while (!mxc_can_putc());
//for(aaa = 0; aaa < 500000000; aaa++);




Now, if I call myself the putc function I can print the char I want, but if I use the puts I only get trash.

Like in the next example:


void _init(void)


This is the output i have:


���e����m��s��{m�O�1\-+��^�� T .�Uq���}'qע�����d���u�/����I��=>�?��M�; �����w���=Pj���w�.�`�mw]�uF>�wo���ܹ�{�X�7}I����3���/?����cf �.�N���� �)����\���ݽ��￱�לm���λz�z����/~Cɽ/T����Z���� ��<�{���j� O��H��� |� E����_���^�  ֕� �v����s�ͫ<���ʳ�����=�l��ܗ�������7G?�?�� |���U}��埧��}ս�������3�� ��Ӷg�?��t|�V��������c�����Go�o��M]�{�>��}Ğum�~{�Rjo/��


Do you know what can possibly causing this?


Kind Regards,

João Silva