本工程配置CAN 为回环模式。
编程指南
1. can 基本模式配置;
2. can 筛选器配置;
3. 发送数据结构体配置并发送;
4. 接收数据结构体配置并接收;
若采用中断进行数据读取,则加入中断配置,并在中断中进行数据接收即可。
bsp_can.h
/**
******************************************************************************
* @file bsp_can.h
* @author Waao
* @version V1.0.0
* @date 21-Feb-2019
* @brief This file contains some board support package's definition for the can.
*
******************************************************************************
* @attention
*
* None
*
******************************************************************************
*/
#ifndef __BSP_CAN_H_
#define __BSP_CAN_H_
#include <stm32f4xx_can.h>
#include extern u8 TransmitMailbox; extern CanRxMsg CAN_ReceiveInitStructure; #define USE_CAN1 /* If you want to use CAN2, just need to cancel the annotation of the CAN2 */ //#define USE_CAN2 #ifdef USE_CAN1 //=========================== #define Specified_CAN CAN1 #define CAN_CLK RCC_APB1Periph_CAN1 #define CAN_CLK_Open RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE) //=========================== #else /* CAN2 */ //=========================== #define Specified_CAN CAN2 #define CAN_CLK RCC_APB1Periph_CAN2 #define CAN_CLK_Open RCC_APB1PeriphClockCmd(CAN_CLK | RCC_APB1Periph_CAN1, ENABLE) //=========================== #endif void CAN_Config(void); #endif bsp_can.c /** ****************************************************************************** * @file bsp_can.c * @author Waao * @version V1.0.0 * @date 21-Feb-2019 * @brief This file contains some board support package's functions for the CAN. * ****************************************************************************** * @attention * * None * ****************************************************************************** */ #include u8 TransmitMailbox = 0; CanRxMsg CAN_ReceiveInitStructure; /** * @brief Initialize the can base configuring. * @param None * @retval None */ void CAN_BaseConfig(void) { CAN_InitTypeDef CAN_InitStructure; CAN_CLK_Open; CAN_DeInit(Specified_CAN); CAN_InitStructure.CAN_Prescaler = 16; CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_Init(Specified_CAN, &CAN_InitStructure); } /** * @brief Initialize the can filter. * @param None * @retval None */ void CAN_FilterConfig(void) { CAN_FilterInitTypeDef CAN_FilterInitStructure; #ifdef USE_CAN1 CAN_FilterInitStructure.CAN_FilterNumber = 0; #else CAN_FilterInitStructure.CAN_FilterNumber = 14; #endif CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); } /** * @brief Initialize the can Transmitter. * @param None * @retval None */ void CAN_TransmitConfig(void) { CanTxMsg CAN_TransmitInitStructure; CAN_TransmitInitStructure.StdId = 0x11; CAN_TransmitInitStructure.IDE = CAN_Id_Standard; CAN_TransmitInitStructure.RTR = CAN_RTR_Data; CAN_TransmitInitStructure.DLC = 2; CAN_TransmitInitStructure.Data[0] = 0xCA; CAN_TransmitInitStructure.Data[1] = 0xFE; TransmitMailbox = CAN_Transmit(Specified_CAN, &CAN_TransmitInitStructure); } /** * @brief Initialize the can Receiver. * @param None * @retval None */ void CAN_ReceiveConfig(void) { CAN_ReceiveInitStructure.StdId = 0x00; CAN_ReceiveInitStructure.IDE = CAN_Id_Standard; CAN_ReceiveInitStructure.DLC = 0; CAN_ReceiveInitStructure.Data[0] = 0x00; CAN_ReceiveInitStructure.Data[1] = 0x00; CAN_Receive(Specified_CAN, CAN_FIFO0, &CAN_ReceiveInitStructure); } /** * @brief Initialize the can. * @param None * @retval None */ void CAN_Config(void) { CAN_BaseConfig(); CAN_FilterConfig(); CAN_TransmitConfig(); CAN_ReceiveConfig(); } main.c /** ****************************************************************************** * @file main.c * @author Waao * @version V1.0.0 * @date 21-Feb-2019 * @brief MAIN. * ****************************************************************************** * @attention * * None * ****************************************************************************** */ #include #include typedef enum { FAILED = 0, PASSED = !FAILED }TestStatus; int main(void) { u32 uwCounter = 0; Printf_Init(); CAN_Config(); uwCounter = 0; while((CAN_TransmitStatus(Specified_CAN, TransmitMailbox) != CAN_TxStatus_Ok) && (uwCounter != 0xFFFF)) { uwCounter++; } uwCounter = 0; while((CAN_MessagePending(Specified_CAN, CAN_FIFO0) < 0) && (uwCounter != 0xFFFF)) { uwCounter++; } if (CAN_ReceiveInitStructure.StdId != 0x11) { printf("nERROR 1"); return FAILED; } if (CAN_ReceiveInitStructure.IDE != CAN_Id_Standard) { printf("nERROR 2"); return FAILED; } if(CAN_ReceiveInitStructure.DLC != 2) { printf("nERROR 3"); return FAILED; } if (((CAN_ReceiveInitStructure.Data[0] << 8) | CAN_ReceiveInitStructure.Data[1]) != 0xCAFE) { printf("nERROR 4"); return FAILED; } printf("nSUCCESSFUL!"); return PASSED; }
上一篇:STM32F429 >> 20. CAN 通讯(一)
下一篇:STM32 的中断配置很烦人怎么办?
推荐阅读
史海拾趣



ASM10DTBD-S664






京公网安备 11010802033920号