Hi ,
I am initiating FlexCAN of MPC5746R. As the manual said, I negate CAN_MCR[MDIS] to enable this module as
the first step, but after this step, the program seems to run fly, it enters some kind of interrupt handler IVOR4, as the figure shows below:
It would be highly appreciated if you can provide successful CAN init code for MPC5746R.
Qiao
Hi Martin,
Thanks for your reply. I am debugging using your code. I found at the end of initiation, the FRZACK and NOTRDY bit will turn to 0, but soon return to 1. I add a delay at the end of initiation, then the program can never be out of the circulation : while(1 == CAN_1.MCR.B.FRZACK) {};
It makes me confused.
Hi Qiao,
I tested the CAN init function and the behavior is following:
1) You must not have opened FlexCAN registers in debugger window
2) You must not stepping the code CAN init function. I tried in Lauterbach debugger and when I was stepping the code, it got stuck in last while loop. When I was not stepping the function, it worked correct.
Regards,
Martin
Hi Martin,
Thanks for your patient explanation. I tested again, and didn't open any register or step the function.
To check if the FlexCAN is in normal mode after the initiation, I give the value of NOTRDY bit to a GPIO, but the output of GPIO is still 5V.
It seems that after the Init function, the FlexCAN goes back to freeze mode again, so it still can not work correct.
Regards
Qiao
Hi Qiao,
I tested the code I sent you once again and the behavior was the same as you described (I do not know why, because I had tested it many times before and it worked correct). So I copy the code to IDE once again, build it and load to microcontroller once again and now it works correct. I tried with Lauterbach and also with Multilink Universal FX debug probe. Also there was no problem when I was stepping the code (really strange).
The only difference I found were two breakpoints place in the code.
Please see attachment, there is the example which I tried last and which worked correct.
Regards,
Martin
Hi Martin,
Now this project can work correct. I guess maybe it's the difference of the IDE? I can not even create a project named Z4_2 like the one you give me . Which version of S32 Studio are you using? Any update package need to be installed? I am using S32 Design Studio for Power v1.1 .
Really appreciate for your help!
Regards,
Qiao
Hi,
it was older project and it was created in S32DS version 1.0, but it does not explain the behavior on my side (but it is good that it works now ;-)).
For S32DS version 1.1, there is an update 1 you can install.
https://community.nxp.com/docs/DOC-333045
You are welcome.
Regards,
Martin
Hi Martin,
Finally I found the difference, in the debugger configuration of your project, the device name is MPC5745R :
I changed the device name to MPC5745R in my project, it can also work correct. Maybe it's a bug of the compiler?
Regards,
Qiao
Hi,
I think the is not the root cause, because I used Lauterbach debugger and it is independent to S32 Design Studio. Important point is that it works now. Thanks for the cooperation.
Regards,
Martin
Hi Martin,
Really sorry to bother you again. Now the problem is that although the FlexCAN is initiated successfully, I can't transmit a message. I tried self reception mode and normal mode, after I write 0xC to the CS.CODE to activate the MB, it didn't complete a transmission. The MB code is always 0xC,according to the manual it should returns to the INACTIVE state automatically . Here is my transmission code :
void Transmit_Message()
{
CAN_0.MB[6].CS.B.CODE = 0x8; //MB TX inactive
CAN_0.MB[6].CS.B.IDE = 0; //extended bit disable
CAN_0.MB[6].ID.R = (0x555<<18); //set message STD ID
CAN_0.MB[6].DATA.W[1] = 0x90ABCDEF; //data1 set
CAN_0.MB[6].DATA.W[0] = 0x12345678; //data0 set
CAN_0.MB[6].CS.B.DLC = 8; //message length 8 bytes
CAN_0.MB[6].CS.B.RTR = 0; //remote frame disable
CAN_0.MB[6].CS.B.CODE = 0xC; //MB once transmit data
}
Regards,
Qiao
Hi,
could you please share your SIUL2 settings? It is possible, you have incorrectly configured GPIO pins.
Do you use NXP EVB, or your own design board? Have you correctly connected CAN transceiver?
Regards,
Martin
Hi Martin,
I am using MCAN2 of MPC57xx EVB .Here is my SIUL2 code:
void Port_Init(void){
SIUL2.MSCR0_255[92].R = 0x32000008; /* Pad PF12: Source signal is CAN0_TX */
SIUL2.MSCR0_255[93].R = 0x00380000; /* Pad PF13: Enable pad for input - CAN0_RX */
SIUL2.MSCR512_995[700].R = 0x00000004;/* CAN0_RX: connected to pad PF13 */
}
The schematic of MSCAN2 is as follows, I have connected J32, J33,J23
Hi,
I found one error in your configuration.
Instead of SIUL2.MSCR512_995[700].R, you have to use SIUL2.MSCR512_995[188].R, because definition in header file is following:
#define SIUL2_MSCR700 SIUL2.MSCR512_995[188].R
Regards,
Martin
Hi Martin,
I have corrected the SIUL2 error. Now FlexCAN transmits a message successfully , then it returns to freeze mode. Here is the Error Status Register I read from S32:
The attachment is my CAN code. Do you have any sample code of MPC5746R FlexCAN including sending and receiving message? It would be very helpful to speed up my work.
Regards,
Qiao
Hi Qiao,
I had the same problem. I believe it may have to do with using the FlexCAN while in debug mode. Adding the following code allowed RX function to work for me:
CAN_0.CTRL2.B.ECRWRE = 0x01u; //enable MECR register updates
CAN_0.MECR.B.ECRWRDIS = 0x00u; //enable writes to the MECR register
CAN_0.MECR.B.NCEFAFRZ = 0x00u; //keep normal operation if memory error is detected
CAN_0.MECR.B.ECRWRDIS = 0x01u; //disable writes to the MECR register
Shane