1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:  (Pelican Mode)
7  * Date           Author       Notes
8  * 2018-01-06     sundm75       first version
9  */
10 
11 #ifndef __OPENLOONGSON_CAN_H
12 #define __OPENLOONGSON_CAN_H
13 
14 #define CAN0               ( (CAN_TypeDef* )LS1C_REG_BASE_CAN0)
15 #define CAN1               ( (CAN_TypeDef* )LS1C_REG_BASE_CAN1)
16 
17 #define CAN_InitStatus_Failed              ((unsigned char)0x00) /*!< CAN initialization failed */
18 #define CAN_InitStatus_Success             ((unsigned char)0x01) /*!< CAN initialization OK */
19 
20 #define CAN_SJW_1tq                 ((unsigned char)0x00)  /*!< 1 time quantum */
21 #define CAN_SJW_2tq                 ((unsigned char)0x01)  /*!< 2 time quantum */
22 #define CAN_SJW_3tq                 ((unsigned char)0x02)  /*!< 3 time quantum */
23 #define CAN_SJW_4tq                 ((unsigned char)0x03)  /*!< 4 time quantum */
24 
25 #define CAN_BS1_1tq                 ((unsigned char)0x00)  /*!< 1 time quantum */
26 #define CAN_BS1_2tq                 ((unsigned char)0x01)  /*!< 2 time quantum */
27 #define CAN_BS1_3tq                 ((unsigned char)0x02)  /*!< 3 time quantum */
28 #define CAN_BS1_4tq                 ((unsigned char)0x03)  /*!< 4 time quantum */
29 #define CAN_BS1_5tq                 ((unsigned char)0x04)  /*!< 5 time quantum */
30 #define CAN_BS1_6tq                 ((unsigned char)0x05)  /*!< 6 time quantum */
31 #define CAN_BS1_7tq                 ((unsigned char)0x06)  /*!< 7 time quantum */
32 #define CAN_BS1_8tq                 ((unsigned char)0x07)  /*!< 8 time quantum */
33 #define CAN_BS1_9tq                 ((unsigned char)0x08)  /*!< 9 time quantum */
34 #define CAN_BS1_10tq                ((unsigned char)0x09)  /*!< 10 time quantum */
35 #define CAN_BS1_11tq                ((unsigned char)0x0A)  /*!< 11 time quantum */
36 #define CAN_BS1_12tq                ((unsigned char)0x0B)  /*!< 12 time quantum */
37 #define CAN_BS1_13tq                ((unsigned char)0x0C)  /*!< 13 time quantum */
38 #define CAN_BS1_14tq                ((unsigned char)0x0D)  /*!< 14 time quantum */
39 #define CAN_BS1_15tq                ((unsigned char)0x0E)  /*!< 15 time quantum */
40 #define CAN_BS1_16tq                ((unsigned char)0x0F)  /*!< 16 time quantum */
41 
42 #define CAN_BS2_1tq                 ((unsigned char)0x00)  /*!< 1 time quantum */
43 #define CAN_BS2_2tq                 ((unsigned char)0x01)  /*!< 2 time quantum */
44 #define CAN_BS2_3tq                 ((unsigned char)0x02)  /*!< 3 time quantum */
45 #define CAN_BS2_4tq                 ((unsigned char)0x03)  /*!< 4 time quantum */
46 #define CAN_BS2_5tq                 ((unsigned char)0x04)  /*!< 5 time quantum */
47 #define CAN_BS2_6tq                 ((unsigned char)0x05)  /*!< 6 time quantum */
48 #define CAN_BS2_7tq                 ((unsigned char)0x06)  /*!< 7 time quantum */
49 #define CAN_BS2_8tq                 ((unsigned char)0x07)  /*!< 8 time quantum */
50 
51 #define CAN_Id_Standard           0
52 #define CAN_Id_Extended           1
53 #define CAN_RTR_DATA               0
54 #define CAN_RTR_Remote            1
55 
56 #define CAN_MODE_NORMAL              0
57 #define CAN_MODE_LISTEN               1
58 #define CAN_MODE_LOOPBACK            2
59 #define CAN_MODE_LOOPBACKANLISTEN     3
60 
61 /*!< CAN 控制状态寄存器 */
62 /************************** CAN_MOD 寄存器位定义*******************************/
63 #define CAN_Mode_RM                 ((unsigned char)0x01)  /*!< 复位模式 */
64 #define CAN_Mode_LOM                ((unsigned char)0x02)  /*!< 只听模式 1:只听  0:正常  */
65 #define CAN_Mode_STM                ((unsigned char)0x04)  /*!< 正常工作模式1:自检测  0:正常  */
66 #define CAN_Mode_AFM                ((unsigned char)0x08)  /*!< 单/双滤波模式 1:单 0: 双*/
67 #define CAN_Mode_SM                 ((unsigned char)0x10)  /*!< 睡眠模式1: 睡眠 0: 唤醒 */
68 
69 /************************** CAN_CMR 寄存器位定义*******************************/
70  #define  CAN_CMR_TR                         ((unsigned char)0x01)         /*!< 发送请求 1: 当前信息被发送  0: 空 */
71  #define  CAN_CMR_AT                         ((unsigned char)0x02)         /*!< 中止发送 1: 等待发送的信息取消  0: 空缺  */
72  #define  CAN_CMR_RRB                        ((unsigned char)0x04)         /*!< 释放接收缓冲器  1:释放  0: 无动作 */
73  #define  CAN_CMR_CDO                        ((unsigned char)0x08)         /*!< 清除数据溢出  1:清除  0: 无动作    */
74 //#define  CAN_CMR_GTS                        ((unsigned char)0x10)        /*!< STD模式< 睡眠: 1:进入睡眠  0: 唤醒  */
75  #define  CAN_CMR_SRR                        ((unsigned char)0x10)         /*!< 自接收请求  1:  0:   */
76  #define  CAN_CMR_EFF                        ((unsigned char)0x80)         /*!< 扩展模式 1:扩展帧 0: 标准帧  */
77 
78 /************************** CAN_SR 寄存器位定义********************************/
79  #define  CAN_SR_BBS                         ((unsigned char)0x01)         /*!< 接收缓存器状态1: 满  0: 空 */
80  #define  CAN_SR_DOS                         ((unsigned char)0x02)         /*!< 数据溢出状态 1: 溢出  0: 空缺  */
81  #define  CAN_SR_TBS                         ((unsigned char)0x04)         /*!< 发送缓存器状态1: 释放  0: 锁定 */
82  #define  CAN_SR_TCS                         ((unsigned char)0x08)         /*!< 发送完毕状态1: 完毕  0: 未完毕    */
83  #define  CAN_SR_RS                          ((unsigned char)0x10)         /*!< 接收状态1: 接收  0: 空闲  */
84  #define  CAN_SR_TS                          ((unsigned char)0x20)         /*!< 发送状态1:  发送 0:  空闲*/
85  #define  CAN_SR_ES                          ((unsigned char)0x40)         /*!< 出错状态1:出错 0: 正常 */
86  #define  CAN_SR_BS                          ((unsigned char)0x80)         /*!< 总线状态1: 关闭  0: 开启  */
87 
88 /************************** CAN_IR 中断寄存器位定义****************************/
89  #define  CAN_IR_RI                          ((unsigned char)0x01)         /*!< 接收中断 */
90  #define  CAN_IR_TI                          ((unsigned char)0x02)         /*!< 发送中断 */
91  #define  CAN_IR_EI                          ((unsigned char)0x04)         /*!< 错误中断 */
92  #define  CAN_IR_DOI                         ((unsigned char)0x08)         /*!< 数据溢出中断  */
93  #define  CAN_IR_WUI                         ((unsigned char)0x10)         /*!< 唤醒中断 */
94  #define  CAN_IR_EPI                         ((unsigned char)0x20)         /*!< 错误消极中断 */
95  #define  CAN_IR_ALI                         ((unsigned char)0x40)         /*!< 仲裁丢失中断 */
96  #define  CAN_IR_BEI                         ((unsigned char)0x80)         /*!< 总线错误中断  */
97 
98 /************************* CAN_IER 中断使能寄存器位定义************************/
99  #define  CAN_IER_RIE                         ((unsigned char)0x01)        /*!< 接收中断使能 */
100  #define  CAN_IER_TIE                         ((unsigned char)0x02)        /*!< 发送中断使能 */
101  #define  CAN_IER_EIE                         ((unsigned char)0x04)        /*!< 错误中断使能 */
102  #define  CAN_IER_DOIE                        ((unsigned char)0x08)        /*!< 数据溢出中断使能  */
103  #define  CAN_IER_WUIE                        ((unsigned char)0x10)        /*!< 唤醒中断使能 */
104  #define  CAN_IER_EPIE                        ((unsigned char)0x20)        /*!< 错误消极中断使能 */
105  #define  CAN_IER_ALIE                        ((unsigned char)0x40)        /*!< 仲裁丢失中断使能 */
106  #define  CAN_IER_BEIE                        ((unsigned char)0x80)        /*!< 总线错误中断使能  */
107 
108 typedef enum
109 {
110     LS1C_CAN1MBaud=0,    // 1 MBit/sec
111     LS1C_CAN800kBaud,    // 800 kBit/sec
112     LS1C_CAN500kBaud,    // 500 kBit/sec
113     LS1C_CAN250kBaud,    // 250 kBit/sec
114     LS1C_CAN125kBaud,    // 125 kBit/sec
115     LS1C_CAN100kBaud,    // 100 kBit/sec
116     LS1C_CAN50kBaud,     // 50 kBit/sec
117     LS1C_CAN40kBaud,     // 40 kBit/sec
118 }Ls1c_CanBPS_t;
119 
120 typedef struct
121 {
122    unsigned char MOD;
123    unsigned char CMR;
124    unsigned char SR;
125    unsigned char IR;
126    unsigned char IER;
127    unsigned char reserved0;
128    unsigned char BTR0;
129    unsigned char BTR1;
130    unsigned char OCR;
131    unsigned char reserved[2];
132    unsigned char ALC;
133    unsigned char ECC ;
134    unsigned char EMLR;
135    unsigned char RXERR;
136    unsigned char TXERR;
137    unsigned char IDE_RTR_DLC;
138    unsigned char ID[4];
139    unsigned char BUF[8];
140    unsigned char RMCR;
141    unsigned char CDR;
142 } CAN_TypeDef;
143 
144 typedef struct
145 {
146   unsigned char  CAN_Prescaler;    /* 波特率分频系数1 to 31. */
147   unsigned char  CAN_Mode;         /*0x10:睡眠0x08:单,双滤波 0x40:正常工作0x20:只听 0x01:复位*/
148   unsigned char  CAN_SJW;          /*同步跳转宽度 */
149   unsigned char  CAN_BS1;          /*时间段1计数值*/
150   unsigned char  CAN_BS2;          /*时间段2计数值*/
151 
152 } CAN_InitTypeDef;
153 
154 typedef struct
155 {
156   unsigned char  IDE;        /*0: 使用标准标识符1: 使用扩展标识符*/
157   unsigned char  RTR;    /*0: 数据帧     1: 远程帧*/
158   unsigned char  MODE;        /* 0- 双滤波器模式;1-单滤波器模式*/
159   unsigned long  First_Data;    /*双滤波器模式下信息第一个数据字节*/
160   unsigned long  Data_Mask;    /*双滤波器模式下信息第一个数据字节屏蔽*/
161   unsigned long  ID;        /*验收代码*/
162   /*
163  双滤波器-  扩展帧: 2个滤波器的前16位,分别放在ID 的前16位和 ID的后16位.
164  双滤波器-  标准帧: 2个滤波器的11位,分别放在ID 的前16位和 ID的后16位,第1个滤波器同时使用First_Data和Data_Mask
165  单滤波器-  扩展帧: 使用29位, 放在ID 的后29位.
166  单滤波器-  标准帧: 使用11位, 放在ID 的后11位.
167   */
168   unsigned long  IDMASK;    /*验收屏蔽*/
169 } CAN_FilterInitTypeDef;
170 
171 typedef struct
172 {
173   unsigned long StdId;  /* 11位ID*/
174   unsigned long ExtId;  /*29位ID**/
175   unsigned char IDE;    /*IDE: 标识符选择
176                                      该位决定发送邮箱中报文使用的标识符类型
177                                      0: 使用标准标识符
178                                      1: 使用扩展标识符*/
179   unsigned char RTR;     /*远程发送请求
180                                        0: 数据帧
181                                        1: 远程帧*/
182   unsigned char DLC;     /*数据帧长度*/
183   unsigned char Data[8]; /*8字节数据*/
184 } CanRxMsg;
185 
186 typedef struct
187 {
188   unsigned long StdId;  /* 11位ID*/
189   unsigned long ExtId;  /*29位ID**/
190   unsigned char IDE;    /*IDE: 标识符选择
191                                      该位决定发送邮箱中报文使用的标识符类型
192                                      0: 使用标准标识符
193                                      1: 使用扩展标识符*/
194   unsigned char RTR;     /*远程发送请求
195                                        0: 数据帧
196                                        1: 远程帧*/
197   unsigned char DLC;     /*数据帧长度*/
198   unsigned char Data[8]; /*8字节数据*/
199 } CanTxMsg;
200 
201 unsigned char CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct);
202 unsigned char CAN_SetBps(CAN_TypeDef* CANx, Ls1c_CanBPS_t  Bps);
203 unsigned char CAN_SetMode(CAN_TypeDef* CANx, unsigned char  mode);
204 void CAN_FilterInit(CAN_TypeDef* CANx,  CAN_FilterInitTypeDef* CAN_FilterInitStruct);
205 unsigned char CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
206 void CAN_Receive(CAN_TypeDef* CANx,  CanRxMsg* RxMessage);
207 
208 unsigned char  set_reset_mode(CAN_TypeDef* CANx);
209 unsigned char  set_start(CAN_TypeDef* CANx);
210 
211 #endif
212 
213