STM32-20 MEGA2560 MCP2515 & STM32 CANBus通讯

前几篇有关于CANBus的文章都是利用环回模式去做测试~这一篇会透过Arduino+MCP2515与STM32完成CANBus通讯~


接线

MEGA2560 & MCP2515MEGA2560MCP2515D52SCKD53CSD50MISOD51MOSI5VVCCGNDGNDMCP2515 & STM32MCP2515STM32 L476RGCAN HPA12CAN LPA11

Arduino

这部分有已经写好的库可以使用,我是使用连结 这个库来完成的

这边要注意MCP2515的Baud Rate设定,这边设定是8MHZ选择125k bit/s

#include <SPI.h>#include <mcp2515.h>struct can_frame canMsg;struct can_frame canMsg1;MCP2515 mcp2515(53); //CSS
void setup() {  canMsg1.can_id  = 0x1876AC23 | CAN_EFF_FLAG;  canMsg1.can_dlc = 8;  canMsg1.data[0] = 0x05;  canMsg1.data[1] = 0x06;  canMsg1.data[2] = 0x07;  canMsg1.data[3] = 0x08;  canMsg1.data[4] = 0x09;  canMsg1.data[5] = 0x0A;  canMsg1.data[6] = 0x0B;  canMsg1.data[7] = 0x0C;    while (!Serial);  Serial.begin(115200);    mcp2515.reset();  mcp2515.setBitrate(CAN_125KBPS,MCP_8MHZ);  //mcp2515.setLoopbackMode();  mcp2515.setNormalMode();  Serial.println("********MCP2515&STM32_CAN_Test*********");  Serial.println("********Send Message*********");  mcp2515.sendMessage(&canMsg1);  Serial.print(canMsg1.can_id, HEX);   Serial.print(" ");   Serial.print(canMsg1.can_dlc, HEX);   Serial.print(" ");      for (int i = 0; i<canMsg1.can_dlc; i++)    {      Serial.print(canMsg1.data[i],HEX);    Serial.print(" ");  }  Serial.println();  delay(100);}
void loop() {  //mcp2515.sendMessage(&canMsg1);  //delay(100);  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)  {    Serial.print(canMsg.can_id, HEX);     Serial.print(" ");     Serial.print(canMsg.can_dlc, HEX);     Serial.print(" ");        for (int i = 0; i<canMsg.can_dlc; i++)      {  // print the data      Serial.print(canMsg.data[i],HEX);      Serial.print(" ");    }    Serial.println();    delay(100);    mcp2515.sendMessage(&canMsg1);    Serial.print(canMsg1.can_id, HEX);     Serial.print(" ");     Serial.print(canMsg1.can_dlc, HEX);     Serial.print(" ");    for (int i = 0; i<canMsg1.can_dlc; i++)     {  // print the data      Serial.print(canMsg1.data[i],HEX);      Serial.print(" ");    }    Serial.println();    delay(100);  }}

IOC设置

先确认一下系统时钟是多少 后续再设定TQ与Baud Rate时才不会出错~
在这边我系统时钟是16Mhz
http://img2.58codes.com/2024/20146325fz6L0KDRE1.png

接着来看看CAN的设置
PSC的部分设定为16 TQ会等于1000ns
BS1 选择4 BS2选择3 採样点会落在62.5%
最后Baud Rate会等于125k bit/s (这边要与另一端设备相同)

http://img2.58codes.com/2024/20146325zSG3TppZHm.png


全域变数宣告

uint8_t TxBuffer[8] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};uint8_t RxBuffer[8];CAN_TxHeaderTypeDef TxHeader;CAN_RxHeaderTypeDef RxHeader;uint32_t TxMailBox;

接收中断回调函数

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan){HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxBuffer);}

设置Filter模式 这边我选择LIST也就是所有ID必须完全相符才会接收

void ConfigFliter(void){CAN_FilterTypeDef CAN1Filter;CAN1Filter.FilterActivation = CAN_FILTER_ENABLE;CAN1Filter.FilterFIFOAssignment = CAN_RX_FIFO0;CAN1Filter.FilterMode = CAN_FILTERMODE_IDLIST;CAN1Filter.FilterScale = CAN_FILTERSCALE_32BIT;CAN1Filter.FilterBank = 0;CAN1Filter.FilterIdHigh = ((0x1876AC23<<3)>>16) & 0xffff;CAN1Filter.FilterIdLow =((0x1876AC23<<3)& 0xffff) | CAN_ID_EXT;CAN1Filter.SlaveStartFilterBank = 0;HAL_CAN_ConfigFilter(&hcan1, &CAN1Filter);}

main

int main(void){  HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_USART2_UART_Init();  MX_CAN1_Init();  /* USER CODE BEGIN 2 */  ConfigFliter();  HAL_CAN_Start(&hcan1);  HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);  TxHeader.DLC =8;  TxHeader.ExtId = 0x08C53451;  TxHeader.IDE = CAN_ID_EXT;  TxHeader.RTR = CAN_RTR_DATA;  TxHeader.TransmitGlobalTime = DISABLE;  HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxBuffer, &TxMailBox);  /* USER CODE END 2 */  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}

测试结果

这边我先将MCP2515做环回测试确定传送与接收正常后才与STM32对接做测试~

下图为Arduino & MCP2515 LoopBack 测试画面
http://img2.58codes.com/2024/20146325RHWgXVPgET.png
Arduino传送端
http://img2.58codes.com/2024/20146325V2zxlGCZNi.png
STM32所接收到的资料
http://img2.58codes.com/2024/20146325sl0fbpahqL.png

由于我只有一块STM32,所以用MCP2515来当作另一端设备,手边有两块的话可以直接将CANRX与另一端TX相连做测试就可以了~http://img2.58codes.com/2024/emoticon37.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章