Advertisement
Guest User

STM32 HAL Driver

a guest
Dec 14th, 2017
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 KB | None | 0 0
  1. HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan)
  2. {
  3.   uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
  4.  
  5.   /* Check the parameters */
  6.   assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
  7.   assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
  8.   assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
  9.  
  10.   if((hcan->State == HAL_CAN_STATE_READY) || (hcan->State == HAL_CAN_STATE_BUSY_RX))
  11.   {
  12.     /* Process Locked */
  13.     __HAL_LOCK(hcan);
  14.    
  15.     /* Select one empty transmit mailbox */
  16.     if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
  17.     {
  18.       transmitmailbox = 0;
  19.     }
  20.     else if((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
  21.     {
  22.       transmitmailbox = 1;
  23.     }
  24.     else if((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
  25.     {
  26.       transmitmailbox = 2;
  27.     }
  28.  
  29.     if(transmitmailbox != CAN_TXSTATUS_NOMAILBOX)
  30.     {
  31.       /* Set up the Id */
  32.       hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ;
  33.       if(hcan->pTxMsg->IDE == CAN_ID_STD)
  34.       {
  35.         assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId));  
  36.         hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21) | \
  37.                                                   hcan->pTxMsg->RTR);
  38.       }
  39.       else
  40.       {
  41.         assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId));
  42.         hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3) | \
  43.                                                   hcan->pTxMsg->IDE | \
  44.                                                   hcan->pTxMsg->RTR);
  45.       }
  46.    
  47.       /* Set up the DLC */
  48.       hcan->pTxMsg->DLC &= (uint8_t)0x0000000F;
  49.       hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0;
  50.       hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC;
  51.  
  52.       /* Set up the data field */
  53.       hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3] << 24) |
  54.                                              ((uint32_t)hcan->pTxMsg->Data[2] << 16) |
  55.                                              ((uint32_t)hcan->pTxMsg->Data[1] << 8) |
  56.                                              ((uint32_t)hcan->pTxMsg->Data[0]));
  57.       hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7] << 24) |
  58.                                              ((uint32_t)hcan->pTxMsg->Data[6] << 16) |
  59.                                              ((uint32_t)hcan->pTxMsg->Data[5] << 8) |
  60.                                              ((uint32_t)hcan->pTxMsg->Data[4]));
  61.    
  62.       if(hcan->State == HAL_CAN_STATE_BUSY_RX)
  63.       {
  64.         /* Change CAN state */
  65.         hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
  66.       }
  67.       else
  68.       {
  69.         /* Change CAN state */
  70.         hcan->State = HAL_CAN_STATE_BUSY_TX;
  71.       }
  72.      
  73.       /* Set CAN error code to none */
  74.       hcan->ErrorCode = HAL_CAN_ERROR_NONE;
  75.      
  76.       /* Process Unlocked */
  77.       __HAL_UNLOCK(hcan);
  78.      
  79.       /* Enable interrupts: */
  80.       /*  - Enable Error warning Interrupt */
  81.       /*  - Enable Error passive Interrupt */
  82.       /*  - Enable Bus-off Interrupt */
  83.       /*  - Enable Last error code Interrupt */
  84.       /*  - Enable Error Interrupt */
  85.       /*  - Enable Transmit mailbox empty Interrupt */
  86.       __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG |
  87.                                 CAN_IT_EPV |
  88.                                 CAN_IT_BOF |
  89.                                 CAN_IT_LEC |
  90.                                 CAN_IT_ERR |
  91.                                 CAN_IT_TME  );
  92.      
  93.       /* Request transmission */
  94.       hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ;
  95.     }
  96.   }
  97.   else
  98.   {
  99.     return HAL_BUSY;
  100.   }
  101.  
  102.   return HAL_OK;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement