[CANFestival Rtt] 自带例程Master402问题

发布于 2020-06-30 09:53:07
各位路过大神:本人刚接触RT-Thread,最近有个项目需要控制一台变频器,通信方式是CANOpen CIA402的方式。
硬件是正点原子的 阿波罗stm32F767开发版

1,首先我在ENV里只激活了CAN 并且用周立功的CAN测试仪器 测试了can的通讯口,可以正常收发。
2,然后再在ENV里激活了CANFentival的组件

想测试一下系统自带的例子CIA402。
3,程序编译通过 下载后运行发现FINSH不能正常工作。
4,监控程序后发现程序在can_rtthread.c里面死循环
void canopen_recv_thread_entry(void* parameter)
{
struct can_app_struct *canpara = (struct can_app_struct *) parameter;
struct rt_can_msg msg;
rt_uint32_t e;
Message co_msg;

/* set LED0 pin mode to output */
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

candev = rt_device_find(canpara->name);
RT_ASSERT(candev);
rt_event_init(&canpara->event, canpara->name, RT_IPC_FLAG_FIFO);
rt_device_open(candev, (RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX));
rt_device_control(candev, RT_CAN_CMD_SET_FILTER, canpara->filter);

while (1)
{
if (rt_event_recv(&canpara->event,
( 1 <filter->items[0].hdr),//(1 << canpara->filter->items[0].hdr),
canpara->eventopt,
RT_WAITING_FOREVER, &e) != RT_EOK)
{

rt_pin_write(LED1_PIN, PIN_HIGH); //在这里死循环
rt_thread_mdelay(1000);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(1000);
continue;
}

if (e & (1 << canpara->filter->items[0].hdr))
{
msg.hdr = canpara->filter->items[0].hdr;
while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg))
{
co_msg.cob_id = msg.id;
co_msg.len = msg.len;
co_msg.rtr = msg.rtr;
memcpy(co_msg.data, msg.data, msg.len);
EnterMutex();
canDispatch(OD_Data, &co_msg);
LeaveMutex();
}
}
}
}

5,分析原因发现在can.h里
#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask,ind,args) \
{(id), (ide), (rtr), (mode), (mask), -1, (ind), (args)}
把HDR定义为-1 导致 上面的 rt_event_recv 返回报错。

6,首先问题是,can.h里的初始化对吗?给的例子程序难道不能使用吗?
请高人指点一下。





捕获.JPG

查看更多

关注者
1
被浏览
140
1 个回答
dingzijie
dingzijie 2020-07-01
问题2
1,在can_rtthread里有函数
static rt_err_t can1ind(rt_device_t dev, void *args, rt_int32_t hdr, rt_size_t size)
{
rt_event_t pevent = (rt_event_t)args;
rt_event_send(pevent, 1 << (hdr));
return RT_EOK;
}
其中事件的发送正好激活canopen_recv_thread_entry 里的事件等待内容。
但是我不太清楚can1ind怎么在程序里被调用的。
想学好rt-thread真心不容易。希望有高人指点一下,谢谢。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友