CAN通信入门-2

CAN通信入门-2

初始化代码调试

1、使用芯片为GD32F303C8T6芯片。
2、使用STM32CUBEMX进行代码生成的时候使用STM32F103系列生成代码。
3、代码生成后,需要修改HAL库代码用来适配GD32F303的芯片。参考:修改说明

测试代码
初始化代码(发送部分)
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 16;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_4TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_9TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_8TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = DISABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = DISABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
	HAL_CAN_Start(&hcan);  //初始化完成后必须开启外设
发送代码

发送部分代码,一次只能发送8个字节的数据。

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)	
//len:数据长度(最大为8)				     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//		 其他,失败;
uint8_t CAN1_Send_Msg(uint8_t* msg,uint8_t len)
{	
  uint16_t i=0;
	uint32_t mbox = 1;
	
	CAN1_TxMsg.StdId = 0x123;    //标准模式下的ID
	CAN1_TxMsg.ExtId = 0x12;    //扩展模式下的ID
	CAN1_TxMsg.IDE = CAN_ID_STD;  //设备处于标准模式
	CAN1_TxMsg.RTR = CAN_RTR_DATA; //设备传输数据帧
	CAN1_TxMsg.DLC = len;          //要传输数据的长度
	CAN1_TxMsg.TransmitGlobalTime = DISABLE;
	HAL_CAN_AddTxMessage(&hcan,&CAN1_TxMsg,msg,&mbox);

  return 0;		
}
接收部分初始化

关于滤波标识符设置的说明
在这里插入图片描述

    sFilterConfig.FilterBank = 0;    //开启对应的滤波器编号
	sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;   //过滤模式,列表或者屏蔽模式
	sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  //设置滤波器的位宽
	sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //设置对应的FIFO区域
	
	sFilterConfig.FilterIdHigh = 0X0000;  //需要过滤的ID号
	sFilterConfig.FilterIdLow = 0X0066; 
	sFilterConfig.FilterMaskIdHigh = 0X0000;  //先不要屏蔽的ID号
	sFilterConfig.FilterMaskIdLow = 0X0000;
	sFilterConfig.FilterActivation = ENABLE;  //激活过滤器
	sFilterConfig.SlaveStartFilterBank = 14;  //

	if (HAL_CAN_ConfigFilter(&hcan,&sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }
接收部分代码

接收的部分代码单次能接收到8个字节的数据。

uint8_t CAN_DATA_GET(void)
{
	CAN_RxHeaderTypeDef pHeader;
	uint8_t data[64],i;
	
	if(HAL_CAN_GetRxMessage(&hcan,CAN_FILTER_FIFO0,&pHeader,data) == HAL_OK)
	{
		for(i=0;i<pHeader.DLC;i++)
			printf("%c",data[i]);
		printf("\r\n");
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿飞的秘术屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值