|
楼主 |
发表于 2021-1-27 09:26:18
|
显示全部楼层
他这个是这种自动配置的形式,不支持的波特率有必要代入简单换算下,另外跟你的CAN主频配置也有关系。
- static int32_t CANx_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments, uint8_t x) {
- FDCAN_GlobalTypeDef *ptr_CAN;
- uint32_t cccr, sjw, prop_seg, phase_seg1, phase_seg2, pclk, brp, brp_max, tq_num;
- if (x >= CAN_CTRL_NUM) { return ARM_DRIVER_ERROR; }
- if ((select != ARM_CAN_BITRATE_NOMINAL) && (select != ARM_CAN_BITRATE_FD_DATA) ) { return ARM_CAN_INVALID_BITRATE_SELECT; }
- if (can_driver_powered[x] == 0U) { return ARM_DRIVER_ERROR; }
- prop_seg = (bit_segments & ARM_CAN_BIT_PROP_SEG_Msk ) >> ARM_CAN_BIT_PROP_SEG_Pos;
- phase_seg1 = (bit_segments & ARM_CAN_BIT_PHASE_SEG1_Msk) >> ARM_CAN_BIT_PHASE_SEG1_Pos;
- phase_seg2 = (bit_segments & ARM_CAN_BIT_PHASE_SEG2_Msk) >> ARM_CAN_BIT_PHASE_SEG2_Pos;
- sjw = (bit_segments & ARM_CAN_BIT_SJW_Msk ) >> ARM_CAN_BIT_SJW_Pos;
- if (select == ARM_CAN_BITRATE_NOMINAL) {
- if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) > 256U)) { return ARM_CAN_INVALID_BIT_PROP_SEG; }
- if (( phase_seg2 < 1U) || ( phase_seg2 > 128U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
- if (( sjw < 1U) || ( sjw > 128U)) { return ARM_CAN_INVALID_BIT_SJW; }
- brp_max = 512U;
- } else {
- if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) > 32U)) { return ARM_CAN_INVALID_BIT_PROP_SEG; }
- if (( phase_seg2 < 1U) || ( phase_seg2 > 16U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
- if (( sjw < 1U) || ( sjw > 8U)) { return ARM_CAN_INVALID_BIT_SJW; }
- brp_max = 32U;
- }
- tq_num = 1U + prop_seg + phase_seg1 + phase_seg2;
- pclk = CAN_GetClock (); if (pclk == 0U) { return ARM_DRIVER_ERROR; }
- brp = pclk / (tq_num * bitrate); if (brp > brp_max) { return ARM_CAN_INVALID_BITRATE; }
- if (pclk > (brp * tq_num * bitrate)) {
- if ((((pclk - (brp * tq_num * bitrate)) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
- } else if (pclk < (brp * tq_num * bitrate)) {
- if (((((brp * tq_num * bitrate) - pclk) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
- }
- ptr_CAN = ptr_regs_CANx[x];
- cccr = ptr_CAN->CCCR;
- if ((cccr & (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) != (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) {
- ptr_CAN->CCCR = FDCAN_CCCR_CCE | // Configuration change enable
- FDCAN_CCCR_INIT ; // Initialization
- while ((ptr_CAN->CCCR & FDCAN_CCCR_INIT) == 0U);
- }
- if (select == ARM_CAN_BITRATE_NOMINAL) {
- ptr_CAN->NBTP = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) | (phase_seg2 - 1U) | ((sjw - 1U) << 25);
- } else {
- ptr_CAN->DBTP = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) | ((phase_seg2 - 1U) << 4) | (sjw - 1U);
- }
- ptr_CAN->CCCR = cccr;
- return ARM_DRIVER_OK;
- }
复制代码
|
|