1 Reply Latest reply on Oct 4, 2010 6:22 AM by AnuM_41

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


      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 << 8) | 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)) << 8) | ((BYTE)(lo))))


      return MAKEWORD(UART_1_RXSTATUS, UART_1_ReadRxData());