Hmmm... Is it possible you are reading SCI1D (and the status register) somewhere else, or that some other code is also using the uart?
What I'd suggest is to step thru with the debugger and see the instant SCI1S1_TC becomes true what the values of the chip registers are.
You an do this by just using the memory window and setting its address to 0xFFFF803C *after* you see TC become true (meaning the byte has fully hit the wire). Then, you should see a value of 0xf0.
I use the following initialization code:
SCI1C1 = (loopback?SCI1C1_LOOPS_MASK:0)|
((data==8&&parity!=2)?SCI1C1_M_MASK:0)|
((parity!=2)?SCI1C1_PE_MASK:0)|
(parity==1?SCI1C1_PT_MASK:0);
divisor = fsys_frequency/baud/32;
if (divisor >= 0x2000) {
divisor = 0x1fff;
}
SCI1BDH = (uint8)(divisor/0x100);
SCI1BDL = (uint8)(divisor%0x100);
I believe it is equivalent to yours.
If I configure for loopback and then wait for a byte to transmit in the debugger, I immediately see the following values:
SCI1SC = 0xf0
SCI1D = byte I just sent
You'll also want to make sure you don't have an ISR sneaking in on you and reading the data -- it might be best to run your test with interrupts disabled.
-- Rich
PS I'm running on a DEMOJM board, and I hope that does not matter!