UART (v1.20) API bug in UART_GetByte()

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

The API for UART (v1.20) contains a bug in UART_GetByte().

   

This function is intended to return status in the MSB of a 16-bit unsigned int.

   

However, the compiler for PSoC3 does not generate the intended code for the expression:

   

return ( (UART_1_RXSTATUS << 😎 | UART_1_ReadRxData());

   

The result is computed as an 8-bit quantity before type promotion to the 16-bit return value.

   

Thus the MSB is always returned as zero (in R6), as the assembly output listing shows:

   

C51 COMPILER V8.16   UART_1                                                                04/21/2010 23:26:48 PAGE 34 

   

0000 120000      R     LCALL   UART_1_ReadRxData
0003 90646C            MOV     DPTR,#0646CH
0006 E0                MOVX    A,@DPTR
0007 FE                MOV     R6,A
0008 7E00              MOV     R6,#00H
000A EF                MOV     A,R7
000B 4E                ORL     A,R6
000C FF                MOV     R7,A
000D 7E00              MOV     R6,#00H
000F 22                RET    
 

   

Construction of a 16-bit result from two 8-bit parts is a generic problem which requires use of a construct such as the Windows MAKEWORD macro to typecast the bytes before use:

   

#define MAKEWORD(lo,hi) ((WORD)((((WORD)(hi)) << 😎 | ((BYTE)(lo))))
 

   

return MAKEWORD(UART_1_RXSTATUS, UART_1_ReadRxData());

0 Likes
1 Reply