2016-03-30 19 views
1

Ich habe erfolgreich CAN-Kommunikation mit CAN1 von zwei STM32F105vC (s) eingerichtet (welche zwei CANs hat), und ich kann CAN-Frames senden und empfangen.STM32F1xx CAN2-Empfangs-Interrupt wird nicht aufgerufen

Aber wenn ich meinen Code für die Verwendung von CAN2 ändern, funktioniert es, ich meine, es bestätigt die empfangenen CAN-Frames, aber die Empfangsunterbrechung wird überhaupt nicht aufgerufen.

Ich dachte, es ist Filter-Konfiguration, änderte ich die BankNumber Multiplezeiten (versuchte 0, 1, 14, 20), kein Glück.

Hier ist meine Konfigurationen:

Initilizing:

init_HAL_CAN(CAN2); 

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

Erhalten Rückruf:

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 Funktion:

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 (in stm32f1xx_it.c platziert) :

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

MspInit Funktion (in stm32f1xx_hal_msp.c platziert):

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); 

} 

Ich soll wieder erwähnen, dass Codes folgende arbeitet perfekt mit CAN1 (natürlich mit CAN2 zu CAN1 ändern, usw.).

Und es ist klar, dass der CAN-Controller arbeitet, weil das andere Brett, das CAN-Frames sendet, die empfängt anerkennt (und bekommt keine Übertragungsfehler oder Timeout), hier das einzige Problem ist Interrupts Erhalten, Warum?

Antwort

3

hatte ich ähnliches Problem und welche Hilfe war Referenzhandbuch:

CAN2SB [5: 0]: CAN2 durch Software Bank

Diese Bits werden gesetzt und gelöscht starten. Sie definieren die Startbank für die CAN2 Schnittstelle (Slave) im Bereich von 0 bis 27

Hinweis: Bei CAN2SB [5: 0] = 28d, alle Filter zu CAN1 verwendet werden kann.

Wenn CAN2SB [5: 0] auf 0 gesetzt ist, sind CAN1 keine Filter zugewiesen sFilterConfig.BankNumber = 20; Bitte

ändern sFilterConfig.BankNumber = 20;

zu

sFilterConfig.BankNumber = 0x2d;

+0

Docs sagen, dass Banknummer zwischen 0 und 28 sein sollte, alle Filter für CAN2 zu ermöglichen, nicht CAN1, sollte der Wert 0 sein. Ich denke, dass 0x2d nur irgendwie wegen Überlauf funktioniert, weil das zu 45, weit hinter den vorgeschlagenen Werten in den Dokumenten auswertet. – JeLLyB0x3r

0

Sie Einstellungen aller Filter durch hcan1 durchführen müssen. Sogar für Can2.

in Connectivity Leitung Geräten werden die Register von Offset 0x200 bis 31C sind nur in CAN1.

... und auf Offset 0x200 beginnt Filtereinstellungen ...