1027|4

119

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【ST NUCLEO-U5A5ZJ-Q开发板测评】-6-FDCAN体验 [复制链接]

本帖最后由 慕容雪花 于 2024-3-4 12:54 编辑

U5系列器件的FDCAN非常方便,可以支持CAN-FD也支持经典CAN 2.0.本次实验主要用到的工具和器件:

  • STM32U5A5ZJ-Q
  • TJA1050 CAN收发器
  • CAN LIN TOOL V5.0

CAN收发引脚使用PB8和PB9:

 

TJA1050的原理图:

 

 

在CubeIde里面配置:

 

FDCAN时钟:64Mhz

 

CAN相关时序参数和工作模式:

保存,自动生成代码:

static void MX_FDCAN1_Init(void)
{

  /* USER CODE BEGIN FDCAN1_Init 0 */

  /* USER CODE END FDCAN1_Init 0 */

  /* USER CODE BEGIN FDCAN1_Init 1 */

  /* USER CODE END FDCAN1_Init 1 */
  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan1.Init.AutoRetransmission = ENABLE;
  hfdcan1.Init.TransmitPause = ENABLE;
  hfdcan1.Init.ProtocolException = DISABLE;
  hfdcan1.Init.NominalPrescaler = 16;
  hfdcan1.Init.NominalSyncJumpWidth = 1;
  hfdcan1.Init.NominalTimeSeg1 = 5;
  hfdcan1.Init.NominalTimeSeg2 = 2;
  hfdcan1.Init.DataPrescaler = 1;
  hfdcan1.Init.DataSyncJumpWidth = 1;
  hfdcan1.Init.DataTimeSeg1 = 1;
  hfdcan1.Init.DataTimeSeg2 = 1;
  hfdcan1.Init.StdFiltersNbr = 0;
  hfdcan1.Init.ExtFiltersNbr = 0;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN1_Init 2 */

  /* USER CODE END FDCAN1_Init 2 */

}

添加自定义的测试数据:

FDCAN_FilterTypeDef sFilterConfig;
FDCAN_TxHeaderTypeDef TxHeader;
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t TxData0[] = {0x10, 0x32, 0x54, 0x76, 0x98, 0x00, 0x11, 0x22};
uint8_t TxData1[] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
uint8_t TxData2[] = {0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};

添加相关的过滤器:

void MY_FDCAN_CONFIG(void){
	/*##-1 Configure the FDCAN filters ########################################*/
	/* Configure standard ID reception filter to Rx FIFO 0 */
	sFilterConfig.IdType = FDCAN_STANDARD_ID;
	sFilterConfig.FilterIndex = 0;
	sFilterConfig.FilterType = FDCAN_FILTER_DUAL;
	sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
	sFilterConfig.FilterID1 = 0x444;
	sFilterConfig.FilterID2 = 0x555;
	if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}

	/* Configure extended ID reception filter to Rx FIFO 1 */
	sFilterConfig.IdType = FDCAN_EXTENDED_ID;
	sFilterConfig.FilterIndex = 0;
	sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;
	sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
	sFilterConfig.FilterID1 = 0x1111111;
	sFilterConfig.FilterID2 = 0x2222222;
	if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}

	/* Configure global filter:
	       Filter all remote frames with STD and EXT ID
	       Reject non matching frames with STD ID and EXT ID */
	if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
	{
		Error_Handler();
	}

	/*##-2 Start FDCAN controller (continuous listening CAN bus) ##############*/
	if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
	{
		Error_Handler();
	}

	printf("\r\nBefore Add 0x444: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));

	/*##-3 Transmit messages ##################################################*/
	/* Add message to Tx FIFO */
	TxHeader.Identifier = 0x444;
	TxHeader.IdType = FDCAN_STANDARD_ID;
	TxHeader.TxFrameType = FDCAN_DATA_FRAME;
	TxHeader.DataLength = FDCAN_DLC_BYTES_8;
	TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
	TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
	TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
	TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
	TxHeader.MessageMarker = 0x52;
	if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData0) != HAL_OK)
	{
		Error_Handler();
	}
	printf("\r\nAfter Add 0x444: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));

	/* Add second message to Tx FIFO */
	TxHeader.Identifier = 0x1111112;
	TxHeader.IdType = FDCAN_EXTENDED_ID;
	TxHeader.TxFrameType = FDCAN_DATA_FRAME;
	TxHeader.DataLength = FDCAN_DLC_BYTES_8;
	TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
	TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
	TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
	TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
	TxHeader.MessageMarker = 0xCC;
	if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData1) != HAL_OK)
	{
		Error_Handler();
	}
	printf("\r\nAfter Add 0x1111112: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));

	/* Add third message to Tx FIFO */
	TxHeader.Identifier = 0x1111113;
	TxHeader.IdType = FDCAN_EXTENDED_ID;
	TxHeader.TxFrameType = FDCAN_DATA_FRAME;
	TxHeader.DataLength = FDCAN_DLC_BYTES_8;
	TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
	TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
	TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
	TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
	TxHeader.MessageMarker = 0xDD;
	if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData2) != HAL_OK)
	{
		Error_Handler();
	}
	printf("\r\nAfter Add 0x1111113: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));

	/* Wait transmissions complete */
	while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3) {}

	printf("\r\n 3 CAN MSG Transmissions Complete.");

}//end of void MY_FDCAN_CONFIG(void)

 

主循环中每次呼吸灯闪烁一次,把次数打包到can msg里面发送到上位机。

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  static uint16_t dcycle_pulse = 0;
	  static uint8_t breath_cnt = 0;
	  //htim3.Init.Period = 999
	  while(dcycle_pulse <htim3.Init.Period){
		  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, dcycle_pulse);
		  dcycle_pulse += 50;
		  printf("\nLight Phase, Current DutyCycle = %u", dcycle_pulse*100/htim3.Init.Period);
		  HAL_Delay(100);
	  }
	  while(dcycle_pulse > 0){
		  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, dcycle_pulse);
		  dcycle_pulse -= 50;
		  printf("\nDim Phase, Current DutyCycle = %u", dcycle_pulse*100/htim3.Init.Period);
		  HAL_Delay(100);
	  }


	  printf("\r\nBefore Add 0x555: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));

	  /* Wait for available Tx Fifo */
	  while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) == 0) {}

	  TxBreathLEDCnt[7] = breath_cnt++;
	  if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxBreathLEDCnt) != HAL_OK)
	  {
		  Error_Handler();
	  }


	  printf("\r\nAfter Add 0x555: HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) = %d", HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1));
	  printf("\r\nSTM32U5-TJA1050-USBCAN: Breath LED CAN MSG Transmissions Complete.");


  }//end of while

硬件系统:

 

上位机数据:

首先收到3帧测试数据,然后呼吸灯的闪烁次数通过id为555的报文被传送过来。

 

 

这次体验下来感觉配置cubeide使用fdcan外设是非常方便的,后续考虑深入了解一下接收,以及中断收发等功能。

 

参考:

AN5348_STM32器件上的FDCAN外设的应用手册.pdf

此帖出自stm32/stm8论坛

最新回复

你的帖子也非常精彩!比我的更内容丰富!   详情 回复 发表于 2024-3-4 11:50
点赞 关注
 

回复
举报

119

帖子

1

TA的资源

一粒金砂(高级)

沙发
 

回复

6841

帖子

11

TA的资源

版主

板凳
 

这次体验下来感觉配置cubeide使用fdcan外设是非常方便的,后续考虑深入了解一下接收,以及中断收发等功能。

感谢分享!

此帖出自stm32/stm8论坛

点评

感谢刘工之前分享的U5系列FDCAN使用经验,受益匪浅!  详情 回复 发表于 2024-3-4 11:32
 
 

回复

119

帖子

1

TA的资源

一粒金砂(高级)

4
 
lugl4313820 发表于 2024-3-4 11:30 这次体验下来感觉配置cubeide使用fdcan外设是非常方便的,后续考虑深入了解一下接收,以及中断收发等功能。 ...

感谢刘工之前分享的U5系列FDCAN使用经验,受益匪浅!

此帖出自stm32/stm8论坛

点评

你的帖子也非常精彩!比我的更内容丰富!  详情 回复 发表于 2024-3-4 11:50
 
 
 

回复

6841

帖子

11

TA的资源

版主

5
 
慕容雪花 发表于 2024-3-4 11:32 感谢刘工之前分享的U5系列FDCAN使用经验,受益匪浅!

你的帖子也非常精彩!比我的更内容丰富!

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
高速模拟电路设计技术

高速模拟电路设计技术 看看就知道有不有用了!! 我觉得很可以的!!!

一些关于ARM学习的书籍

最近收集了一些关于ARM学习的书籍,现在就把它们都贴出来,或许对大家学习有所帮助。

2009电子设计大赛 FFT算法 C滤波算法

本帖最后由 paulhyde 于 2014-9-15 03:51 编辑 2009电子设计大赛 VHDL语言实现的FFT算法,以及C语言实现的滤波算法。 本帖最 ...

LPCXpresso -- 你对它没感觉吗(全面深入的感受)

用LPCXpresso差不多一个多月了,发现最近越来越喜欢它了,但是也发现了它的很多不足,下面将深入全面地与大家一起讨论它的 ...

关于国外口罩

由于国内口罩短缺,很多国外的口罩进来,如果上面有英语,自然为难不了攻城狮们,但是,如果是非英语的外语,就会吃力很多,最近 ...

开关电源学习小组

本帖最后由 1nnocent 于 2020-8-13 18:03 编辑 开关电源设计(第3版)书中,494573 其逻辑关系后面,EA输出电压降低对应图1. ...

模拟电子设计导论

本书适合作为模电翻转课堂和电子设计竞赛培训的教材,立足于电子系统设计,基于TI模拟技术及MCU平台,共8章4个附录,主要内容包 ...

【得捷电子Follow me第2期】AdaFruit ESP32S3 TFT任务提交,互联网时钟雏形

本帖最后由 jaryyy2000 于 2023-11-27 11:07 编辑 有幸参与由EEWorld电子工程世界和DigiKey得捷电子共同举办的【得捷电子Foll ...

极狐获投1000亿!

这个金额,管管我真的是眼睛擦了三遍!!! 我表示我暂时不知道该怎么表达,就大家一起看新闻吧 近日,北汽集团董事 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表