Hello
We are using the TMS320F28388D processor and we must have a UART link to other devices that supports an efficient, high-speed interface.
We have decided NOT to use an SCI UART on the CPU cores because
a) it only goes up to 12.5Mbps (at max core clock rate of 200MHz)
b) it has limited baud rate choices.
b) it does not support DMA operations.
c) we are using the CPUs for other intensive operations.
So, we are looking into the CM-UART that is accessible by the ARM core. On the surface, it appears to have most of what we need:
a) goes up to 15.625Mbps (at 125MHz core clock).
b) it has a fractional baud rate divider for more baud choices
c) it is supported by the uDMA module.
We are now being stymied by what appears to be limitations in the CM-UART design. This is not meant to criticize, I realize there are design decisions that needed to be made, but I get the feeling I must be overlooking something because it seems the CM-UART is being hobbled by the following artifacts:
a) The introduction to the CM-UART in the TRM says "programable FIFO length". But I have not found a register that can set the FIFO length. There appear to be only two choices. (A) FIFO length of 1 (i.e. disable the FIFO) or (B) FIFO length of 16. At 15.625Mbps, a byte is received every 640ns. So, if I don't use the 16-deep FIFO I have to set the UART interface to the highest priority just to keep up.
b) If I do use the FIFO, the minimum RXIFLSEL value is 1/8 the FIFO depth. That is 2 bytes. In our system, the data comes in bursts and is not guaranteed to be an even number of bytes, so if an odd number of bytes is received, then one byte can get stuck in the FIFO without generating an interrupt. Also, depending on how the interrupts are serviced, this situation could probably happen if an even number of bytes was sent.
c) So, we turned our attention to the uDMA. This module appears to be able to pull data from the UART regardless of the FIFO fill level, but the uDMA module itself only allows the user to specify a size and and end address. The ping-pong feature could be used to switch between buffers, but the uDMA module itself does not appear to have any registers that tell the user how much data has been transferred. It only tells you when a transfer is complete. So, if the received data only partially completes a uDMA transfer there is no way to pull the data from the partial buffer and restart the transfer. So, again, we are in a situation in which data is stuck in a buffer waiting for more data arrive in order to trigger an interrupt. Or, we could set the uDMA transfer size to 1 and again have to deal with an interrupt on every single byte of data (not efficient).
Is there some way around this?
Thanks
-Ray