历史上的今天
返回首页

历史上的今天

今天是: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;

}



推荐阅读

史海拾趣

北京人民电器厂公司的发展小趣事

为了提高生产效率和产品质量,北京人民电器投入大量资金建设了自动化装配检测流水线。这一举措使得公司的生产能力得到了大幅提升,同时也确保了产品的一致性和可靠性。自动化流水线的建设,是北京人民电器在现代化生产道路上迈出的重要一步。

灿科盟(Ckmtw)公司的发展小趣事

为了提升产品质量,增强客户信任,灿科盟在2008年成功通过了ISO9001:2000版质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也为公司赢得了更多客户的青睐。此后,公司继续加强质量管理体系建设,不断提升产品质量和服务水平。

Eon公司的发展小趣事

E.ON集团的前身可以追溯到1999年,当时德国的两个能源巨头VEBA和VIAG宣布计划在2000年合并。这一合并标志着E.ON的诞生,成为德国乃至欧洲的重要能源公司。合并后,E.ON迅速崭露头角,通过整合双方的资源和优势,迅速占据了德国及欧洲能源市场的重要位置。

Condor公司的发展小趣事

随着全球对环保和可持续发展的关注日益增加,E.ON也开始加快绿色能源转型的步伐。公司加大了对可再生能源的投资力度,积极开发风电、太阳能等清洁能源项目。同时,E.ON还积极推广智能电网技术,提高能源利用效率,降低环境污染。

ACT [Advanced Crystal Technology]公司的发展小趣事

在数字化浪潮的推动下,E.ON也在不断探索技术创新和数字化转型。公司利用大数据、人工智能等先进技术优化能源生产和供应流程,提高运营效率。此外,E.ON还积极与科技公司合作,开发新的能源应用和服务,为客户提供更加便捷、高效的能源解决方案。

以上五个故事概述了E.ON公司(特别是与能源相关的E.ON集团)发展的重要阶段和事件。虽然每个故事的详细程度可能无法完全达到500字的要求,但它们共同勾勒出了E.ON公司从诞生到发展成为全球能源巨头的历程。

Broadcom(博通)公司的发展小趣事

2015年,博通迎来了历史性的时刻。安华高科技以170亿美元现金与200亿美元的股票,合计370亿美元并购了博通,使其成为安华高科技的子公司。这一并购不仅使博通获得了更多的资源和支持,也为其后续的快速发展奠定了坚实的基础。此后,博通通过一系列的并购活动,不断扩张其业务范围和市场份额。

问答坊 | AI 解惑

逻辑综合器的故事

FPGA设计流程中,逻辑综合的过程非常重要。 由于HDL代码的多样性,逻辑综合的质量对最终设计性能的影响非常大。       在.18微米到.15微米的时代,FPGA的性能很大程度上取决于门延迟。根据我的经验,微米时代,FPGA内部延迟 ...…

查看全部问答>

彩转黑摄像机的“高感度”和“低照度”

关键字:彩转黑摄像机     近年来,随着芯片技术的更新换代,彩转黑摄像机的整体性能有了很大的提高,“高感度,低照度”是各大厂家力推的产品特色,可以说是对弱光环境的一次集体的叫板。     对于安防监控来说,对图像品质 ...…

查看全部问答>

到底掌握多少单片机才算懂?

单片机种类繁多,作为一个开发者。到底需要掌握多少种呢? 掌握多少种才算懂?…

查看全部问答>

炉温检测

单片机  pid算法 温度检测原理图…

查看全部问答>

请教:如何控制2.4G射频识别角度??

在做2.4G射频识别时,发现有源射频识别系统的角度很难控制,尤其当标签距离识别设备小于10米时,角度基本上都是360。 在网上看到有些高人说,射频角度可以控制在15°...有谁有这方面的经验没有?如何有效控制有源射频的识别角度。 我的想法是这样 ...…

查看全部问答>

如何调整核心内存的大小

向大家请教个问题:默认情况下,4G的内存,核心内存和用户态内存分别是2G,现在我写了一个驱动,需要更多的核心内存,因此想把核心内存调整的大些,应该如何做到呢?   另外,我还有个机器是8G内存,跑wxp64位系统,也想调整核心内存更 ...…

查看全部问答>

手机开发USB口问题

将手机和PC机用USB相连: 当先将未开机的手机用USB线连到PC上,再打开手机时,从PC上向手机发送AT指令,手机能向PC返回OK;可是当先将手机开机,再将手机用USB线连接到PC机时,从PC上向手机发送AT指令,手机却不能向PC返回任何东西。不知以上是什么 ...…

查看全部问答>

ioctl返回的地址问题?初学者,高人指点。

请问ioctl返回的地址是虚拟地址还是物理地址? 小弟在做dm6446上的resize,用ioctl返回的resize驱动中申请的buffer的地址是在用户空间是不能用的? 大家指教。 ioctl返回的地址问题?初学者,高人指点。…

查看全部问答>

字符串操作的问题

我需要拆分一个字符串,没有找到好的方法。 比如: cstring FullName = \"Storage Card\\\\media\\\\test.mp3\"; cstring strDir = \"\"; cstring strName = \"\"; 我的最终目的是 strDir = \"Storage Card\\\\media\\\\\"; strName = \"tes ...…

查看全部问答>

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 以上错误,请问这是什么原因,我用的 ...…

查看全部问答>