From b750e11ec1c4a8b07aa5b3c396308da04c71bf5f Mon Sep 17 00:00:00 2001 From: "Aubr.Cool" Date: Tue, 7 Jul 2015 12:28:57 +0800 Subject: [PATCH] [bsp]stm32f10x add canapp can bus hook set --- bsp/stm32f10x/applications/canapp.c | 91 ++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/bsp/stm32f10x/applications/canapp.c b/bsp/stm32f10x/applications/canapp.c index 01ca1c9cbb..217374b514 100644 --- a/bsp/stm32f10x/applications/canapp.c +++ b/bsp/stm32f10x/applications/canapp.c @@ -12,10 +12,99 @@ * 2015-05-14 aubrcool@qq.com first version */ -#ifdef RT_USING_CAN #include #include #include +#ifdef RT_USING_CAN +#define CANRT1 8 +#define CANERR1 9 +#define CANRT2 37 +#define CANERR2 38 +static struct canledtype +{ + struct stm32_hw_pin_userdata rtd; + struct stm32_hw_pin_userdata err; +} canled[] = +{ +#ifdef USING_BXCAN1 + { + {CANRT1, PIN_MODE_OUTPUT_OD,}, + {CANERR1, PIN_MODE_OUTPUT_OD,}, + }, +#endif /*USING_BXCAN1*/ +#ifdef USING_BXCAN2 + { + {CANRT2, PIN_MODE_OUTPUT_OD,}, + {CANERR2, PIN_MODE_OUTPUT_OD,}, + }, +#endif /*USING_BXCAN2*/ +}; +void can_bus_hook(struct rt_can_device * can, struct canledtype* led) +{ + if(can->timerinitflag == 1) { + rt_pin_write(led->rtd.pin, 0); + } else { + if(can->status.rcvchange == 1 || can->status.sndchange == 1) + { + can->status.rcvchange = 0; + can->status.sndchange = 0; + rt_pin_write(led->rtd.pin,rt_pin_read(led->rtd.pin)?0:1); + } else { + rt_pin_write(led->rtd.pin,1); + } + } + if(can->timerinitflag == 1) { + rt_pin_write(led->err.pin, 0); + } else { + if(can->status.errcode) { + rt_pin_write(led->err.pin,0); + } else { + rt_pin_write(led->err.pin,1); + } + } +} +#ifdef USING_BXCAN1 +void can1_bus_hook(struct rt_can_device * can) +{ + static rt_int32_t inited = 0; + if(!inited) + { + inited = 1; + rt_pin_mode(canled[0].rtd.pin, canled[0].rtd.mode); + rt_pin_mode(canled[0].err.pin, canled[0].err.mode); + } + can_bus_hook(can, &canled[0]); +} +#endif /*USING_BXCAN1*/ +#ifdef USING_BXCAN2 +void can2_bus_hook(struct rt_can_device * can) +{ + static rt_int32_t inited = 0; + if(!inited) + { + inited = 1; + rt_pin_mode(canled[1].rtd.pin, canled[1].rtd.mode); + rt_pin_mode(canled[1].err.pin, canled[1].err.mode); + } + can_bus_hook(can, &canled[1]); +} +#endif /*USING_BXCAN2*/ +int can_bus_hook_init(void) +{ + rt_device_t candev; +#ifdef USING_BXCAN1 + candev = rt_device_find("bxcan1"); + RT_ASSERT(candev); + rt_device_control(candev,RT_CAN_CMD_SET_BUS_HOOK,(void*)can1_bus_hook); +#endif /*USING_BXCAN1*/ +#ifdef USING_BXCAN2 + candev = rt_device_find("bxcan2"); + RT_ASSERT(candev); + rt_device_control(candev,RT_CAN_CMD_SET_BUS_HOOK,(void*)can2_bus_hook); +#endif /*USING_BXCAN2*/ + return RT_EOK; +} +INIT_DEVICE_EXPORT(can_bus_hook_init); struct can_app_struct { const char* name;