各位路过大神:本人刚接触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 <<canpara->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里的初始化对吗?给的例子程序难道不能使用吗?
请高人指点一下。
