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

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

cross mob
Anonymous
Not applicable

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;

      }

    }

}

0 Likes
1 Solution
Anonymous
Not applicable

Hello Alex,

Have you looked at this post;

Problem with UART watermarks

Please let us know if this helps.

Thanks

JT

View solution in original post

0 Likes
8 Replies
Anonymous
Not applicable

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.

0 Likes
Anonymous
Not applicable

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.

0 Likes
Anonymous
Not applicable

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:

0 Likes
Anonymous
Not applicable

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.

0 Likes
Anonymous
Not applicable

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

0 Likes
Anonymous
Not applicable

Hello Alex,

Have you looked at this post;

Problem with UART watermarks

Please let us know if this helps.

Thanks

JT

0 Likes
Anonymous
Not applicable

this post might be helpful as well, UART Routines

-Kevin

0 Likes
Anonymous
Not applicable

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.

pastedImage_0.png

0 Likes