@@ -290,6 +290,7 @@ int SoftwareSerial::begin(uint32_t baudrate, uint32_t sconfig, bool inverted)
290290    if  (fsp_tim_config (&tx_descr.tim , config.baudrate , false ) != 0 ) {
291291        return  0 ;
292292    }
293+ 
293294    if  (fsp_dma_config (&tx_descr.dma , SS_DMA_CHANNEL_TX,
294295        fsp_tim_to_elc_event (tx_descr.tim .get_channel ()), tx_descr.dmabuf [0 ],
295296        (void  *) &tx_port->PCNTR3 , config.nsamples , dma_tx_callback, this ) != 0 ) {
@@ -301,6 +302,7 @@ int SoftwareSerial::begin(uint32_t baudrate, uint32_t sconfig, bool inverted)
301302    if  (fsp_tim_config (&rx_descr.tim , config.baudrate , true ) != 0 ) {
302303        return  0 ;
303304    }
305+ 
304306    if  (fsp_dma_config (&rx_descr.dma , SS_DMA_CHANNEL_RX,
305307        fsp_tim_to_elc_event (rx_descr.tim .get_channel ()), rx_descr.dmabuf [0 ],
306308        (void  *) &rx_port->PCNTR2 , config.nsamples , dma_rx_callback, this ) != 0 ) {
@@ -359,17 +361,20 @@ size_t __attribute__((optimize("O2"))) SoftwareSerial::write(uint8_t byte)
359361       tx_descr.dmabuf [0 ][config.databits  + 1 ] = parity;
360362    }
361363
362-     //  Reconfigure DMA transfer.
363-     R_DMAC_Reconfigure (&tx_descr.dma .ctrl , tx_descr.dma .cfg .p_info );
364+     //  Restart DMA transfer.
365+     R_DMAC_Reset (&tx_descr.dma .ctrl , tx_descr.dma .cfg .p_info ->p_src ,
366+             tx_descr.dma .cfg .p_info ->p_dest , tx_descr.dma .cfg .p_info ->length );
364367
365368    //  Start the DMA transfer.
366369    tx_descr.tim .reset ();
367370    tx_descr.tim .start ();
368371
369-     //  TODO check if  transfer is running on next write .
372+     //  Wait for the DMA  transfer to finish .
370373    while  (tx_descr.dma .ctrl .p_reg ->DMCNT ) {
371-         //  Wait for DMA transfer to finish.
372374    }
375+ 
376+     //  Stop the trigger timer.
377+     tx_descr.tim .stop ();
373378    return  1 ;
374379}
375380
@@ -382,9 +387,10 @@ void __attribute__((optimize("O2"))) SoftwareSerial::rx_process()
382387{
383388    static  uint32_t  bufidx = 0 ;
384389
385-     //  Reconfigure  DMA transfer.
390+     //  Restart  DMA transfer.
386391    rx_descr.dma .cfg .p_info ->p_dest  =  rx_descr.dmabuf [bufidx ^ 1 ];
387-     R_DMAC_Reconfigure (&rx_descr.dma .ctrl , rx_descr.dma .cfg .p_info );
392+     R_DMAC_Reset (&rx_descr.dma .ctrl , rx_descr.dma .cfg .p_info ->p_src ,
393+             rx_descr.dma .cfg .p_info ->p_dest , rx_descr.dma .cfg .p_info ->length );
388394
389395    //  Process the current DMA buffer.
390396    uint8_t  data = 0 ;
@@ -434,9 +440,12 @@ void __attribute__((optimize("O2"))) SoftwareSerial::rx_process()
434440
435441void  dma_tx_callback (dmac_callback_args_t  *args)
436442{
437-     //  Disable the DMA trigger timer as soon as the transfer is complete.
438-     //  Note the timer will be cleared and restarted on next write.
439-     ((SoftwareSerial *) args->p_context )->tx_descr .tim .stop ();
443+     //  Wait for the cycle to finish to keep the GPIO high enough for the last stop bit.
444+     fsp_tim_t  *tim = &(((SoftwareSerial *) args->p_context )->tx_descr .tim );
445+     volatile  R_GPT0_Type *regs = R_GPT0 + (tim->get_channel () * (R_GPT1 - R_GPT0));
446+     regs->GTST_b .TCFPO  = 0 ;
447+     while  (!regs->GTST_b .TCFPO ) {
448+     }
440449}
441450
442451void  dma_rx_callback (dmac_callback_args_t  *args)
0 commit comments