8 Replies Latest reply on Jul 2, 2015 10:54 AM by alle_676531

    SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed

    alle_676531

      Hey,

      I used puart_print and puart_wirte to send data from tag3 board on peripheral uart to another host MCU via uart.that is set to be

      115200/8/n/1.I have also boosted the tag3 board VCC to 3.0V because my host MCU is powered by 3V.

       

      So far tag board can receive data reliably form host MCU as SOC is configured to be Rx interrupt driven.

      However I did not use Tx on SOC to be interrupt driven but just used puart API calls like puart_print and puart_write functions.

       

      As observed from trace log on my host MCU side, occasionally the sent packet from SOC could have missing byte(s) (framing error) .

      I have read puart_print and puart_write a bit on other Wiced projects' examples, and noticed that this two function will be blocked if tx FIFO is full. from my setup to my host MCU, I did not use HW flow control since host MCU cannot avoid extra signal pins as other GPIOs pin has been assigned for other host MCU control application, so HW flow control cannot be an option.

       

      How and what can 1 do to setup SOC for Tx interrupt driven like the Rx is set for interrupt too? Please send me any example codes to setup TX for interrupt driven.

       

      See below my usage of puart_print and puart_write, I use fine timer tick routine to poll for data exhange by sending host MCU as request commnad and enable RX interrupt after sent by using puart_print or puart_write, the fine time is ticked at 500ms periodically.

       

      >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

       

      // It will be called every fine timer tick at every 500ms time interval.

      void mybeacon_manage_timer_fine()

      {

          //Todo: do you actions here every fine timer tick

          // Poll for host mcu for data exhange ie, occupancy/unoccupancy heat and cool setpoints per 100ms

          // Data exchange objects are listed in Config_Cmd lookup table

          BOOL Status;

       

          // exit if not in BLE application config mode or DE update is in progress

          if (BleAppControl.Mode != BLE_CONFIG_MODE || bBleAppDEUpdateinProgess)

            return;

       

          if (BleAppConfig.bLocked)

          {

             BleAppLockDuration++;

             ble_trace1("BleAppLockDuration: %d\r\n", BleAppLockDuration);

             if (BleAppLockDuration % MAX_BLE_APP_LOCK_DURATION)

               return;

       

             // unlock to resume normal scan operation,

             // however the last scan request will be discarded

             BleAppConfig.bLocked = FALSE;

          }

       

          // clear Rx interrupt

          P_UART_INT_CLEAR(P_UART_ISR_RX_AFF_MASK);

       

          // flush Rx FIFO

          while(puart_rxFifoNotEmpty())

          {

            UINT8 readbyte;

            puart_read((UINT8*)&readbyte);

            ble_trace1("flush Rx FIFO: %c\r\n", readbyte);

          }

       

          BleAppConfig.Id = (BleAppConfig.Id+1)%MAX_BLE_CONFIG_ID;

          ble_trace1("BleAppConfig.Id: %d\r\n", BleAppConfig.Id);

          BleAppConfig.bSet = GET_CFG;

          BleAppConfig.bWaitAck = FALSE;

          BleAppConfig.bCrcEnabled = FALSE;

          BleAppConfig.Crc32 - 0;

       

          if (Status = (BleAppBuildConfigCmdString(&BleAppConfig)))

          {

            // send SoC request for config data

            // Note: break string down to CFG_CMD_BUFSZ bytes per send if size > CFG_CMD_BUFSZ bytes

            // or make it simply fit into CFG_CMD_BUFSZ-2 bytes for config caommad

            // (1 for LF, 1 for CR, make command string size to be 16-2 = 14 bytes)

            if (BleAppConfig.Size <= sizeof(BleAppConfig.StrBuf)-2)

            {

              puart_print(BleAppConfig.StrBuf);

              puart_print(LF_CR);

       

              // clear StrBuf after send for saving received response

              memset(BleAppConfig.StrBuf, 0, sizeof(BleAppConfig.StrBuf));

              BleAppConfig.Size = 0;

       

              // lock next poll for DE data variables until response is received

              BleAppConfig.bLocked = TRUE;

       

              // enable UART Rx interrupt in the Main Interrupt Controller

              P_UART_INT_ENABLE |= P_UART_ISR_RX_AFF_MASK;

            }

          }

      }

        • 1. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
          alle_676531

          ble application config structure is shown below

           

          >>>>>>>>>>>>>>

          // BLE application control

          typedef struct {

             BYTE   Mode;

             BOOL   BlockTransfer;

          } BLE_APP_CTRL, *LPBLE_APP_CTRL;

           

          // BLE application config ID

          typedef enum {

            OCCU_HEAT_SETPOINT = 0,

            OCCU_COOL_SETPOINT,

            UNOCCU_HEAT_SETPOINT,

            UNOCCU_COOL_SETPOINT,

            OCCUPANCY_MODE,

           

            MAX_BLE_CONFIG_ID

          } eConfigId;

           

          // BLE application config data structure

          #define CFG_CMD_BUFSZ 16

          #define CFG_CMD_SZ    4

          #define CFG_WR_ARGSZ  4   /* since max write argument size is 4, value may be enum value in some config settings */

          typedef struct {

            eConfigId          Id;

            BOOL                 bLocked;         /* 0-unlock, 1-lock */

            BOOL               bSet;

             #define GET_CFG  0    /* read configuration */

             #define SET_CFG  1    /* write configuration */

            BOOL               bWaitAck;

            BOOL               bCrcEnabled;   /* 0-disable, 1-enable */

            char               SetArgv[CFG_WR_ARGSZ];

            UINT8                 Size;

            char               StrBuf[CFG_CMD_BUFSZ];

            unsigned long      Crc32;

          } BLE_APP_CONFIG, *LPBLE_APP_CONFIG;

           

          typedef struct {

             UINT16  EnumId;

             char    CmdId[CFG_CMD_SZ];

             char    CmdStr[CFG_CMD_BUFSZ];

          } CFGCMD_DEF, *LPCFGCMD_DEF;

           

          Note: I reuse StrBuf[] for send request command from SOC to host MCU for TX, and for saving response characters from host MCU for RX, so literally the communication is half duplex that is good enough for my application.

          • 2. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
            alle_676531

            My host mcu is set to be listener, Broadcom SOC will initiate communication to send command to host mcu for data exchanged variables, host mcu upon received command and validated ok, will send response back to SOC after decoding command from the received packet.if valid or "NAK" if received packet is corrupted or invalid command.

            • 3. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
              alle_676531

              see below capture from Wiced event window

               

              >>>>>>>>>>>>

              BleAppConfig.Id: 4

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - BleAppBuildConfigCmdString:

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - Size: 10

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - 646220722c6d76383030    <<<< command to puart_print

              12:40:52 - 12:40:52 - PUartRxCallback >> number_of_bytes_read: 1  <<< rx byte =1, dequeue to strBuf buffer

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - 46

              12:40:52 - 12:40:52 - PUartRxCallback >> number_of_bytes_read: 3 <<< rx bytes = 3, append to end of strBuf buffer

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - 46310d    <<< "F0" received which is NAK

              12:40:52 - 12:40:52 - onUARTReceive >>>

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - no_of_chars: 3,  bParsed:1

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 -

              12:40:52 - 12:40:52 - 46310d

              12:40:52 - 12:40:52 - NAK'd

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - BleAppConfig.Id: 0

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - BleAppBuildConfigCmdString:

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - Size: 10

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - 646220722c6176313030

              12:40:53 - 12:40:53 - PUartRxCallback >> number_of_bytes_read: 1

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - 32

              12:40:53 - 12:40:53 - PUartRxCallback >> number_of_bytes_read: 6

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - 32312e30300d

              12:40:53 - 12:40:53 - onUARTReceive >>>

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - no_of_chars: 6,  bParsed:1

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - 32312e30300d

              12:40:53 - 12:40:53 - BleAppUpdateDEVarables >>> ConfigId: 0, BleAppConfig size: 7

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - Copy size: 5

              12:40:53 - 12:40:53 - 32312e3030

              12:40:53 - 12:40:53 - timeout:56

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - BleAppControl Mode: 0

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - BleAppScanDuration: 33

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - 02010615ff0f0001008b21e2000ef811

              12:40:53 - 12:40:53 - e5a72f0002a5d5c51b

              12:40:53 - 12:40:53 - 10096d79426561636f6e5f6d616e6167

              12:40:53 - 12:40:53 - 65020a04

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - blecm evt handler:

              12:40:53 - 12:40:53 - 0e0401082000

              12:40:53 - 12:40:53 -

              12:40:53 - 12:40:53 - blecm evt handler:

              12:40:53 - 12:40:53 - 0e0401092000

              12:40:54 - 12:40:54 - 02010615ff0f0001008b21e2000ef811

              12:40:54 - 12:40:54 - e5a72f0002a5d5c51b

              12:40:54 - 12:40:54 - 10096d79426561636f6e5f6d616e6167

              12:40:54 - 12:40:54 - 65020a04

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - blecm evt handler:

              12:40:54 - 12:40:54 - 0e0401082000

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - blecm evt handler:

              12:40:54 - 12:40:54 - 0e0401092000

              12:40:54 - 12:40:54 - timeout:57

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - BleAppControl Mode: 0

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - BleAppScanDuration: 34

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - BleAppConfig.Id: 1

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - BleAppBuildConfigCmdString:

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - Size: 10

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - 646220722c6176313031

              12:40:54 - 12:40:54 - PUartRxCallback >> number_of_bytes_read: 1

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - 32

              12:40:54 - 12:40:54 - PUartRxCallback >> number_of_bytes_read: 6

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - 32332e30300d

              12:40:54 - 12:40:54 - onUARTReceive >>>

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - no_of_chars: 6,  bParsed:1

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - 32332e30300d

              12:40:54 - 12:40:54 - BleAppUpdateDEVarables >>> ConfigId: 1, BleAppConfig size: 7

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - Copy size: 5

              12:40:54 - 12:40:54 - 32332e3030

              12:40:54 - 12:40:54 - BleAppConfig.Id: 2

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 -

              12:40:54 - 12:40:54 - BleAppBuildConfigCmdString:

              • 4. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
                alle_676531

                To further trace this issue why puart_write or puart_synchronousWrite could miss character, I enabled tx done callback by setting P_UART_ISR_TX_FAE_MASK flag in P_UART_INT_ENABLE, in tx done callback I traced to see if tx fifo is empty or not.

                 

                If all characters in tx fifo are sent, the fifo empty flag traced inside tx done callback function should be TRUE (means empty and all characters are sent).

                From event log trace, occasionally tx fifo empty is false when traced in tx done callback.

                • 5. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
                  alle_676531

                  Below is my puart init function and tx done callback.

                   

                  >>>>>>>>>>>

                  / Callback called by the FW when ready to sleep/deep-sleep. Disable both by returning 0

                  // when there is an active download ongoing.

                  UINT32 uart_device_lpm_queriable(LowPowerModePollType type, UINT32 context) {

                    // Disable sleep.

                    return 0;

                  }

                   

                  void PUartInit(BLE_PROFILE_PUART_CFG *pUartcfg, FUNC_ON_UART_RECEIVE callback) {

                    extern puart_UartConfig puart_config;

                   

                   

                    // Set the baud rate we want to use. Default is 115200.

                    puart_config.baudrate = pUartcfg->baudrate;

                   

                   

                    // Select the uart pins for RXD, TXD and optionally CTS and RTS.

                    // If hardware flow control is not required like here, set these

                    // pins to 0x00. See Table 1 and Table 2 for valid options.

                    puart_selectUartPads(pUartcfg->rxpin, pUartcfg->txpin, 0x00, 0x00);

                   

                   

                    // Initialize the peripheral uart driver

                    puart_init();

                   

                   

                    // Since we are not configuring CTS and RTS here, turn off

                    // hardware flow control. If HW flow control is used, then

                    // puart_flowOff should not be invoked.

                    puart_flowOff();

                   

                   

                    #ifdef SLEEP_DISABLED    <<< SLEEP_DISABLED is defined in my application

                    // Since we are not using any flow control, disable sleep.

                    // If HW flow control is configured or app uses its own flow control mechanism,

                    // this is not required.

                    devlpm_registerForLowPowerQueries(uart_device_lpm_queriable, 0);

                    #endif

                   

                   

                    // BEGIN - puart interrupt

                    //  The following lines enable interrupt when one (or more) bytes

                    //  are received over the peripheral uart interface. This is optional.

                    //  In the absense of this, the app is expected to poll the peripheral

                    //  uart to pull out received bytes.

                   

                   

                    // clear interrupt

                    P_UART_INT_CLEAR(P_UART_ISR_RX_AFF_MASK | P_UART_ISR_TX_FAE_MASK);

                   

                   

                    // set watermark to 1 byte - will interrupt on every byte received.

                    P_UART_WATER_MARK_RX_LEVEL(1);

                   

                   

                    // Set watermark to 0 when Tx is done

                    P_UART_WATER_MARK_TX_LEVEL(0);

                   

                   

                    // enable UART interrupt in the Main Interrupt Controller and RX Almost Full in the UART

                    // Interrupt Controller

                    P_UART_INT_ENABLE |= P_UART_ISR_RX_AFF_MASK;

                   

                   

                    // Set callback function to app callback function.

                      puart_rxCb = PUartRxCallback;

                   

                   

                    // also register a listener from the caller if callback is valid

                    if (callback)

                     onReceiveCB = callback;

                   

                   

                    // register Tx done callback

                    puart_txCb = PUartTxDoneCallback;

                   

                   

                    // Enable the CPU level interrupt

                    puart_enableInterrupt();

                   

                   

                    /* END - puart interrupt */

                  }

                   

                  void PUartTxDoneCallback(void) {

                    ble_trace1("PUartTxDoneCallback >>>>>>>>> P_UART_TX_FIFO_IS_EMPTY: %d", P_UART_TX_FIFO_IS_EMPTY());

                    P_UART_INT_CLEAR(P_UART_ISR_TX_FAE_MASK);

                  }

                   

                  >>>>>>>>>>>>>>>>

                  The TX tor sending command is triggered per fine time tick (500ms) and will be locked for another data exchange poll fine time ticks until response (rx) is received.

                   

                  // It will be called every 1 sec

                  void mybeacon_manage_timer_1s()

                  {

                     //Todo: do you actions here every 1 second

                     ble_trace1("BleAppControl Mode: %d\r\n", BleAppControl.Mode);

                   

                   

                     // if BLE application is not in config mode, start scan duration count down

                     if (BleAppControl.Mode != BLE_CONFIG_MODE)

                     {

                     // Check if BLE application scan duration expired

                     BleAppScanDuration++;

                     ble_trace1("BleAppScanDuration: %d\r\n", BleAppScanDuration);

                     if (!(BleAppScanDuration % MAX_BLE_APP_SCAN_DURATION))

                     {

                    // Set BLE application control mode to BLE_CONFIG_MODE

                    BleAppControl.Mode = BLE_CONFIG_MODE;

                     }

                     }

                  }

                   

                   

                  // It will be called every fine timer tick

                  void mybeacon_manage_timer_fine()

                  {

                      //Todo: do you actions here every fine timer tick

                      // Poll for host mcu for data exhange ie, occupancy/unoccupancy heat and cool setpoints per fine timer tick

                    // Data exchange objects are listed in Config_Cmd lookup table

                      BOOL Status;

                   

                   

                      // exit if not in BLE application config mode or DE update is in progress

                      if (BleAppControl.Mode != BLE_CONFIG_MODE || bBleAppDEUpdateinProgess)

                        return;

                   

                   

                      if (BleAppConfig.bLocked)

                    {

                      BleAppLockDuration++;

                      ble_trace1("BleAppLockDuration: %d\r\n", BleAppLockDuration);

                      if (BleAppLockDuration % MAX_BLE_APP_LOCK_DURATION)

                        return;

                   

                   

                      // unlock to resume normal scan operation,

                      // however the last scan request will be discarded

                      BleAppConfig.bLocked = FALSE;

                    }

                   

                   

                      BleAppConfig.Id = (BleAppConfig.Id+1)%MAX_BLE_CONFIG_ID;

                      ble_trace1("BleAppConfig.Id: %d\r\n", BleAppConfig.Id);

                      BleAppConfig.bSet = GET_CFG;

                      BleAppConfig.bWaitAck = FALSE;

                      BleAppConfig.bCrcEnabled = FALSE;

                      BleAppConfig.Crc32 = 0;

                   

                   

                      if (Status = (BleAppBuildConfigCmdString(&BleAppConfig)))

                    {

                     // send SoC request for config data

                     // Note: break string down to CFG_CMD_BUFSZ bytes per send if size > CFG_CMD_BUFSZ bytes

                     // or make it simply fit into CFG_CMD_BUFSZ-2 bytes for config command

                     // (1 for LF, 1 for CR, make command string size to be 16-2 = 14 bytes)

                        if (BleAppConfig.Size <= sizeof(BleAppConfig.StrBuf)-2)

                        {

                      if (P_UART_TX_FIFO_IS_EMPTY())

                      {

                       puart_synchronousWrite(BleAppConfig.StrBuf, strlen(BleAppConfig.StrBuf));

                   

                   

                            // clear StrBuf after send for saving received response

                         memset(BleAppConfig.StrBuf, 0, sizeof(BleAppConfig.StrBuf));

                         BleAppConfig.Size = 0;

                   

                   

                         // lock next poll for DE data variables until response is received

                         BleAppConfig.bLocked = TRUE;

                   

                   

                         P_UART_INT_ENABLE |= P_UART_ISR_TX_FAE_MASK;

                      }

                      else

                       ble_trace0("mybeacon_manage_timer_fine >>> Abort! TX fifo is not empty!!");

                        }

                    }

                  }

                   

                  >>>>>>>>>>>>>>

                  event trace capture for succesful case

                  Size: 12, db r,av101

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 - 646220722c61763130310d0a

                  16:16:02 - 16:16:02 - 02010615ff0f0001008b21e2000ef811

                  16:16:02 - 16:16:02 - e5a72f0002a5d5c51b

                  16:16:02 - 16:16:02 - 10096d79426561636f6e5f6d616e6167

                  16:16:02 - 16:16:02 - 65020a04

                  16:16:02 - 16:16:02 - PUartTxDoneCallback >>>>>>>>> P_UART_TX_FIFO_IS_EMPTY: 1

                  16:16:02 - 16:16:02 - PUartRxCallback >> number_of_bytes_read: 7

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 - 32332e30300d0a

                  16:16:02 - 16:16:02 - onUARTReceive >>>

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 - no_of_chars: 6,  bParsed:1

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 - 32332e30300d

                  16:16:02 - 16:16:02 - BleAppUpdateDEVarables >>> ConfigId: 1, BleAppConfig size: 7

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 -

                  16:16:02 - 16:16:02 - Copy size: 5

                  16:16:02 - 16:16:02 - 32332e3030

                   

                  >>>>>>>>>>>>>>

                  event trace capture for failed  case

                  BleAppConfig.Id: 4

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 - BleAppBuildConfigCmdString >>>>>>>>>>>>>>

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 - Size: 12, db r,mv800

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 -

                  16:17:23 - 16:17:23 - 646220722c6d763830300d0a

                  16:17:24 - 16:17:24 - PUartTxDoneCallback >>>>>>>>> P_UART_TX_FIFO_IS_EMPTY: 0

                  16:17:24 - 16:17:24 - PUartRxCallback >> number_of_bytes_read: 4

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 - 46310d0a

                  16:17:24 - 16:17:24 - onUARTReceive >>>

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 - no_of_chars: 3,  bParsed:1

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 -

                  16:17:24 - 16:17:24 - 46310d

                  16:17:24 - 16:17:24 - NAK'd

                  • 6. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
                    jota_1939431

                    Hello Alex,

                     

                    Have you looked at this post;

                     

                    Problem with UART watermarks

                     

                    Please let us know if this helps.

                     

                    Thanks

                    JT

                    • 8. Re: SDK2.2: puart_print or puart_write is not reliable, some sent data could be missed
                      alle_676531

                      In my application, I have changed the tag3 board's vcc to 3.3v also I used pin24 for tx and pin 25 for rx, not using the default 32 and 33 for tx/rx from most examples in Wiced.

                       

                      I changed back to use default tx/rx on pin32 and pin33, so I can capture send commands from the same usb port on the tag3 port connected to my pc but on a tera term vt terminal on the puart usb COM interface other than the HCI Com interface, this is just a test for puart send, since our design will not have usb interface and no fdti chip on the our board to reduce the component cost. (our board design will just connect soc rx to tx of host mcu, and tx of soc to rx of host mcu plus ground and vcc from the host mcu (host mcu vcc = 3.3v and is used to power the our BTLE soc board too).

                       

                      The results to me is no issue in missing send command characters, so looked to me there is no issue in firmware, it might be related to the uart rx/tx assignement on different port other than the default ??? ( I doubt) or the electrical characteristics of the uart interface with my host (vcc, ground) especially I boosted up the tag3 board vcc to 3.3v.

                       

                      Still it is unsure at this stage, I will ask our hardware designer to investigate it from hardware perspective, having said it is just for firmware development on tag3 board, I will rather pay more attentions to the hardware and electrical characteristic on uart interface once our hardware boards are rolled out.

                       

                      the most important part is firmware running ok with no missing characters on using puart_write/print and puart_synchronousWrite if I use tag3 board default tx/rx assignment on fdti (usb) interface.