2016-03-30 25 views
1

我已經與兩個STM32F105vC(s)(其中有兩個CAN)的CAN1建立了CAN通信,我可以發送和接收CAN幀。STM32F1xx CAN2接收中斷不被調用

但是,當我改變我的代碼使用CAN2,它的工作原理,我的意思是它承認收到的CAN幀,但接收中斷根本沒有被調用

我認爲這是過濾配置,我改變了BankNumber多次(嘗試0,1,14,20),沒有運氣。

這是我的配置:

Initilizing:

init_HAL_CAN(CAN2); 

if(HAL_CAN_Receive_IT(canHandle, CAN_FIFO0) != HAL_OK) 
{ 
    /* Reception Error */ 
    Error_Handler(); 
} 

接收回調:

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle) 
{ 
    LED_DBG_TOGGLE(); 

    // other 
    // stuff 
    // here 
    //... 

    /* Receive */ 
    if(HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0) != HAL_OK) 
    { 
     /* Reception Error */ 
     Error_Handler(); 
    } 
} 

Init函數:

void init_HAL_CAN(CAN_TypeDef* _CANInstance) 
{ 
    CAN_FilterConfTypeDef sFilterConfig; 
    static CanTxMsgTypeDef TxMessage; 
    static CanRxMsgTypeDef RxMessage; 

    /*##-1- Configure the CAN peripheral #######################################*/ 
    canHandle->Instance = _CANInstance; 
    canHandle->pTxMsg = &TxMessage; 
    canHandle->pRxMsg = &RxMessage; 
    canHandle->Init.TTCM = DISABLE; //Non time trigger communication mode // 
    canHandle->Init.ABOM = DISABLE; //The software automatically Bus-off management  // 
    canHandle->Init.AWUM = DISABLE; //Sleep mode wake by software (clear CAN-> MCR SLEEP) (automatic wake-up mode)// 
    canHandle->Init.NART = DISABLE; //Disable automatic transfer message (non-automatic retransmission mode)// 
    canHandle->Init.RFLM = DISABLE; //The message is not locked, the new cover the old // 
    canHandle->Init.TXFP = DISABLE; // Priority is determined by the message identifier // 

    canHandle->Init.Mode = CAN_MODE_NORMAL; 
    canHandle->Init.SJW = CAN_SJW_1TQ; 
    canHandle->Init.BS1 = CAN_BS1_2TQ; 
    canHandle->Init.BS2 = CAN_BS2_1TQ; 
    canHandle->Init.Prescaler = 7; 

    if(HAL_CAN_Init(canHandle) != HAL_OK) 
    { 
     /* Initialization Error */ 
     Error_Handler(); 
     return false; 
    } 

    /*##-2- Configure the CAN Filter ###########################################*/ 
    CAN_FilterConfTypeDef sFilterConfig; 
    sFilterConfig.FilterNumber = 0; 
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; 
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; 
    sFilterConfig.FilterIdHigh = 0x0000; 
    sFilterConfig.FilterIdLow = 0x0000; 
    sFilterConfig.FilterMaskIdHigh = 0x0000; 
    sFilterConfig.FilterMaskIdLow = 0x0000; 
    sFilterConfig.FilterFIFOAssignment = 0; 
    sFilterConfig.FilterActivation = ENABLE; 
    sFilterConfig.BankNumber = 20; 

    if (HAL_CAN_ConfigFilter(canHandle, &sFilterConfig) != HAL_OK) 
    { 
     /* Filter configuration Error */ 
     Error_Handler(); 
     return false; 
    } 

} 

IRQHandler(置於stm32f1xx_it.c) :

void CAN2_RX0_IRQHandler(void) 
{ 
    HAL_CAN_IRQHandler(canHandle); 
} 

MspInit功能(放置在stm32f1xx_hal_msp.c):

void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan) 
{ 
    GPIO_InitTypeDef GPIO_InitStruct; 

    /*##-1- Enable peripherals and GPIO Clocks #################################*/ 
    /* CAN1 Periph clock enable */ 
    CANx1_CLK_ENABLE(); // Need to enable CAN1 clock too. 
    CANx2_CLK_ENABLE(); 
    /* Enable GPIO clock ****************************************/ 
    CANx2_GPIO_CLK_ENABLE(); 
    /* CAN2 needs no remapping *******/ 

    /*##-2- Configure peripheral GPIO ##########################################*/ 
    /* CAN1 TX GPIO pin configuration */ 
    GPIO_InitStruct.Pin = CANx2_TX_PIN; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 
    GPIO_InitStruct.Pull = GPIO_PULLUP; 

    HAL_GPIO_Init(CANx2_TX_GPIO_PORT, &GPIO_InitStruct); 

    /* CAN1 RX GPIO pin configuration */ 
    GPIO_InitStruct.Pin = CANx2_RX_PIN; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 
    GPIO_InitStruct.Pull = GPIO_PULLUP; 

    HAL_GPIO_Init(CANx2_RX_GPIO_PORT, &GPIO_InitStruct); 

    /*##-3- Configure the NVIC#################################################*/ 
    /* NVIC configuration for CAN2 Reception complete interrupt */ 

    HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 1, 0); 
    HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn); 

} 

我要再次提到,那下面的代碼與CAN1完美的作品(含改變CAN2到CAN1當然,等等)。

,很明顯的是,CAN控制器正常工作,因爲在傳輸CAN幀之外的其他板,接收確認(並且沒有得到任何傳輸錯誤或超時),這裏唯一的問題是接收中斷,爲什麼?

回答

3

我有類似的問題,是什麼幫助是參考手冊:

CAN2SB [5:0]:CAN2啓動銀行

這些位設置和由軟件清零。它們定義CAN2 接口(從站)的起始組,範圍爲0到27.

注意:當CAN2SB [5:0] = 28d時,可以使用CAN1的所有濾波器。

當CAN2SB [5:0]設置爲0時,沒有過濾器分配給CAN1 sFilterConfig.BankNumber = 20;

請更改 sFilterConfig.BankNumber = 20;

sFilterConfig.BankNumber = 0x2d;

+0

文檔說BankNumber應該在0到28之間,以使所有可CAN2,不CAN1過濾器,該值應爲0。我認爲0x2d只能以某種方式工作,因爲溢出,因爲它的計算結果爲45,遠遠超過了文檔中的建議值。 – JeLLyB0x3r

0

您必須通過hcan1執行所有過濾器的設置。即使是Can2。

在連接線 設備中,偏移量0x200至31C的寄存器僅存在於CAN1中。

...和偏移量0x200開始過濾器設置...

相關問題