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