历史上的今天

今天是:2024年08月29日(星期四)

正在发生

2019年08月29日 | STM32F429 >> 20. CAN 通讯(Code)

发布者:开元轩 来源: eefocus关键字:STM32F429  CAN  通讯  回环模式 手机看文章 扫描二维码
随时随地手机看文章

本工程配置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  CAN  通讯  回环模式 引用地址:STM32F429 >> 20. CAN 通讯(Code)

上一篇:STM32F429 >> 20. CAN 通讯(一)
下一篇:STM32 的中断配置很烦人怎么办?

推荐阅读

据外媒报道,谷歌无人驾驶汽车姊妹公司Waymo正在美国亚利桑那州推出试点项目,但多位匿名消息人士向媒体爆料称,该公司改装的无人驾驶汽车——克莱斯勒Pacificas在执行基本驾驶和道路导航功能方面麻烦不断。这些消息人士非常了解Waymo在试点项目中遇到的问题,并发现该公司项目在开发阶段依然存在技术问题。有时,这些测试车辆甚至不了解基本的道路功能,...
根据税委会公告,申请主体为申请排除商品的利益相关方,包括从事相关商品进口、生产或使用的在华企业或其行业协(商)会。税委会根据我国利益相关方的申请,将部分符合条件的商品排除出对美加征关税范围,采取暂不加征关税、具备退还税款条件的退还已加征关税税款等排除措施。据悉,前两批可申请排除商品范围,为中方已公布实施且未停止或未暂停加征关税的...
8月27日,2020集微半导体峰会在厦门海沧举行。作为一年一度的行业盛会,本届峰会以“探寻·迭变时代新逻辑”为主题,旨在外部世界风云突变的市场环境下,探寻市场新的商业逻辑。28日下午,在同期举办以“中国半导体投资还能火多久?”为主题的投融资专场论坛上,云岫资本董事总经理赵占祥带来《2020中国半导体投资解读》的演讲,分享了中国半导体产业链近年...
据外媒 SamMobile 消息,三星 Galaxy S21 Ultra 5G 手机的一条跑分信息出现在 Geekbench 5 网站,值得注意的是,手机运行的是 Android 12 系统。目前三星最新的 One UI 4.0 系统基于 Android 11 内核,而三星也没有 Android 12 预览版放出。  这款手机搭载高通骁龙 888 SoC,12GB 内存,单核成绩 1122 分,多核成...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved