RT-Thread论坛
直播中

张涛

7年用户 1301经验值
私信 关注
[问答]

RT-thread 4.1.0按照官方的例程写完CAN的程序,没有配置硬件过滤表,每次都发送两遍数据的原因?

1.按照官方的例程写完CAN的程序,没有配置硬件过滤表。测试发现每次发送两遍数据。中间隔的时间3ns。
2.用的AT32F407VGT7

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: 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;
}

回帖(1)

陈莉

2024-3-22 18:09:23
上逻辑分析仪看下吧,感觉像是硬件自动重发了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分