⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_can.lst

📁 编译环境是 iar EWARM ,STM32 下的UCOSII
💻 LST
📖 第 1 页 / 共 4 页
字号:
    428            else if ((CAN->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
    429            {
    430              TransmitMailbox = 2;
    431            }
    432            else
    433            {
    434              TransmitMailbox = CAN_NO_MB;
    435            }
    436          
    437            if (TransmitMailbox != CAN_NO_MB)
    438            {
    439              /* Set up the Id */
    440              CAN->sTxMailBox[TransmitMailbox].TIR &= CAN_TMIDxR_TXRQ;
    441              if (TxMessage->IDE == CAN_ID_STD)
    442              {
    443                TxMessage->StdId &= (u32)0x000007FF;
    444                TxMessage->StdId = TxMessage->StdId << 21;
    445                
    446                CAN->sTxMailBox[TransmitMailbox].TIR |= (TxMessage->StdId | TxMessage->IDE |
    447                                                         TxMessage->RTR);
    448              }
    449              else
    450              {
    451                TxMessage->ExtId &= (u32)0x1FFFFFFF;
    452                TxMessage->ExtId <<= 3;
    453          
    454                CAN->sTxMailBox[TransmitMailbox].TIR |= (TxMessage->ExtId | TxMessage->IDE | 
    455                                                         TxMessage->RTR);
    456              }
    457              
    458              /* Set up the DLC */
    459              TxMessage->DLC &= (u8)0x0000000F;
    460              CAN->sTxMailBox[TransmitMailbox].TDTR &= (u32)0xFFFFFFF0;
    461              CAN->sTxMailBox[TransmitMailbox].TDTR |= TxMessage->DLC;
    462          
    463              /* Set up the data field */
    464              CAN->sTxMailBox[TransmitMailbox].TDLR = (((u32)TxMessage->Data[3] << 24) | 
    465                                                       ((u32)TxMessage->Data[2] << 16) |
    466                                                       ((u32)TxMessage->Data[1] << 8) | 
    467                                                       ((u32)TxMessage->Data[0]));
    468              CAN->sTxMailBox[TransmitMailbox].TDHR = (((u32)TxMessage->Data[7] << 24) | 
    469                                                       ((u32)TxMessage->Data[6] << 16) |
    470                                                       ((u32)TxMessage->Data[5] << 8) |
    471                                                       ((u32)TxMessage->Data[4]));
    472          
    473              /* Request transmission */
    474              CAN->sTxMailBox[TransmitMailbox].TIR |= CAN_TMIDxR_TXRQ;
    475            }
    476          
    477            return TransmitMailbox;
    478          }
    479          
    480          /*******************************************************************************
    481          * Function Name  : CAN_TransmitStatus
    482          * Description    : Checks the transmission of a message.
    483          * Input          : TransmitMailbox: the number of the mailbox that is used for
    484          *                  transmission.
    485          * Output         : None.
    486          * Return         : CANTXOK if the CAN driver transmits the message, CANTXFAILED
    487          *                  in an other case.
    488          *******************************************************************************/
    489          u8 CAN_TransmitStatus(u8 TransmitMailbox)
    490          {
    491            /* RQCP, TXOK and TME bits */
    492            u8 State = 0;
    493          
    494            /* Check the parameters */
    495            assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox));
    496          
    497            switch (TransmitMailbox)
    498            {
    499              case (0): State |= (u8)((CAN->TSR & CAN_TSR_RQCP0) << 2);
    500                State |= (u8)((CAN->TSR & CAN_TSR_TXOK0) >> 0);
    501                State |= (u8)((CAN->TSR & CAN_TSR_TME0) >> 26);
    502                break;
    503              case (1): State |= (u8)((CAN->TSR & CAN_TSR_RQCP1) >> 6);
    504                State |= (u8)((CAN->TSR & CAN_TSR_TXOK1) >> 8);
    505                State |= (u8)((CAN->TSR & CAN_TSR_TME1) >> 27);
    506                break;
    507              case (2): State |= (u8)((CAN->TSR & CAN_TSR_RQCP2) >> 14);
    508                State |= (u8)((CAN->TSR & CAN_TSR_TXOK2) >> 16);
    509                State |= (u8)((CAN->TSR & CAN_TSR_TME2) >> 28);
    510                break;
    511              default:
    512                State = CANTXFAILED;
    513                break;
    514            }
    515          
    516            switch (State)
    517            {
    518                /* transmit pending  */
    519              case (0x0): State = CANTXPENDING;
    520                break;
    521                /* transmit failed  */
    522              case (0x5): State = CANTXFAILED;
    523                break;
    524                /* transmit succedeed  */
    525              case (0x7): State = CANTXOK;
    526                break;
    527              default:
    528                State = CANTXFAILED;
    529                break;
    530            }
    531          
    532            return State;
    533          }
    534          
    535          /*******************************************************************************
    536          * Function Name  : CAN_CancelTransmit
    537          * Description    : Cancels a transmit request.
    538          * Input          : Mailbox number.
    539          * Output         : None.
    540          * Return         : None.
    541          *******************************************************************************/
    542          void CAN_CancelTransmit(u8 Mailbox)
    543          {
    544            /* Check the parameters */
    545            assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox));
    546          
    547            /* abort transmission */
    548            switch (Mailbox)
    549            {
    550              case (0): CAN->TSR |= CAN_TSR_ABRQ0;
    551                break;
    552              case (1): CAN->TSR |= CAN_TSR_ABRQ1;
    553                break;
    554              case (2): CAN->TSR |= CAN_TSR_ABRQ2;
    555                break;
    556              default:
    557                break;
    558            }
    559          }
    560          
    561          /*******************************************************************************
    562          * Function Name  : CAN_FIFORelease
    563          * Description    : Releases a FIFO.
    564          * Input          : FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1.
    565          * Output         : None.
    566          * Return         : None.
    567          *******************************************************************************/
    568          void CAN_FIFORelease(u8 FIFONumber)
    569          {
    570            /* Check the parameters */
    571            assert_param(IS_CAN_FIFO(FIFONumber));
    572          
    573            /* Release FIFO0 */
    574            if (FIFONumber == CAN_FIFO0)
    575            {
    576              CAN->RF0R = CAN_RF0R_RFOM0;
    577            }
    578            /* Release FIFO1 */
    579            else /* FIFONumber == CAN_FIFO1 */
    580            {
    581              CAN->RF1R = CAN_RF1R_RFOM1;
    582            }
    583          }
    584          
    585          /*******************************************************************************
    586          * Function Name  : CAN_MessagePending
    587          * Description    : Returns the number of pending messages.
    588          * Input          : FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
    589          * Output         : None.
    590          * Return         : NbMessage which is the number of pending message.
    591          *******************************************************************************/
    592          u8 CAN_MessagePending(u8 FIFONumber)
    593          {
    594            u8 MessagePending=0;
    595          
    596            /* Check the parameters */
    597            assert_param(IS_CAN_FIFO(FIFONumber));
    598          
    599            if (FIFONumber == CAN_FIFO0)
    600            {
    601              MessagePending = (u8)(CAN->RF0R&(u32)0x03);
    602            }
    603            else if (FIFONumber == CAN_FIFO1)
    604            {
    605              MessagePending = (u8)(CAN->RF1R&(u32)0x03);
    606            }
    607            else
    608            {
    609              MessagePending = 0;
    610            }
    611            return MessagePending;
    612          }
    613          
    614          /*******************************************************************************
    615          * Function Name  : CAN_Receive
    616          * Description    : Receives a message.
    617          * Input          : FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
    618          * Output         : RxMessage: pointer to a structure which contains CAN Id,
    619          *                  CAN DLC, CAN datas and FMI number.
    620          * Return         : None.
    621          *******************************************************************************/
    622          void CAN_Receive(u8 FIFONumber, CanRxMsg* RxMessage)
    623          {
    624            /* Check the parameters */
    625            assert_param(IS_CAN_FIFO(FIFONumber));
    626          
    627            /* Get the Id */
    628            RxMessage->IDE = (u8)0x04 & CAN->sFIFOMailBox[FIFONumber].RIR;
    629            if (RxMessage->IDE == CAN_ID_STD)
    630            {
    631              RxMessage->StdId = (u32)0x000007FF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 21);
    632            }
    633            else
    634            {
    635              RxMessage->ExtId = (u32)0x1FFFFFFF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 3);
    636            }
    637            
    638            RxMessage->RTR = (u8)0x02 & CAN->sFIFOMailBox[FIFONumber].RIR;
    639          
    640            /* Get the DLC */
    641            RxMessage->DLC = (u8)0x0F & CAN->sFIFOMailBox[FIFONumber].RDTR;
    642          
    643            /* Get the FMI */
    644            RxMessage->FMI = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDTR >> 8);
    645          
    646            /* Get the data field */
    647            RxMessage->Data[0] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDLR;
    648            RxMessage->Data[1] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 8);
    649            RxMessage->Data[2] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 16);
    650            RxMessage->Data[3] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 24);
    651          
    652            RxMessage->Data[4] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDHR;
    653            RxMessage->Data[5] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 8);
    654            RxMessage->Data[6] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 16);
    655            RxMessage->Data[7] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 24);
    656          
    657            /* Release the FIFO */
    658            CAN_FIFORelease(FIFONumber);
    659          }
    660          
    661          /*******************************************************************************
    662          * Function Name  : CAN_Sleep
    663          * Description    : Enters the low power mode.
    664          * Input          : None.
    665          * Output         : None.
    666          * Return         : CANSLEEPOK if sleep entered, CANSLEEPFAILED in an other case.
    667          *******************************************************************************/
    668          u8 CAN_Sleep(void)
    669          {
    670            u8 SleepStatus = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -