xref: /nrf52832-nimble/rt-thread/components/drivers/can/readme-zh.txt (revision 104654410c56c573564690304ae786df310c91fc)
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.c128*10465441SEvalZero三、CAN Driver的使用:
129*10465441SEvalZero	一个使用的例子,参数bsp/stm32f10x/applications下的canapp.c
130*10465441SEvalZero四、当前Can驱动,没有实现轮模式,采用中断模式,bxcan驱动工作在loopback模式下的时候不能读数据。
131*10465441SEvalZero
132*10465441SEvalZero五、当前Can驱动,在stm32f105上测试,暂无问题。
133