FlexCan strange behaviour

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

FlexCan strange behaviour

2,445 次查看
Simone
Contributor II
Hello!
I'm working on a FlexCan application on the MCF52235. Everything works well, until I have at least two devices connected on the bus. Today I discovered that there is a problem when I left the board with the micro unconnected. The program stucks at this instruction:
Code:
while( (MCF_CAN_ERRSTAT & MCF_CAN_ERRSTAT_IDLE)==0 );

 

 

The complete code for sending routine is the following:
Code:
void CANSendData(int i, int ID, int length, int *data, int ide ){ //Attendi che il bus sia idlewhile( (MCF_CAN_ERRSTAT & MCF_CAN_ERRSTAT_IDLE)==0 );MCF_CAN_MBUF_CODE(i) = MCF_CAN_TX_INACTIVE; //MBi is inactive while( (MCF_CAN_ERRSTAT &    (MCF_CAN_ERRSTAT_TXRX + MCF_CAN_ERRSTAT_IDLE))       == MCF_CAN_ERRSTAT_TXRX);    // Configure IDMCF_CAN_MBUF_ID(i) = ID;  // Copy Tx data bytes to the message bufferCANLoadBufferData(i, length, data);      if(ide){ MCF_CAN_MBUF_CTRL(i) = 0x40 + 0x20 + length; }else { MCF_CAN_MBUF_CTRL(i) = length; }MCF_CAN_MBUF_CODE(i) = MCF_CAN_TX_TRONCE;}

 I thought that the bus never goes "idle" if the micro is not connected; so I removed the two while loop, and the program started to work correctly even when unconnected (or at least, doesn't stuck in the loop).
 
I'm still quite uncertain about the usefulness of these while loops...but I was adviced to put them in the code to be sure that the buffer was deactivated.
Does anybody  find a similar problem?
 
Simone

 

标签 (1)
0 项奖励
回复
2 回复数

882 次查看
Nouchi
Senior Contributor II
hello,

You should have a look to RXECTR and ERRSTAT registers, maybe the FLEXCAN is in bus off state, because if the cpu core is halted, messages buffers aren't serviced anymore.


Emmanuel,
0 项奖励
回复

882 次查看
Simone
Contributor II
Hello Emmanuel!
I think that FlexCan is in bus-off state when disconnected; infact when I reconnect it again it exits the loops and works.
The problem is that the cpu remains stuck in the while loop (waiting for the bus to go idle), preventing the rest of the program to run when the board is disconnected from the can bus. I tried removing the loops, and it still seems to work, but I'm afraid that there will be strange behaviours in future (maybe with more device connected on the bus, trying to send two or more message at the same time).
If I remove the loops, the only problem is that I can lost messages, or there is something else?
 
Simone
0 项奖励
回复