1.按照官方的例程写完CAN的程序,没有配置硬件过滤表。测试发现每次发送两遍数据。中间隔的时间3ns。
2.用的AT32F407VGT7
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Iden
tifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-03-20 YFZX1 the first version
*/
#include
#include "rtdevice.h"
#define CAN1_DEV_NAME "can1"
rt_device_t can_dev; /*can 设备句柄*/
/*回调函数*/
static rt_err_t Can1_RX_Call(rt_device_t dev, rt_size_t size)
{
return RT_EOK;
}
/*主函数*/
void CanDevs_State_Update(void *parameter)
{
while(1)
{
rt_thread_delay(10);
}
}
/*测试*/
void CAN_tset_Demo(int argc, char** argv)
{
struct rt_can_msg msg = {0};
rt_size_t size;
msg.id = 0x78; /* ID 为 0x78 */
msg.ide = RT_CAN_STDID; /* 标准格式 */
msg.rtr = RT_CAN_DTR; /* 数据帧 */
msg.len = 8; /* 数据长度为 8 */
/* 待发送的 8 字节数据 */
msg.data[0] = 0x00;
msg.data[1] = 0x11;
msg.data[2] = 0x22;
msg.data[3] = 0x33;
msg.data[4] = 0x44;
msg.data[5] = 0x55;
msg.data[6] = 0x66;
msg.data[7] = 0x77;
/* 发送一帧 CAN 数据 */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
rt_kprintf("can dev write data failed!\n");
}
}
MSH_CMD_EXPORT(CAN_tset_Demo, can sample);
/*CAN线程初始化*/
int Can_thread_Init(void)
{
rt_thread_t thread;
can_dev = rt_device_find(CAN1_DEV_NAME);
if(!can_dev)
{
rt_kprintf("find %s failed!\r\n", CAN1_DEV_NAME);
return RT_ERROR;
}
/* 设置CAN的打开方式为TX和RX*/
rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
/* 设置CAN的工作速度为10K*/
rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN10kBaud);
/* 设置 CAN 的工作模式为正常工作模式 */
rt_device_control(can_dev, RT_CAN_CMD_SET_MODE, (void *)RT_CAN_MODE_NORMAL);
/* 设置CAn的回调函数*/
rt_device_set_rx_indicate(can_dev, Can1_RX_Call);
/* 创建CAN的线程*/
thread = rt_thread_create("can_thread", CanDevs_State_Update, RT_NULL, 1024, 10, 10);
if(thread != RT_NULL)
{
rt_thread_startup(thread);
}
else
{
rt_kprintf("create can thread failed !\r\n");
}
return 0;
}