📄 stm32f10x_can.lst
字号:
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 + -