CAN学习 STM32 HAL库

文章介绍了如何在嵌入式系统中使用CAN通信协议发送和接收数据,包括一帧数据的传输、回环模式的应用以及温湿度传感器数据的CAN上传。还讨论了不同CAN工作模式及其在开发过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一帧数据的收发

  • 回环模式 Loopback(自收自发,一块开发板即可)
  • 波特率设置为500k
  • 使能CAN:需要手动添加 HAL_CAN_Start(&hcan1);
  • 不使用中断

         

 int main(void)
{
	int         ret;
	int         value;
	int         i;
	uint8_t     txdata[8] = {12,23,3,26,66,88,99,32};
	uint8_t     rxdata[8];

while (1)
  {
	  ret= CAN_Transmit_Msg(txdata,8);//Transmit message
	  if( ret == 0)
	  {
		  printf("CAN Send success!\r\n");
		  blink_led(BlueLed,500);//发送成功时,蓝灯闪烁
	  }
	  else
	  {
		  printf("CAN Send failed!\r\n");发送失败时,红灯闪烁
		  blink_led(RedLed,500);
	  }

	  value=CAN_Receive_Msg(rxdata);//Receive message
	  printf("RECV DATA:");
	  for(i= 0; i< value; i++)
	  {
		  printf("0x%x ",rxdata[i]);
	  }
	  printf("\r\n");

	  printf("+++++++++++++++++++++++++++++++\r\n");
	  HAL_Delay(2000);//延时2s发送一次
  }
}

温湿度通过CAN上报

int mian()
{
	float             temp,humi;
    int               ret;
	int               value;
	unsigned char     buf1[256];
	unsigned char     buf2[256];


  while (1)
  {

		if( (sht20_sample_temp_or_hum(0xF3,&temp) <0 ) || (sht20_sample_temp_or_hum(0xF5,&humi) <0 ))
		{
			printf("ERROR:sht20 sample data failure\n");
			return -1;
		}

		snprintf((char *)buf1,sizeof(buf1),"%.2f",temp);
		ret=CAN_Transmit_Msg(buf1,strlen((char *)buf1));
		if( ret == 0)
		{
			printf("CAN Send Temperature success!\r\n");
			blink_led(BlueLed,500);//蓝灯闪烁
		}
		else
		{
			printf("CAN Send Temperature failed!\r\n");
			blink_led(RedLed,500);
		}
		CAN_Receive_Msg(rxdata);
		printf("temperature:%s\r\n",rxdata);

		snprintf((char *)buf2,sizeof(buf2),"%.2f",humi);
		value=CAN_Transmit_Msg(buf2,strlen((char *)buf2));
		if( value == 0)
		{
			printf("CAN Send Humidity success!\r\n");
			blink_led(GreenLed,500);//绿灯闪烁
		}
		else
		{
			printf("CAN Send Humidity failed!\r\n");
			blink_led(RedLed,500);
		}
		memset(rxdata,0,sizeof(rxdata));
		CAN_Receive_Msg(rxdata);
		printf("Humidity:%s\r\n",rxdata);

		HAL_Delay(2000);//延时2s上报一次温湿度
 }
}

注意:

  1. 如果要开启接收中断,需要手动添加:HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
  2. Advanced Parameters
  • 正常模式:CAN外设正常地向CAN总线发送数据并从CAN总线上接收数据。
  • 回环模式:CAN外设正常向CAN总线发送数据,同时接收自己发送的数据,但不从CAN总线上接收数据。在学习CAN外设的时候非常有用,特别是在没有专门的USB转CAN模块也没有两块开发板的时候。
  • 静默模式:CAN外设不向CAN总线发送数据,仅从CAN总线上接收数据,但不会应答。一般用于检测CAN总线的流量。
  • 静默回环模式:CAN外设不会往CAN总线收发数据,仅给自己发送。一般用于自检。
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值