📄 stm32f10x_can.lst
字号:
460
461 /* Request transmission */
462 CAN->sTxMailBox[TransmitMailbox].TIR |= CAN_TMIDxR_TXRQ;
463 }
464
465 return TransmitMailbox;
466 }
467
468 /*******************************************************************************
469 * Function Name : CAN_TransmitStatus
470 * Description : Checks the transmission of a message.
471 * Input : TransmitMailbox: the number of the mailbox that is used for
472 * transmission.
473 * Output : None.
474 * Return : CANTXOK if the CAN driver transmits the message, CANTXFAILED
475 * in an other case.
476 *******************************************************************************/
477 u8 CAN_TransmitStatus(u8 TransmitMailbox)
478 {
479 /* RQCP, TXOK and TME bits */
480 u32 State = 0;
481
482 /* Check the parameters */
483 assert(IS_CAN_TRANSMITMAILBOX(TransmitMailbox));
484
485 switch (TransmitMailbox)
486 {
487 case (0): State |= ((CAN->TSR & CAN_TSR_RQCP0) << 2);
488 State |= ((CAN->TSR & CAN_TSR_TXOK0) >> 0);
489 State |= ((CAN->TSR & CAN_TSR_TME0) >> 26);
490 break;
491 case (1): State |= ((CAN->TSR & CAN_TSR_RQCP1) >> 6);
492 State |= ((CAN->TSR & CAN_TSR_TXOK1) >> 8);
493 State |= ((CAN->TSR & CAN_TSR_TME1) >> 27);
494 break;
495 case (2): State |= ((CAN->TSR & CAN_TSR_RQCP2) >> 14);
496 State |= ((CAN->TSR & CAN_TSR_TXOK2) >> 16);
497 State |= ((CAN->TSR & CAN_TSR_TME2) >> 28);
498 break;
499 default:
500 State = CANTXFAILED;
501 break;
502 }
503
504 switch (State)
505 {
506 /* transmit pending */
507 case (0x0): State = CANTXPENDING;
508 break;
509 /* transmit failed */
510 case (0x5): State = CANTXFAILED;
511 break;
512 /* transmit succedeed */
513 case (0x7): State = CANTXOK;
514 break;
515 default:
516 State = CANTXFAILED;
517 break;
518 }
519
520 return State;
521 }
522
523 /*******************************************************************************
524 * Function Name : CAN_CancelTransmit
525 * Description : Cancels a transmit request.
526 * Input : Mailbox number.
527 * Output : None.
528 * Return : None.
529 *******************************************************************************/
530 void CAN_CancelTransmit(u8 Mailbox)
531 {
532 /* Check the parameters */
533 assert(IS_CAN_TRANSMITMAILBOX(Mailbox));
534
535 /* abort transmission */
536 switch (Mailbox)
537 {
538 case (0): CAN->TSR |= CAN_TSR_ABRQ0;
539 break;
540 case (1): CAN->TSR |= CAN_TSR_ABRQ1;
541 break;
542 case (2): CAN->TSR |= CAN_TSR_ABRQ2;
543 break;
544 default:
545 break;
546 }
547 }
548
549 /*******************************************************************************
550 * Function Name : CAN_FIFORelease
551 * Description : Releases a FIFO.
552 * Input : FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1.
553 * Output : None.
554 * Return : None.
555 *******************************************************************************/
556 void CAN_FIFORelease(u8 FIFONumber)
557 {
558 /* Check the parameters */
559 assert(IS_CAN_FIFO(FIFONumber));
560
561 /* Release FIFO0 */
562 if (FIFONumber == CAN_FIFO0)
563 {
564 CAN->RF0R = CAN_RF0R_RFOM0;
565 }
566 /* Release FIFO1 */
567 else /* FIFONumber == CAN_FIFO1 */
568 {
569 CAN->RF1R = CAN_RF1R_RFOM1;
570 }
571 }
572
573 /*******************************************************************************
574 * Function Name : CAN_MessagePending
575 * Description : Returns the number of pending messages.
576 * Input : FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
577 * Output : None.
578 * Return : NbMessage which is the number of pending message.
579 *******************************************************************************/
580 u8 CAN_MessagePending(u8 FIFONumber)
581 {
582 u8 MessagePending=0;
583
584 /* Check the parameters */
585 assert(IS_CAN_FIFO(FIFONumber));
586
587 if (FIFONumber == CAN_FIFO0)
588 {
589 MessagePending = (u8)(CAN->RF0R&(u32)0x03);
590 }
591 else if (FIFONumber == CAN_FIFO1)
592 {
593 MessagePending = (u8)(CAN->RF1R&(u32)0x03);
594 }
595 else
596 {
597 MessagePending = 0;
598 }
599 return MessagePending;
600 }
601
602 /*******************************************************************************
603 * Function Name : CAN_Receive
604 * Description : Receives a message.
605 * Input : FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
606 * Output : RxMessage: pointer to a structure which contains CAN Id,
607 * CAN DLC, CAN datas and FMI number.
608 * Return : None.
609 *******************************************************************************/
610 void CAN_Receive(u8 FIFONumber, CanRxMsg* RxMessage)
611 {
612 /* Check the parameters */
613 assert(IS_CAN_FIFO(FIFONumber));
614
615 /* Get the Id */
616 RxMessage->StdId = (u32)0x000007FF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 21);
617 RxMessage->ExtId = (u32)0x0003FFFF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 3);
618
619 RxMessage->IDE = (u32)0x00000004 & CAN->sFIFOMailBox[FIFONumber].RIR;
620 RxMessage->RTR = (u32)0x00000002 & CAN->sFIFOMailBox[FIFONumber].RIR;
621
622 /* Get the DLC */
623 RxMessage->DLC = (u32)0x0000000F & CAN->sFIFOMailBox[FIFONumber].RDTR;
624
625 /* Get the FMI */
626 RxMessage->FMI = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDTR >> 8);
627
628 /* Get the data field */
629 RxMessage->Data[0] = (u32)0x000000FF & CAN->sFIFOMailBox[FIFONumber].RDLR;
630 RxMessage->Data[1] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 8);
631 RxMessage->Data[2] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 16);
632 RxMessage->Data[3] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 24);
633
634 RxMessage->Data[4] = (u32)0x000000FF & CAN->sFIFOMailBox[FIFONumber].RDHR;
635 RxMessage->Data[5] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 8);
636 RxMessage->Data[6] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 16);
637 RxMessage->Data[7] = (u32)0x000000FF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 24);
638
639 /* Release the FIFO */
640 CAN_FIFORelease(FIFONumber);
641 }
642
643 /*******************************************************************************
644 * Function Name : CAN_Sleep
645 * Description : Enters the low power mode.
646 * Input : None.
647 * Output : None.
648 * Return : CANSLEEPOK if sleep entered, CANSLEEPFAILED in an other case.
649 *******************************************************************************/
650 u8 CAN_Sleep(void)
651 {
652 u8 SleepStatus = 0;
653
654 /* Sleep mode entering request */
655 CAN->MCR |= CAN_MCR_SLEEP;
656 SleepStatus = CANSLEEPOK;
657
658 /* Sleep mode status */
659 if ((CAN->MSR&CAN_MCR_SLEEP) == 0) //if ((CAN->MCR&CAN_MCR_SLEEP) == 0)--D.JIANG
660 {
661 /* Sleep mode not entered */
662 SleepStatus = CANSLEEPFAILED;
663 }
664
665 /* At this step, sleep mode status */
666 return SleepStatus;
667 }
668
669 /*******************************************************************************
670 * Function Name : CAN_WakeUp
671 * Description : Wakes the CAN up.
672 * Input : None.
673 * Output : None.
674 * Return : CANWAKEUPOK if sleep mode left, CANWAKEUPFAILED in an other
675 * case.
676 *******************************************************************************/
677 u8 CAN_WakeUp(void)
678 {
679 u8 WakeUpStatus = 0;
680
681 /* Wake up request */
682 CAN->MCR &= ~CAN_MCR_SLEEP;
683 WakeUpStatus = CANWAKEUPFAILED;
684
685 /* Sleep mode status */
686 if ((CAN->MSR&CAN_MCR_SLEEP) == 0) // if ((CAN->MCR&CAN_MCR_SLEEP) == 0)
687 {
688 /* Sleep mode exited */
689 WakeUpStatus = CANWAKEUPOK;
690 }
691
692 /* At this step, sleep mode status */
693 return WakeUpStatus;
694 }
695
696 /*******************************************************************************
697 * Function Name : CAN_GetFlagStatus
698 * Description : Checks whether the specified CAN flag is set or not.
699 * Input : CAN_FLAG: specifies the flag to check.
700 * This parameter can be: CAN_FLAG_EWG, CAN_FLAG_EPV or
701 * CAN_FLAG_BOF.
702 * Output : None.
703 * Return : The new state of CAN_FLAG (SET or RESET).
704 *******************************************************************************/
705 FlagStatus CAN_GetFlagStatus(u32 CAN_FLAG)
706 {
707 FlagStatus bitstatus = RESET;
708
709 /* Check the parameters */
710 assert(IS_CAN_FLAG(CAN_FLAG));
711
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -