1*10465441SEvalZero说明: 2*10465441SEvalZero本驱动完成了can控制器硬件抽象 3*10465441SEvalZero一 CAN Driver 注册 4*10465441SEvalZero Can driver注册需要填充以下几个数据结构: 5*10465441SEvalZero 1、struct can_configure 6*10465441SEvalZero { 7*10465441SEvalZero rt_uint32_t baud_rate; 8*10465441SEvalZero rt_uint32_t msgboxsz; 9*10465441SEvalZero rt_uint32_t sndboxnumber; 10*10465441SEvalZero rt_uint32_t mode :8; 11*10465441SEvalZero rt_uint32_t privmode :8; 12*10465441SEvalZero rt_uint32_t reserved :16; 13*10465441SEvalZero #ifdef RT_CAN_USING_LED 14*10465441SEvalZero const struct rt_can_led* rcvled; 15*10465441SEvalZero const struct rt_can_led* sndled; 16*10465441SEvalZero const struct rt_can_led* errled; 17*10465441SEvalZero #endif /*RT_CAN_USING_LED*/ 18*10465441SEvalZero rt_uint32_t ticks; 19*10465441SEvalZero #ifdef RT_CAN_USING_HDR 20*10465441SEvalZero rt_uint32_t maxhdr; 21*10465441SEvalZero #endif 22*10465441SEvalZero }; 23*10465441SEvalZero struct can_configure 为can驱动的基本配置信息: 24*10465441SEvalZero baud_rate : 25*10465441SEvalZero enum CANBAUD 26*10465441SEvalZero { 27*10465441SEvalZero CAN1MBaud=0, // 1 MBit/sec 28*10465441SEvalZero CAN800kBaud, // 800 kBit/sec 29*10465441SEvalZero CAN500kBaud, // 500 kBit/sec 30*10465441SEvalZero CAN250kBaud, // 250 kBit/sec 31*10465441SEvalZero CAN125kBaud, // 125 kBit/sec 32*10465441SEvalZero CAN100kBaud, // 100 kBit/sec 33*10465441SEvalZero CAN50kBaud, // 50 kBit/sec 34*10465441SEvalZero CAN20kBaud, // 20 kBit/sec 35*10465441SEvalZero CAN10kBaud // 10 kBit/sec 36*10465441SEvalZero }; 37*10465441SEvalZero 配置Can的波特率。 38*10465441SEvalZero msgboxsz : Can接收邮箱缓冲数量,本驱动在软件层开辟msgboxsz个接收邮箱。 39*10465441SEvalZero sndboxnumber : can 发送通道数量,该配置为Can控制器实际的发送通道数量。 40*10465441SEvalZero mode : 41*10465441SEvalZero #define RT_CAN_MODE_NORMAL 0 正常模式 42*10465441SEvalZero #define RT_CAN_MODE_LISEN 1 只听模式 43*10465441SEvalZero #define RT_CAN_MODE_LOOPBACK 2 自发自收模式 44*10465441SEvalZero #define RT_CAN_MODE_LOOPBACKANLISEN 3 自发自收只听模式 45*10465441SEvalZero 配置Can 的工作状态。 46*10465441SEvalZero privmode : 47*10465441SEvalZero #define RT_CAN_MODE_PRIV 0x01 处于优先级模式,高优先级的消息优先发送。 48*10465441SEvalZero #define RT_CAN_MODE_NOPRIV 0x00 49*10465441SEvalZero 配置Can driver的优先级模式。 50*10465441SEvalZero #ifdef RT_CAN_USING_LED 51*10465441SEvalZero const struct rt_can_led* rcvled; 52*10465441SEvalZero const struct rt_can_led* sndled; 53*10465441SEvalZero const struct rt_can_led* errled; 54*10465441SEvalZero #endif /*RT_CAN_USING_LED*/ 55*10465441SEvalZero 配置can led信息, 当前can驱动的led使用了 pin驱动, 56*10465441SEvalZero 开启RT_CAN_USING_LED时要确保当前系统已实现pin驱动。 57*10465441SEvalZero rt_uint32_t ticks : 配置Can driver timer周期。 58*10465441SEvalZero #ifdef RT_CAN_USING_HDR 59*10465441SEvalZero rt_uint32_t maxhdr; 60*10465441SEvalZero #endif 61*10465441SEvalZero 如果使用硬件过滤,则开启RT_CAN_USING_HDR, maxhdr 为Can控制器过滤表的数量。 62*10465441SEvalZero 2、struct rt_can_ops 63*10465441SEvalZero { 64*10465441SEvalZero rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg); 65*10465441SEvalZero rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg); 66*10465441SEvalZero int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno); 67*10465441SEvalZero int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno); 68*10465441SEvalZero }; 69*10465441SEvalZero struct rt_can_ops 为要实现的特定的can控制器操作。 70*10465441SEvalZero rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg); 71*10465441SEvalZero configure根据配置信息初始化Can控制器工作模式。 72*10465441SEvalZero rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg); 73*10465441SEvalZero control 当前接受以下cmd参数: 74*10465441SEvalZero #define RT_CAN_CMD_SET_FILTER 0x13 75*10465441SEvalZero #define RT_CAN_CMD_SET_BAUD 0x14 76*10465441SEvalZero #define RT_CAN_CMD_SET_MODE 0x15 77*10465441SEvalZero #define RT_CAN_CMD_SET_PRIV 0x16 78*10465441SEvalZero #define RT_CAN_CMD_GET_STATUS 0x17 79*10465441SEvalZero #define RT_CAN_CMD_SET_STATUS_IND 0x18 80*10465441SEvalZero int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno); 81*10465441SEvalZero sendmsg向Can控制器发送数,boxno为发送通道号。 82*10465441SEvalZero int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno); 83*10465441SEvalZero recvmsg从Can控制器接收数据,boxno为接收通道号。 84*10465441SEvalZero struct rt_can_device 85*10465441SEvalZero { 86*10465441SEvalZero struct rt_device parent; 87*10465441SEvalZero 88*10465441SEvalZero const struct rt_can_ops *ops; 89*10465441SEvalZero struct can_configure config; 90*10465441SEvalZero struct rt_can_status status; 91*10465441SEvalZero rt_uint32_t timerinitflag; 92*10465441SEvalZero struct rt_timer timer; 93*10465441SEvalZero struct rt_can_status_ind_type status_indicate; 94*10465441SEvalZero #ifdef RT_CAN_USING_HDR 95*10465441SEvalZero struct rt_can_hdr* hdr; 96*10465441SEvalZero #endif 97*10465441SEvalZero void *can_rx; 98*10465441SEvalZero void *can_tx; 99*10465441SEvalZero }; 100*10465441SEvalZero 填充完成后,便可调用rt_hw_can_register完成can驱动的注册。 101*10465441SEvalZero二、 CAN Driver 的添加: 102*10465441SEvalZero 要添加一个新的Can驱动,至少要完成以下接口。 103*10465441SEvalZero 1、struct rt_can_ops 104*10465441SEvalZero { 105*10465441SEvalZero rt_err_t (*configure)(struct rt_can_device *can, struct can_configure *cfg); 106*10465441SEvalZero rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg); 107*10465441SEvalZero int (*sendmsg)(struct rt_can_device *can, const void* buf, rt_uint32_t boxno); 108*10465441SEvalZero int (*recvmsg)(struct rt_can_device *can,void* buf, rt_uint32_t boxno); 109*10465441SEvalZero }; 110*10465441SEvalZero 2、 rt_err_t (*control)(struct rt_can_device *can, int cmd, void *arg); 111*10465441SEvalZero 接口的 112*10465441SEvalZero #define RT_CAN_CMD_SET_FILTER 0x13 113*10465441SEvalZero #define RT_CAN_CMD_SET_BAUD 0x14 114*10465441SEvalZero #define RT_CAN_CMD_SET_MODE 0x15 115*10465441SEvalZero #define RT_CAN_CMD_SET_PRIV 0x16 116*10465441SEvalZero #define RT_CAN_CMD_GET_STATUS 0x17 117*10465441SEvalZero #define RT_CAN_CMD_SET_STATUS_IND 0x18 118*10465441SEvalZero 若干命令。 119*10465441SEvalZero 3、can口中断,要完接收,发送结束,以及错误中断。 120*10465441SEvalZero #define RT_CAN_EVENT_RX_IND 0x01 /* Rx indication */ 121*10465441SEvalZero #define RT_CAN_EVENT_TX_DONE 0x02 /* Tx complete */ 122*10465441SEvalZero #define RT_CAN_EVENT_TX_FAIL 0x03 /* Tx complete */ 123*10465441SEvalZero #define RT_CAN_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */ 124*10465441SEvalZero #define RT_CAN_EVENT_RXOF_IND 0x06 /* Rx overflow */ 125*10465441SEvalZero 中断产生后,调用rt_hw_can_isr(struct rt_can_device *can, int event) 126*10465441SEvalZero 进入相应的操作,其中接收发送中断的event,最低8位为上面的事件,16到24位为通信通道号。 127*10465441SEvalZero 一个作为一个例子,参见bsp/stm32f10x/driver下的bxcan.c 。 128*10465441SEvalZero三、CAN Driver的使用: 129*10465441SEvalZero 一个使用的例子,参数bsp/stm32f10x/applications下的canapp.c 130*10465441SEvalZero四、当前Can驱动,没有实现轮模式,采用中断模式,bxcan驱动工作在loopback模式下的时候不能读数据。 131*10465441SEvalZero 132*10465441SEvalZero五、当前Can驱动,在stm32f105上测试,暂无问题。 133