Why does CAN_C module on MPC5634M send the unknown ID?

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

Why does CAN_C module on MPC5634M send the unknown ID?

903 Views
小兜麦
Contributor II

      I write the program to make the CAN_C to sent a CAN frame with the specific ID.But,after that,I find I receive the two ID.One is the true ID,but another ID is not my ID.I don't know how it appear?Where is the unknown ID from?Can you help me answer the question? 

     Thank you!

Labels (1)
0 Kudos
3 Replies

716 Views
PetrS
NXP TechSupport
NXP TechSupport

Hi,

Did you properly initialize all enabled message buffers?

Can you share your code?

 

Do you use NXP board? If yes, which one?

BR, Petr

0 Kudos

716 Views
小兜麦
Contributor II

Hi,this is my initialized code for CAN_C:(Can you give me the code for CAN_C of MPC5634m ?) void MPC5634M_CAN_Init(uint8_t channel,uint32_t baudrateKHz)

{

//*************************变量的定义*****************************************

uint8_t i; //for循环用

uint8_t selfloop;

uint8_t idMask;

CAN_MemMapPtr CANbaseAdd; //CAN通道基地址

selfloop=0;

idMask=0;

//*************************通道的选取******************************************

//CANChannel=0为CAN_A通道,当CANChannel=1时为CAN_C通道

if(channel==0)

{

CANbaseAdd=CAN_A;//A通道

//CAN_A通道的复用引脚功能

SIU.PCR[83].R = 0x062C; // MPC555x: Configure pad as CNTXA, open drain

SIU.PCR[84].R = 0x0500; // MPC555x: Configure pad as CNRXA

}

else if(channel==1)

{

CANbaseAdd=CAN_C;//C通道

//CAN_C通道的复用引脚功能

SIU.PCR[87].R = 0x0E2C; // MPC555x: Configure pad as CNTXC, open drain

SIU.PCR[88].R = 0x0D00; // MPC555x: Configure pad as CNRXC

}

//*****************************MCR寄存器的设置********************************

(*CANbaseAdd).MCR.R = 0x5002003F; //Put in Freeze Mode & enable all 64 message buffers

//*************************波特率的设置*****************************************

//时钟源的选择

(*CANbaseAdd).CR.B.CLKSRC=0;// 1表示外部时钟(8MHz),0表示内部时钟

//波特率的计算

//采用的是外部时钟,即晶振。8MHz。baudrate=8MHz/(PRESDIV1)/(1PROP_SEGPSEG12PSEG21)

//采用switch结构

switch(baudrateKHz)

{

case(125):

(*CANbaseAdd).CR.R|=(0|CAN_CTRL1_PROPSEG(2)

|CAN_CTRL1_RJW(3)

|CAN_CTRL1_PSEG1(1)

|CAN_CTRL1_PSEG2(1)

|CAN_CTRL1_PRESDIV(7));

break;

case(250):

(*CANbaseAdd).CR.R|=(0|CAN_CTRL1_PROPSEG(2)

|CAN_CTRL1_RJW(3)

|CAN_CTRL1_PSEG1(1)

|CAN_CTRL1_PSEG2(1)

|CAN_CTRL1_PRESDIV(3));

break;

case(500):

(*CANbaseAdd).CR.R|=(0|CAN_CTRL1_PROPSEG(2)

|CAN_CTRL1_RJW(3)

|CAN_CTRL1_PSEG1(1)

|CAN_CTRL1_PSEG2(1)

|CAN_CTRL1_PRESDIV(1));

break;

}

//**************************模式选择**********************************

//selfloop=1时,则CAN使用回环模式,即自发自收;当selfloop=0时,则是非回环模式

if(selfloop==1)

(*CANbaseAdd).CR.R|=CAN_CTRL1_LPB_MASK;

//**************************是否掩码的选择*****************************

//当idmask=1时,则启用掩码机制,只接受特定的ID CAN帧,当idmask=0时,则不启用掩码机制,可以接受任何CAN帧

if(idMask==1)

{

(*CANbaseAdd).RXGMASK.R=0x1FFFFFFF;

(*CANbaseAdd).RX14MASK.R=0x1FFFFFFF;

(*CANbaseAdd).RX15MASK.R=0x1FFFFFFF;

}

else

{

(*CANbaseAdd).RXGMASK.R=0x0;

(*CANbaseAdd).RX14MASK.R=0x0;

(*CANbaseAdd).RX15MASK.R=0x0;

}

//*************************Inactivate all message buffers**************************

for(i=0;i<64;i++)

{

(*CANbaseAdd).BUF[i].CS.B.CODE = 0;

}

//*************************配置完后退出冻结模式,并判断CAN是否准备好***************

//只有在冻结模式下才能配置,配置完退出冻结模式

(*CANbaseAdd).MCR.R&=~(CAN_MCR_HALT_MASK);

//等待直到退出冻结模式

while(((*CANbaseAdd).MCR.R & CAN_MCR_FRZACK_MASK))

{

}

//等到不在冻结模式,休眠模式或者停止模式

while(((*CANbaseAdd).MCR.R & CAN_MCR_NOTRDY_MASK))

{

}

}//CANInit end

0 Kudos

716 Views
PetrS
NXP TechSupport
NXP TechSupport

Your CAN bit timing setting is not completely correct, use https://community.nxp.com/docs/DOC-330446 to calculate proper one.

The example is part of AN2865 (http://cache.freescale.com/files/32bit/doc/app_note/AN2865.pdf) and available within its SW package (AN2865SW). The same one is also part of CW2.x installation.

BR, Petr

0 Kudos