MM9Z1_638 SCI Half-Duplex mode, RDRF not set

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MM9Z1_638 SCI Half-Duplex mode, RDRF not set

Jump to solution
1,553 Views
joek
Contributor I

Hello,

 

The MM9Z1_638 has an S12Z processor and S08SCIV4 SCI module.  I want to use the SCI in one-wire, half duplex mode.  The physical pin I am using is the LIN pin.  So, I have set both LIN_TX.FROMSCI and LIN_RX.TOSCI.  I have a terminal application running on my PC and a USB-LIN adapter connected (19,200 baud, N, 8, 1).

 

I can send data from the processor to the terminal with no problems.  But, I cannot receive any data.  RDRF is never set.  I do see RXEDGIF set when I send a character.  This implies the signal is making it to the SCI module.  I have checked the baud rate settings and confirmed that a sent character (e.g. 'U') has exactly the same scope waveform on the LIN pin as a received character.  So I think the baud rate setting is OK.  I did find a bug in the MM9Z1_638 example code in this area, but fixed it (baud rate was off by 2.5%).

 

All SCI interrupts are disabled.  I want it to work via polling first, then I will implement the interrupts.  I believe I should be able to send a character from the terminal to the LIN pin and see RDRF set.

 

I think I need to have LOOPS=1 and RSRC=1 for one-wire mode.  In the process of debugging, I cleared RSRC=0 to see what would happen.  It turns out that in this mode (internal loopback) when I send a character by writing to SCID, the receiver sets RDRF.  Great!  But as soon as I set RSRC=1, RDRF never sets.

 

Here is the SCI initialization code:

 

void SCIInit(void)  {

     B_SCIBD = (u16)(25ul*1000000ul/SCI_BAUD/16ul);

     B_SCIC1 = B_SCIC1_DPD1_MASK | B_SCIC1_DPD0_MASK | B_SCIC1_LOOPS_MASK | B_SCIC1_RSRC_MASK;

     B_SCIC2 = B_SCIC2_TE_MASK|B_SCIC2_RE_MASK;  // enable rx and tx

     B_SCIC3 = 0x00;

}

 

And here is the receive function I call repeatedly from the main loop:

 

char SCIRec(void) {

     if (B_SCIS1_RDRF) {

          return B_SCID;

     }

     else {

          return 0x00;

       }

}

 

I send characters from the terminal to the LIN pin and the debugger will never break on "return B_SCID;", but if I halt execution I can see RXEDGIF has been set.  If I modify the above code to clear RSRC (internal loopback mode) and send a character by writing to SCID, then the debugger will break on the "return B_SCID;" line.

 

Thank you for your help!

Labels (1)
0 Kudos
Reply
1 Solution
1,403 Views
joek
Contributor I

The problem has been resolved.  I was mistaken to set LOOPS=1 and RSRC=1.  This should only be done when using SCI one-wire mode on a GPIO pin.

The LIN PHY connects tx and rx internally, so LOOPS and RSRC should both be 0.  If the receiver is enabled it will see every byte transmitted.

View solution in original post

0 Kudos
Reply
1 Reply
1,404 Views
joek
Contributor I

The problem has been resolved.  I was mistaken to set LOOPS=1 and RSRC=1.  This should only be done when using SCI one-wire mode on a GPIO pin.

The LIN PHY connects tx and rx internally, so LOOPS and RSRC should both be 0.  If the receiver is enabled it will see every byte transmitted.

0 Kudos
Reply