Hi,
I have a question about receiving the LIN msg on the MPC5748g. The example given in the S32DS is operating in the master mode. The other example I found was implemented in UART MODE(MPC5748G-LINFlex-LIN-Master-Slave-test-GHS614).
When I want to receive LIN frame in slave mode, I encountered some problems.
According to the reference manual, I set the mpc5748 as slave node, init the pin, baud rate, direction, CCS, etc, and then wait for the message from the master node. After I send the message from PLIN(as a master node) to MPC5748G, I can clearly see the waveform from the oscilloscope, but the HRF doesn't change a bit, and RMB doesn't change either. Did I miss anything?
Really needs your help! Thanks
Here is my code:
void receiveLIN1frame (void) { /* Request data from ID 0x15 */
uint8_t __attribute__ ((unused)) RxBuffer[8] = {0};
uint8_t i;
MPC_LINFlexD_3.LINCR1.B.SLEEP = 0; /* Put LINFlex hardware in init mode */
MPC_LINFlexD_3.LINCR1.B.INIT = 1; /* Put LINFlex hardware in init mode */
MPC_LINFlexD_3.LINCR1.B.MME = 0; /* LIN master */
MPC_LINFlexD_3.LINCR1.B.MBL = 0b0001; /* master break length */
MPC_LINFlexD_3.LINIBRR.B.IBR= 260; /* Mantissa baud rate divider component */
MPC_LINFlexD_3.LINFBRR.B.FBR = 0; /* Fraction baud rate divider component */
MPC_LINFlexD_3.LINCR1.B.INIT = 0; /* Put LINFlex hardware in init mode */MPC_LINFlexD_3.BIDR.B.DIR = 0; /*REIEVES DATA*/
MPC_LINFlexD_3.BIDR.B.CCS = 0;/*ENHANCED CCS*/
MPC_LINFlexD_3.BIDR.B.DFL = 0b111; /*length = 8 */
while(!MPC_LINFlexD_3.LINSR.B.HRF); /* Wait 4 header recieve flag*/
while(!MPC_LINFlexD_3.LINSR.B.RMB); /* Wait 4 realse mem buf*/
/* Code waits here if no slave response */
for (i=0; i<4;i++){ /* If received less than or equal 4 data bytes */
RxBuffer[i]= (MPC_LINFlexD_3.BDRL.R>>(i*8)); /* Fill buffer in reverse order */
}
for (i=4; i<8;i++){ /* If received more than 4 data bytes: */
RxBuffer[i]= (MPC_LINFlexD_3.BDRM.R>>((i-4)*8)); /* Fill rest in reverse order */
}
MPC_LINFlexD_3.LINSR.R = 0x00000004; /* Clear DRF flag */
MPC_LINFlexD_3.LINSR.B.RMB = 0; /**/
printf("reset of rmb bit\r\n");
}
Solved! Go to Solution.
Hi,
only LINFlexD_0 supports Slave mode
BR, Petr
Thanks for your reply!
But I still have a question, is it possible to use LINFlexD2~17 as the master node and receive the lin frames from the other master nodes? Since they can receive the frames from slave nodes that contain only data without a header, is there a solution to extract the data from frames(wither header) from other master nodes?
besides, I changed my codes above and it can work on LINFlexD1:
MPC_LINFlexD_0.LINCR1.B.SLEEP = 0; /* Put LINFlex hardware in init mode */
MPC_LINFlexD_0.LINCR1.B.INIT = 1; /* Put LINFlex hardware in init mode */
MPC_LINFlexD_0.LINCR1.B.MME = 0; /* LIN master */
MPC_LINFlexD_0.LINCR1.B.MBL = 0b1110; /* master break length */
MPC_LINFlexD_0.LINIBRR.B.IBR= 130; /* Mantissa baud rate divider component */
/* Baud rate divider = 80 MHz LIN_CLK input / (16*19200 bps) ~=130 */
MPC_LINFlexD_0.LINFBRR.B.FBR = 0; /* Fraction baud rate divider component */
MPC_LINFlexD_0.LINCR1.B.INIT = 0; /* Put LINFlex hardware in init mode */
MPC_LINFlexD_0.BIDR.B.DIR = 0; /*REIEVES DATA*/
MPC_LINFlexD_0.BIDR.B.CCS = 0;/*ENHANCED CCS*/
MPC_LINFlexD_0.BIDR.B.DFL = 0b111; /*length = 8 */
MPC_LINFlexD_0.LINSR.B.HRF = 0;
MPC_LINFlexD_0.LINSR.B.RMB = 0;
while(!time_out){
k = 5000;
while(k){
if(!MPC_LINFlexD_0.LINSR.B.HRF){/* Wait 4 header recieve flag*/
k--;
mpc_delay(1);
}
else
break;
}
if (k == 0){
printf("time out.\r\n");
time_out = 1;
continue;
}
MPC_LINFlexD_0.BIDR.B.DFL = 0b111; /*specify the data field length = 8 */
uint8_t identifier_lin = MPC_LINFlexD_0.BIDR.B.ID; /*read identifier*/
printf("The id of the target is %d. \r\n",identifier_lin);
while(!MPC_LINFlexD_0.LINSR.B.RMB); /* Wait 4 realse mem buf*/
for (i=0; i<4;i++){ /* If received less than or equal 4 data bytes */
RxBuffer[i]= (MPC_LINFlexD_0.BDRL.R>>(i*8)); /* Fill buffer in reverse order */
}
for (i=4; i<8;i++){ /* If received more than 4 data bytes: */
RxBuffer[i]= (MPC_LINFlexD_0.BDRM.R>>((i-4)*8)); /* Fill rest in reverse order */
}
printf("Recieved data: %x %x %x %x %x %x %x %x \r\n",RxBuffer[0],RxBuffer[1],RxBuffer[2],RxBuffer[3],RxBuffer[4],RxBuffer[5],RxBuffer[6],RxBuffer[7]);
MPC_LINFlexD_0.LINSR.R = 0x00000004; /* Clear DRF flag */
MPC_LINFlexD_0.LINSR.B.HRF = 0; /*SW reset of two HRF AND RMB*/
MPC_LINFlexD_0.LINSR.B.RMB = 0;
}
Thx again