CAN bus bringup (everything works except PWM output)
This commit is contained in:
		@ -111,6 +111,9 @@ int main(void)
 | 
			
		||||
  MX_NVIC_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  
 | 
			
		||||
  FDCAN_HandleTypeDef* hMainCAN = &hfdcan2;
 | 
			
		||||
  //FDCAN_HandleTypeDef* hPeriCAN = &hfdcan1;
 | 
			
		||||
 | 
			
		||||
  if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
@ -133,11 +136,11 @@ int main(void)
 | 
			
		||||
  txHeader.TxFrameType = FDCAN_DATA_FRAME;
 | 
			
		||||
  txHeader.DataLength = 8;
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
 | 
			
		||||
  if (HAL_FDCAN_ActivateNotification(hMainCAN, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT,
 | 
			
		||||
    FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK)
 | 
			
		||||
  if (HAL_FDCAN_ConfigGlobalFilter(hMainCAN, FDCAN_REJECT, FDCAN_REJECT,
 | 
			
		||||
                                    FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  FDCAN_FilterTypeDef filter;
 | 
			
		||||
@ -148,12 +151,22 @@ int main(void)
 | 
			
		||||
  filter.FilterID1 = 0x0DD;
 | 
			
		||||
  filter.FilterID2 = 0x7FE; // Match 0x0DC and 0x0DD
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &filter) != HAL_OK)
 | 
			
		||||
  if (HAL_FDCAN_ConfigFilter(hMainCAN, &filter) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
 | 
			
		||||
  if (HAL_FDCAN_Start(hMainCAN) != HAL_OK)
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
 | 
			
		||||
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
  /* Infinite loop */
 | 
			
		||||
@ -174,6 +187,9 @@ int main(void)
 | 
			
		||||
 | 
			
		||||
      can_pkt_t* pktinfo = &(CAN_SIGNAL_MAP[pi]);
 | 
			
		||||
 | 
			
		||||
      if (pktinfo->num_signals < 0)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      if (mscounter % pktinfo->period == 0) {
 | 
			
		||||
 | 
			
		||||
        txHeader.Identifier = pktinfo->can_id;
 | 
			
		||||
@ -206,7 +222,7 @@ int main(void)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, (uint8_t*) &txData) != HAL_OK)
 | 
			
		||||
        if (HAL_FDCAN_AddMessageToTxFifoQ(hMainCAN, &txHeader, (uint8_t*) &txData) != HAL_OK)
 | 
			
		||||
          Error_Handler();
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
@ -312,12 +328,15 @@ void SetCCR(TIM_TypeDef* Instance, unsigned int ch, uint8_t dc) {
 | 
			
		||||
 | 
			
		||||
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *handle, uint32_t RxFifo0ITs)
 | 
			
		||||
{
 | 
			
		||||
  if (handle != &hfdcan1 || (RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) == RESET)
 | 
			
		||||
    return;
 | 
			
		||||
  FDCAN_HandleTypeDef* hMainCAN = &hfdcan2;
 | 
			
		||||
  //FDCAN_HandleTypeDef* hPeriCAN = &hfdcan1;
 | 
			
		||||
 | 
			
		||||
  if (handle != hMainCAN || (RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) == RESET)
 | 
			
		||||
    return; // TODO: handle Peripheral CAN
 | 
			
		||||
  
 | 
			
		||||
  static FDCAN_RxHeaderTypeDef header;
 | 
			
		||||
  static uint8_t data[8];
 | 
			
		||||
  if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &header, data) != HAL_OK)
 | 
			
		||||
  if (HAL_FDCAN_GetRxMessage(hMainCAN, FDCAN_RX_FIFO0, &header, data) != HAL_OK)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (header.FDFormat != FDCAN_CLASSIC_CAN ||
 | 
			
		||||
@ -326,26 +345,39 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *handle, uint32_t RxFifo0ITs)
 | 
			
		||||
    return;
 | 
			
		||||
  
 | 
			
		||||
  switch (header.Identifier) {
 | 
			
		||||
 | 
			
		||||
    case CAN_PWM_DC_ID:
 | 
			
		||||
 | 
			
		||||
      uint8_t* dcs = data;
 | 
			
		||||
      for (int i = 0; i < header.DataLength; i++) {
 | 
			
		||||
 | 
			
		||||
        TIM_HandleTypeDef* htim = PWM_TIM_MAP[PWM_CH_MAP[i].tim];
 | 
			
		||||
        SetCCR(htim->Instance, PWM_CH_MAP[i].ch, dcs[i]);
 | 
			
		||||
        // TODO: This does not work, apparently they don't start in RESET
 | 
			
		||||
        // Maybe have our own init bool array instead
 | 
			
		||||
        // Manually enabling doesn't seem to work either
 | 
			
		||||
        if (htim->ChannelState[PWM_CH_MAP[i].ch] == HAL_TIM_CHANNEL_STATE_RESET)
 | 
			
		||||
          HAL_TIM_PWM_Start(htim, PWM_CH_MAP[i].ch << 2);
 | 
			
		||||
        // MAYBE: Stop Timer when DC == 0 on all channels?
 | 
			
		||||
        // HAL_TIM_PWM_Stop(htim, channel);
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CAN_PWM_CONF_ID:
 | 
			
		||||
 | 
			
		||||
      uint16_t* freqs = (uint16_t*) data;
 | 
			
		||||
      for (int i = 0; i < (header.DataLength/2); i++) {
 | 
			
		||||
 | 
			
		||||
        uint32_t prescaler = (TIM_BASE_FREQ / (255UL * freqs[i])); // cast?
 | 
			
		||||
        PWM_TIM_MAP[i]->Instance->PSC = prescaler;
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user