- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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;
}
}
}
Solved! Go to Solution.
- Labels:
-
Peripherhal UART
- Tags:
- missing bytes
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Alex,
Have you looked at this post;
Please let us know if this helps.
Thanks
JT
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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:
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello Alex,
Have you looked at this post;
Please let us know if this helps.
Thanks
JT
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.