AnsweredAssumed Answered

Data loss during multiple UARTs communication S12G128

Question asked by Wang Walter on Nov 17, 2016
Latest reply on Nov 21, 2016 by Radek Sestak

My design is based on S12G128 running at 24M bus clock, and 2 SCI ports are used, 1 of them for downlink communication and another for uplink communication, so it looks like a serial communication bridge.

I'm using CW 5.1 and processor Expert, downlink SCI is configured to 115200 baud and uplink SCI is 19200 baud, both of them are interrupt-enabled and assigned some TX/RX buffer in PE panel.

Uplink received message handling is done in uplink_OnRxChar event, in this event the incomming char is checked and stored to an private buffer, when char count reaches to 5, means a command frame is received, after analysis the frame, a 64-bytes response is sent by calling SendBlock function.

My finding is there are possibility of downlink data loss, especially in downlink RX. By insert GPIO-toggle actions and measuring by oscilloscope, I found calling SendBlock() for 64-bytes will cost around 200~300uS time, this probally causes my problem, because in uplink_OnRxChar event, other interrupt is prohibited unless event/interrupt completed, so during the 200~300uS, probably multiple downlink RX interrupts happened due to high baudrate 115200, but only last one can be served after uplink_OnRxChar event completed.

To resolve the issue, I have to re-enable interrupt before calling SendBlock() by calling __EI() to allow downlink RX interrupt, so downlink RX looks OK, but unfortunately another problem pop up: uplink only TX 63 bytes even I'm calling SendBlock() to transfer 64 bytes.


I'm wondering, can I re-enble interrupt in uplink_OnRxChar event? Can I call SendBlock() in interrupt event? Will this cause un-predictable problem?