I would like to build CAN (Controller Area Network) analyzer for monitoring CAN bus on vehicles (not for diagnostics, just to see simple message frames with identifiers, etc.). This is my code but I cant receive any frame in my Terminal usart, does anyone have any experience? I really appreciate it because of about 7 days stuck in and Im using (STM-P103 BOARDS) :) :) :) :) ;) ;) ;
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "USART.h"
#include "CAN.h"
#include <stdio.h>
unsigned int val_Tx = 0, val_Rx = 0; /* Globals used for display */
void Delay (uint32_t Time);
/*----------------------------------------------------------------------------
fputc
*----------------------------------------------------------------------------*/
int fputc(int ch, FILE *f) {
return (USART2_SendChar(ch));
}
/*----------------------------------------------------------------------------
initialize CAN interface
*----------------------------------------------------------------------------*/
void can_Init (void) {
CAN_setup (); /* setup CAN Controller */
CAN_wrFilter (33, STANDARD_FORMAT); /* Enable reception of msgs */
/* ! COMMENT LINE BELOW TO ENABLE DEVICE TO PARTICIPATE IN CAN NETWORK ! */
CAN_testmode(CAN_BTR_SILM | CAN_BTR_LBKM); // Loopback, Silent Mode (self-test)
CAN_start (); /* start CAN Controller */
CAN_waitReady (); /* wait til tx mbx is empty */
}
//*****************************************************************************
int main(void)
{
int i;
char str[50];
SystemInit();
USART2_Init();
USART2_SendString("\n\r-----------------------");
USART2_SendString("\n\r");
USART2_SendString("\n\r");
USART2_SendString("\n\r");
USART2_SendString("\n\r");
can_Init (); /* initialize CAN interface */
CAN_TxMsg.id = 33; /* initialize msg to send */
for (i = 0; i < 8; i++) CAN_TxMsg.data =0;
CAN_TxMsg.len = 1;
CAN_TxMsg.format = STANDARD_FORMAT;
CAN_TxMsg.type = DATA_FRAME;
while (1) {
if (CAN_TxRdy) { /* tx msg on CAN Ctrl */
CAN_TxRdy = 0;
CAN_TxMsg.data[0] = val_Tx++; /* data[0] = ADC value */
CAN_wrMsg (&CAN_TxMsg); /* transmit message */
USART2_SendString("\r\nTransfer ");
sprintf(str,"%i ", CAN_TxMsg.data[0]);
USART2_SendString(str);
}
Delay (100); /* delay for 10ms */
// 0 Receive 11:49:09:845 Data frame Standard frame 00000130 5 05 f0 fc ff ff
// format; // 0 - STANDARD, 1- EXTENDED IDENTIFIER
//type; // 0 - DATA FRAME, 1 - REMOTE FRAME
if (CAN_RxRdy) { /* rx msg on CAN Ctrl */
USART2_SendString("\r\nReceive ");
if(CAN_RxMsg.type == 0)
{
USART2_SendString("DATA FRAME ");
}
else
{
USART2_SendString("REMOTE FRAME ");
}
if(CAN_RxMsg.format == 0)
{
USART2_SendString("STANDARD ");
}
else
{
USART2_SendString("EXTENDED IDENTIFIER ");
}
sprintf(str,"%x ", CAN_RxMsg.id);
USART2_SendString(str);
sprintf(str,"%x ", CAN_RxMsg.len);
USART2_SendString(str);
for (i=0;i<CAN_RxMsg.len ;i++)
{
sprintf(str,"%x ", CAN_RxMsg.data);
USART2_SendString(str);
}
CAN_RxRdy = 0;
}
}
}
//---------------------------------------------------------------------------------------------//
Hi Kevin,
I must admit that I'm not familiar with this environment, but I guess that if you want to see any real messages you should not put the CANbus in testmode. In this case nothing happens on the bus, only internally the Tx message is received by the Rx. Furtheron you have set the filter to ID 33, which means that only the message with ID 33 is received. To be active on the bus, you should also set the right bitrate. To see messages you don't need to send any message.
Kees
Hi, kees
Thank you so much, Its really helpful but I'm new with STM32F103 do you know any example of the Vehicle CAN bus monitoring ?
Thanks alot
Unfortunally I don't have any experience with the STM32 environment. But if you look into the source of the CAN library it should be possible to do the steps I described in my earlier response.
- In setup set a bitrate and maybe some other parameters
- No filtering and no testmode
- Start the CANbus
- No Tx if you only want to monitor the bus
- Now loop for Rx messages
Hope this helps
Kees
Dear friend,
Thank you very much :) :) :)