历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2019年08月14日 | 【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置

2019-08-14 来源:eefocus

1,因为自己目前只有一块板子有CAN模块,所以先做CAN的回环测试。


主要参考http://www.stm32cube.com/question/33


下面的代码测试可以使用


1-1,在CAN的编程中,主要是注意四大结构体,这几个都是自动生成的,


1、CAN_HandleTypeDef  hcan1;// CAN handle Structure definition首先定义CAN的处理结构体,hcan1内部包括了


3、CanTxMsgTypeDef; 4、CanRxMsgTypeDef;的头地址


2、CAN_FilterConfTypeDef  sFilterConfig;// CAN filter configuration structure definition需要学会怎么配置配置过滤器


3、CanTxMsgTypeDef;//CAN Tx message structure definition  //can的发送配置,主要是Stdld标准标识符,Extld标准扩展标识符,IDE标准帧与扩展帧的区别,RTR数据帧或遥控帧,DLC数据帧的长度,data[]要发送的数据段的内容,最大8个字节


4、CanRxMsgTypeDef;  //CAN Rx message structure definition//除了发送CAN中的参数,还包括FMI过滤器的编号,FIFONumber的编号。


1-2,CAN的发送与接收模式与以前的串口,I2C,FLASH都有区别。


can的发送是HAL_CAN_Transmit(&hcan1, 10),在字面上并不指定发送数据的数组,而是发送的是一个结构体,包含的信息更多,如stdld,IDE,DLC,data[]等等。


但hcan1->Data中实际就是包含的数组值.


同理可以看到can 的接收函数(HAL_CAN_Receive(&hcan, CAN_FIFO0,10),也是一样的分析


1-3,简单的发送可以封装函数

1-4,注释

1-5,hal_can.h常用函数


/** @addtogroup CAN_Exported_Functions_Group1

  * @brief    Initialization and Configuration functions 

  * @{

  */

/* Initialization and de-initialization functions *****************************/

HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan);

HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig);

HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan);

void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan);

void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan);

/**

  * @}

  */



/** @addtogroup CAN_Exported_Functions_Group2

  * @brief    I/O operation functions 

  * @{

  */

/* I/O operation functions *****************************************************/

HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef *hcan, uint32_t Timeout);

HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef *hcan);

HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef *hcan, uint8_t FIFONumber, uint32_t Timeout);

HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef *hcan, uint8_t FIFONumber);

HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef *hcan);

HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);

void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan);

void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan);

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan);

void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);

/**




1-6 测试函数


/* USER CODE BEGIN 1 */

HAL_StatusTypeDef CAN_Polling(void)

{

  CAN_FilterConfTypeDef  sFilterConfig;

  static CanTxMsgTypeDef        TxMessage;

  static CanRxMsgTypeDef        RxMessage;

 

  hcan.pTxMsg = &TxMessage;//²é¿´CAN_HandleTypeDefµÄ¶¨Ò壬pTxMsgÊÇÒ»¸ö½á¹¹ÌåÖ¸Õë

  hcan.pRxMsg = &RxMessage;

  //Configure the CAN Filter 

  sFilterConfig.FilterNumber = 0;

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

  sFilterConfig.FilterIdHigh = 0x0000;

  sFilterConfig.FilterIdLow = 0x0000;

  sFilterConfig.FilterMaskIdHigh = 0x0000;

  sFilterConfig.FilterMaskIdLow = 0x0000;

  sFilterConfig.FilterFIFOAssignment = 0;//???????FIFO?,0??1,??????FIFO0

  sFilterConfig.FilterActivation = ENABLE;

  sFilterConfig.BankNumber = 14;

  

  if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)

  {

  //[i] Filter configuration Error [/i]/

Error_Handler();

  }

    

  //3- Start the Transmission process 

  hcan.pTxMsg->StdId = 0x11;      //Ö¸¶¨±ê×¼±êʶ·û£¬0-0X7FF

  hcan.pTxMsg->RTR = CAN_RTR_DATA; //RTR,Çø·ÖÊý¾ÝÖ¡»¹ÊÇÒ£¿ØÖ¡£¬´Ë´¦ÎªÊý¾ÝÖ¡

  hcan.pTxMsg->IDE = CAN_ID_STD;//Çø±ð±ê×¼Ö¡ºÍÀ©Õ¹Ö¡£¬#define CAN_ID_EXT                  0x00000004U  /*!< Extended Id */

  hcan.pTxMsg->DLC = 2;//ÉèÖÃÊý¾ÝÖ¡Êý¾Ý³¤¶È£¬·¶Î§0-8

  hcan.pTxMsg->Data[0] = 0xCA;//µÚÒ»¸ö×Ö½ÚÊý¾Ý

  hcan.pTxMsg->Data[1] = 0xFE;//µÚ¶þ¸ö×Ö½ÚÊý¾Ý

  

  if(HAL_CAN_Transmit(&hcan, 10) != HAL_OK)//timeout 10ms

  {

    //²é¿´´«ÊäÊÇ·ñ³¬Ê±£¬³¬Ê±µãÁÁºìÉ«LED

HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,GPIO_PIN_RESET );

while(1);

  }

  

  if(HAL_CAN_GetState(&hcan) != HAL_CAN_STATE_READY)

  {

    return HAL_ERROR;

  }

  

//4- Start the Reception process 

  if(HAL_CAN_Receive(&hcan, CAN_FIFO0,10) != HAL_OK)//ÉÏÃæ¶¨ÒåÁËFIFO0

  {

   //Reception Error 



HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,GPIO_PIN_RESET );

while(1);

  }

  

  if(HAL_CAN_GetState(&hcan) != HAL_CAN_STATE_READY)

  {

    return HAL_ERROR;

  }

  



  if (hcan.pRxMsg->StdId != 0x11)//½ÓÊÕµ½µÄÊý¾Ý±êʶ·û

  {

printf ("CAN1 Loopback fause !/r/n");

    return HAL_ERROR;  

  }



  if (hcan.pRxMsg->IDE != CAN_ID_STD)//??????????

  {

    return HAL_ERROR;

  }



  if (hcan.pRxMsg->DLC != 2)//????????

  {

    return HAL_ERROR;  

  }



  if ((RxMessage.Data[0]<<8|RxMessage.Data[1]) != 0xCAFE)

  {

    return HAL_ERROR;

  }

  

  return HAL_OK; //[i] Test Passed [/i]/

}


/* USER CODE END 1 */


1-7,过滤器的匹配设置


https://blog.csdn.net/houqi02/article/details/51545967


https://blog.csdn.net/bonson2004/article/details/68942442



1-8,FIFO与过滤器的关联


http://www.openedv.com/posts/list/43984.htm

推荐阅读

史海拾趣

FERYSTER公司的发展小趣事

在快速发展的过程中,FERYSTER公司非常注重企业文化的塑造。公司倡导“创新、协作、责任、卓越”的价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的成长和发展,为员工提供各种培训和学习机会。这些措施使得FERYSTER公司成为了一个充满活力、积极向上的团队,为公司的发展提供了源源不断的动力。

CEVA, Inc公司的发展小趣事

CEVA公司在超低功耗技术方面取得了显著突破。公司开发的超低功耗IP包括由专用DSP与AI和其他类型的加速器组成的综合平台。这些加速器针对低功耗工作负载进行了优化,包括5G基带处理、智能视觉、语音识别、物理层处理和传感器融合等。这些技术的突破使得CEVA的产品在保持高性能的同时,能够大幅度降低功耗,满足了市场对节能设备的需求。

Eby Company公司的发展小趣事

eBay一直致力于创新和改革,以适应不断变化的市场环境。例如,eBay推出了“新卖家金鹰计划”,旨在通过多项专属服务扶持新卖家拓展全球市场。此外,eBay还不断更新其技术平台,提高交易效率和用户体验。这些创新和改革措施使eBay能够在竞争激烈的电子行业中保持领先地位。

FORMOSA公司的发展小趣事

随着物联网和智能家居概念的普及,一家名为“FORMOSA智能科技”的公司专注于研发和生产智能家居硬件产品。该公司推出的智能音箱、智能门锁、智能照明等系列产品,凭借其出色的性能、便捷的操作和良好的用户体验,在市场上迅速获得了消费者的青睐。FORMOSA智能科技还积极与各大智能家居平台进行合作,实现了产品的互联互通和智能化管理。通过不断的技术创新和市场拓展,该公司成功推动了智能家居产品的普及和应用。

Comtech AHA Corp公司的发展小趣事

随着国内市场的饱和,Comtech AHA Corp开始积极寻求国际化发展。公司先后在多个国家和地区设立了分支机构,拓展国际市场。通过与国际知名企业的合作与交流,Comtech AHA Corp不断提升自身的技术水平和市场竞争力。如今,公司的产品已经远销海外多个国家和地区,国际化战略取得了显著成效。

FREESCALE (NXP)公司的发展小趣事

Comtech AHA Corp自创立之初,便以技术创新为核心竞争力。公司研发团队不断攻克技术难关,推出了一系列具有自主知识产权的高性能电子产品。其中,一款具有自主知识产权的通信芯片在市场上取得了巨大成功,为公司带来了可观的收益。随着技术的不断迭代升级,Comtech AHA Corp逐渐在电子行业中占据了一席之地。

问答坊 | AI 解惑

WINCE COM支持 CoCreateInstance API失败

在EVC下 我写一个DeviceQuery的组件 在另外一个DLL里写下面代码: HRESULT hr = ::CoCreateInstance(CLSID_IDeviceQuery,NULL,CLSCTX_ALL,IID_DeviceQuery,(void**)&m_IDeviceQuery); 编译没有问题,但是跑起来就这个函数调用失败。 说明:我 ...…

查看全部问答>

EVC有关CAN总线的编程

现在要在Wince下用EVC编写一个Can通讯的程序,有谁能提供相关的例子吗?? 如EVC下CAN如何接收和发送数据,CAN控制器用的是SJA1000。…

查看全部问答>

问一个arm开发板液晶屏接口问题

今天够买了一块优龙公司的IntelXscalePXA255 ARM芯片的开发板,但没有购买其选购的液晶屏,而是想用手上现有的一块技创科技公司的配套三星2410开发板的液晶屏,但发现配套的2410液晶屏的接口接上去不能工作。把液晶屏直接插上开发板,正常工作的开 ...…

查看全部问答>

eVC开发的程序怎样实现关闭winCE

要关闭winCE操作系统 偶菜鸟 谢谢!…

查看全部问答>

常用的几种集成电路的检测方法

集成电路是一种微型电子器件或部件。采用一定的工艺,把一个电路中所需的晶体管、二极管、电阻、电容和电感等元件及布线互连一起,制作在一小块或几小块半导体晶片或介质基片上,然后封装在一个管壳内,成为具有所需电路功能的微型结构;其中所有元 ...…

查看全部问答>

请教车载影音系统用什么MCU?

                                 请教车载影音系统用什么MCU好一点,是st8稳定还是stm32W稳定呢?…

查看全部问答>

TI 活动送的旅行电源转换插座问题

TI 活动送的旅行电源转换插座   里面的充电器  充电好像很热哦   有这个奖品的兄弟 你们用过了吗?…

查看全部问答>

RT-Thread 1.2.0 Alpha 版本发布

RT-Thread 1.2.0 Alpha版本发布 遵循2013年RT-Thread roadmap,RT-Thread 1.2.0 Alpha版本发布,Alpha意味着此版本为技术预览版,仅用于展示RT-Thread 1.2.0未来的发展方向,并不适合于开发正式产品。RT-Thread 1.2.0版本是1.1.x系列的下一个分支 ...…

查看全部问答>