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