| 255 | } |
| 256 | |
| 257 | unsigned char CAN_SetBps(CAN_TypeDef* CANx, Ls1c_CanBPS_t Bps) |
| 258 | { |
| 259 | unsigned char InitStatus = CAN_InitStatus_Failed; |
| 260 | unsigned char CAN_Prescaler, CAN_BS1, CAN_BS2, CAN_SJW; |
| 261 | CAN_SJW = CAN_SJW_1tq; |
| 262 | /* 进入复位模式 */ |
| 263 | InitStatus = set_reset_mode(CANx); |
| 264 | if( InitStatus == CAN_InitStatus_Failed) |
| 265 | return CAN_InitStatus_Failed; |
| 266 | |
| 267 | /* BaudRate= f(APB)/((1+BS1+BS2)(SJW*2*Prescaler))=126000000/[(1+7+2)*1*2*63]=100000=100K*/ |
| 268 | /* BPS PRE BS1 BS2 最低40K |
| 269 | 1M 9 4 2 |
| 270 | 800K 8 7 2 |
| 271 | 500K 9 11 2 |
| 272 | 250K 36 4 2 |
| 273 | 125K 36 11 2 |
| 274 | 100K 63 7 2 |
| 275 | 50K 63 16 3` |
| 276 | 40K 63 16 8 |
| 277 | */ |
| 278 | switch (Bps) |
| 279 | { |
| 280 | case LS1C_CAN1MBaud: |
| 281 | CAN_Prescaler = 9; |
| 282 | CAN_BS1 = CAN_BS1_4tq; |
| 283 | CAN_BS2 = CAN_BS2_2tq; |
| 284 | break; |
| 285 | case LS1C_CAN800kBaud: |
| 286 | CAN_Prescaler = 8; |
| 287 | CAN_BS1 = CAN_BS1_7tq; |
| 288 | CAN_BS2 = CAN_BS2_2tq; |
| 289 | break; |
| 290 | case LS1C_CAN500kBaud: |
| 291 | CAN_Prescaler = 9; |
| 292 | CAN_BS1 = CAN_BS1_11tq; |
| 293 | CAN_BS2 = CAN_BS2_2tq; |
| 294 | break; |
| 295 | case LS1C_CAN250kBaud: |
| 296 | CAN_Prescaler = 36; |
| 297 | CAN_BS1 = CAN_BS1_4tq; |
| 298 | CAN_BS2 = CAN_BS2_2tq; |
| 299 | break; |
| 300 | case LS1C_CAN125kBaud: |
| 301 | CAN_Prescaler = 36; |
| 302 | CAN_BS1 = CAN_BS1_11tq; |
| 303 | CAN_BS2 = CAN_BS2_2tq; |
| 304 | break; |
| 305 | case LS1C_CAN100kBaud: |
| 306 | CAN_Prescaler = 63; |
| 307 | CAN_BS1 = CAN_BS1_7tq; |
| 308 | CAN_BS2 = CAN_BS2_2tq; |
| 309 | break; |
| 310 | case LS1C_CAN50kBaud: |
| 311 | CAN_Prescaler = 63; |
| 312 | CAN_BS1 = CAN_BS1_16tq; |
| 313 | CAN_BS2 = CAN_BS2_3tq; |
| 314 | break; |
no test coverage detected