历史上的今天
今天是:2024年08月29日(星期四)
2019年08月29日 | STM32F429 >> 20. CAN 通讯(Code)
2019-08-29 来源:eefocus
本工程配置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 #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; }
史海拾趣
|
关键字:彩转黑摄像机 近年来,随着芯片技术的更新换代,彩转黑摄像机的整体性能有了很大的提高,“高感度,低照度”是各大厂家力推的产品特色,可以说是对弱光环境的一次集体的叫板。 对于安防监控来说,对图像品质 ...… 查看全部问答> |
|
在做2.4G射频识别时,发现有源射频识别系统的角度很难控制,尤其当标签距离识别设备小于10米时,角度基本上都是360。 在网上看到有些高人说,射频角度可以控制在15°...有谁有这方面的经验没有?如何有效控制有源射频的识别角度。 我的想法是这样 ...… 查看全部问答> |
|
向大家请教个问题:默认情况下,4G的内存,核心内存和用户态内存分别是2G,现在我写了一个驱动,需要更多的核心内存,因此想把核心内存调整的大些,应该如何做到呢? 另外,我还有个机器是8G内存,跑wxp64位系统,也想调整核心内存更 ...… 查看全部问答> |
|
将手机和PC机用USB相连: 当先将未开机的手机用USB线连到PC上,再打开手机时,从PC上向手机发送AT指令,手机能向PC返回OK;可是当先将手机开机,再将手机用USB线连接到PC机时,从PC上向手机发送AT指令,手机却不能向PC返回任何东西。不知以上是什么 ...… 查看全部问答> |
|
请问ioctl返回的地址是虚拟地址还是物理地址? 小弟在做dm6446上的resize,用ioctl返回的resize驱动中申请的buffer的地址是在用户空间是不能用的? 大家指教。 ioctl返回的地址问题?初学者,高人指点。… 查看全部问答> |
|
data verification failed at address 0x0 ? 本帖最后由 dontium 于 2015-1-23 12:45 编辑 仿真器连接正常,我用了光盘里的一个例子,编译好后下载.out程序时出现 data verification failed at address 0x0, please verify target memoty and memory map 以上错误,请问这是什么原因,我用的 ...… 查看全部问答> |




