I don't see in your code what could cause SCI receive interrupt to be not triggered. But since you write "seems", I want to ask what debugging tools are you using? With decent debugger It should be as simple as a brick to detect is your ISR routine called or not.
The very serious problem in your code is call from ISR to routine that wastes CPU power in software delay loop. You should never loop in any interrupt routine. In case of SCI interrupt, you should loose data coming to RX pin.
Don't use any magic numbers in your code.
SCI0CR2 = 0x2C;
^^^ What do these bits mean? Do you really know what are these without looking into datasheet? Isn't this better to:
SCI0CR2 = SCI0CR2_RIE_MASK | SCI0CR2_TE_MASK | SCI0CR2_RE_MASK;
Or even better, especially in the case you may need to change setup in the future easily, without looking into datasheet. Just replace 0->1 or 1->0 to set or clear bit. Compiler generated code will be the same like SCI0CR2= 0x2C;
SCI0CR2 = SCI0CR2_TIE_MASK * 0 // comments
| SCI0CR2_TCIE_MASK * 0 //
| SCI0CR2_RIE_MASK * 1
| SCI0CR2_ILIE_MASK * 0
| SCI0CR2_TE_MASK * 1
| SCI0CR2_RE_MASK * 1
| SCI0CR2_RWU_MASK * 0
| SCI0CR2_SBK_MASK * 0
;
void interrupt 20 SCI_ISR (void){
^^ probably you didn't know that CW headers contain all defines for interrupt vector addresses and interrupt vector numbers. I recommend replacing 20 here with VectorNumber_Vsci0.