头文件:
/***************************************************************************** * hhf_can.h: Header file for HHD32F1xx Family Microprocessors * * Copyright(C) 2015, tech. Ltd. * All rights reserved. * * History * 2015 ver 1.00 Prelimnary version, first Release * ******************************************************************************/ #include "hhd32f1xx.h" #define ENABLECAN1CLK (SYSCON->SYSAPB1CLKCTRL.all |= (1<<25)) #define ENABLECAN2CLK (SYSCON->SYSAPB1CLKCTRL.all |= (1<<26)) #define DISABLECAN1CLK (SYSCON->SYSAPB1CLKCTRL.all &= ~(1<<25)) #define DISABLECAN2CLK (SYSCON->SYSAPB1CLKCTRL.all &= ~(1<<26)) #define CAN1_TX_PA12 0x15 #define CAN1_TX_PB9 0x15 #define CAN1_RX_PA11 0x15 #define CAN1_RX_PB8 0x15 //Mode bit #define SleepMode 0x10 #define ACCFMode 0x08 #define SelfTestMode 0x04 #define ListenOnlyMode 0x02 #define ResetMode 0x01 #define ActiveMode 0x00 //Interrupt enable bit #define BEIE 0x80 #define ALIE 0x40 #define EPIE 0x20 #define WUIE 0x10 #define DOIE 0x08 #define EIE 0x04 #define TIE 0x02 #define RIE 0x01 //CMD bit #define SelfRecReq 0x10 #define ClearDataOverrun 0x08 #define ReleaseRecBuf 0x04 #define AbortTrans 0x02 #define TransReq 0x01 //Status Register bit #define BusSt 0x80 #define ErrorSt 0x40 #define TranSt 0x20 #define RecSt 0x10 #define TranComplete 0x08 #define TranBufSt 0x04 #define DataOvSt 0x02 #define RecBufSt 0x01 #if 1 //--CAN Registers BITS Field--------------------------------------------------------------------------------------- struct CAN_MOD_BITS { uint32_t RM:1; // sleep mode uint32_t LOM:1; // Acceptance filter mode uint32_t STM:1; // Self test mode uint32_t AFM:1; // Listen only mode uint32_t SM:1; // Reset mode uint32_t RSVD:27; // 31:5 reserved }; union CAN_MOD_REG { uint32_t all; struct CAN_MOD_BITS bit; }; struct CAN_CMR_BITS{ uint32_t TR:1; //Transmission Request uint32_t AT:1; //Abort Transmission uint32_t RRB:1; //Release Receive Buffer uint32_t CDO:1; //Clear Data Overrun uint32_t SRR:1; //Self Reception Request uint32_t RSVD:27; //31:5 reserved }; union CAN_CMR_REG { uint32_t all; struct CAN_CMR_BITS bit; }; struct CAN_SR_BITS{ uint32_t RBS:1; //Receive Buffer Staus uint32_t DOS:1; //Data Overrun Status uint32_t TBS:1; //Transmit Buffer Status uint32_t TCS:1; //Transmission Complete Status uint32_t RS:1; //Receive Status uint32_t TS:1; //Transmit Status uint32_t ES:1; //Error Status uint32_t BS:1; //Bus Status uint32_t RSVD:24; //31:8 reserved }; union CAN_SR_REG { uint32_t all; struct CAN_SR_BITS bit; }; struct CAN_IR_BITS{ uint32_t RI:1; //Receive Interrupt uint32_t TI:1; //Transmit Interrupt uint32_t EI:1; //Error Warning Interrupt uint32_t DOI:1; //Data Overrun Interrupt uint32_t WUI:1; //Wake-Up Interrupt uint32_t EPI:1; //Error Passive Interrupt uint32_t ALI:1; //Arbitration Lost Interrupt uint32_t BEI:1; //Bus Error Interrupt uint32_t RSVD:24; //31:8 reserved }; union CAN_IR_REG { uint32_t all; struct CAN_IR_BITS bit; }; struct CAN_IER_BITS{ uint32_t RIEN:1; //Receive Interrupt Enable uint32_t TIEN:1; //Transmit Interrupt Enable uint32_t EIEN:1; //Error Warning Interrupt Enable uint32_t DOIEN:1; //Data Overrun Interrupt Enable uint32_t WUIEN:1; //Wake-Up Interrupt Enable uint32_t EPIEN:1; //Error Passive Interrupt Enable uint32_t ALIEN:1; //Arbitration Lost Interrupt Enable uint32_t BEIEN:1; //Bus Error Interrupt Enable uint32_t RSVD:24; //31:8 reserved }; union CAN_IER_REG { uint32_t all; struct CAN_IER_BITS bit; }; struct CAN_BTR0_BITS{ uint32_t BRP:6; //Baud Rate Prescaler (BRP). uint32_t SJW:2; //Synchronization Jump Width (SJW) uint32_t RSVD:24; //31:8 reserved }; union CAN_BTR0_REG { uint32_t all; struct CAN_BTR0_BITS bit; }; struct CAN_BTR1_BITS{ uint32_t TSEG1:4; // uint32_t TSEG2:3; // uint32_t SAM:1; //Sampling uint32_t RSVD:24; //31:8 reserved }; union CAN_BTR1_REG { uint32_t all; struct CAN_BTR1_BITS bit; }; struct CAN_OCR_BITS{ uint32_t OCMODE:2; //Selection of two possible output driver configurations: uint32_t RSVD:30; //31:3 reserved }; union CAN_OCR_REG { uint32_t all; struct CAN_OCR_BITS bit; }; struct CAN_ALC_BITS{ uint32_t ALC:5; //This read-only register records the bit position at which arbitration was lost uint32_t RSVD:27; //31:5 reserved }; union CAN_ALC_REG { uint32_t all; struct CAN_ALC_BITS bit; }; struct CAN_ECC_BITS{ uint32_t SEGMENTCODE:5; //Segment coede err uint32_t DIRECTION:1; //If ‘1’, the error occurred during reception. If ‘0’, the error occurred during transmission. uint32_t ERRORCODE:2; //00:Bit erro, 01:Bit Form erro, 10:Stuff error 11:Some other type of error uint32_t RSVD:24; //31:8 reserved }; union CAN_ECC_REG { uint32_t all; struct CAN_ECC_BITS bit; }; struct CAN_EWLR_BITS{ uint32_t EWL:8; // Defines the number of errors after which an Error Warning Interrupt should be generated uint32_t RSVD:24; }; union CAN_EWLR_REG { uint32_t all; struct CAN_EWLR_BITS bit; }; struct CAN_RXERR_BITS{ uint32_t RXERR:8; // Receive error counter uint32_t RSVD:24; }; union CAN_RXERR_REG { uint32_t all; struct CAN_RXERR_BITS bit; }; struct CAN_TXERR_BITS{ uint32_t TXERR_:8; // Transmit error counter uint32_t RSVD:24; }; union CAN_TXERR_REG { uint32_t all; struct CAN_RXERR_BITS bit; }; struct CAN_FRAMEINFO_BITS{ uint32_t DLC:4; //Specify the number of data bytes included in the message being sent. uint32_t RSVD0:2; //4:5 reserved uint32_t RTR:1; //Remote transmission request. uint32_t FF:1; //The FF bit selects the type of frame format to be transmitted uint32_t RSVD1:24; //31:8 reserved }; union CAN_FRAMEINFO_REG { uint32_t all; struct CAN_FRAMEINFO_BITS bit; }; struct CAN_DATAINFO_BITS{ uint32_t DATA:8; // uint32_t RSVD:24; //31:8 reserved }; union CAN_DATAINFO_REG { uint32_t all; struct CAN_DATAINFO_BITS bit; }; struct CAN_ACR_BITS{ uint32_t ACR:8; // uint32_t RSVD:24; //31:8 reserved }; union CAN_ACR_REG { uint32_t all; struct CAN_ACR_BITS bit; }; struct CAN_AMR_BITS{ uint32_t AMR:8; // uint32_t RSVD:24; //31:8 reserved }; union CAN_AMR_REG { uint32_t all; struct CAN_AMR_BITS bit; }; struct CAN_RMC_BITS{ uint32_t RMC:5; //Receive message counter uint32_t RSVD:27; //31:5 reserved }; union CAN_RMC_REG { uint32_t all; struct CAN_RMC_BITS bit; }; struct CAN_RBSA_BITS{ uint32_t RBSA:6; //Receive buffer start address uint32_t RSVD:26; //31:6 reserved }; union CAN_RBSA_REG { uint32_t all; struct CAN_RBSA_BITS bit; }; struct CAN_CDR_BITS{ uint32_t CDR:3; //The bits CD.2 to CD.0 define the frequency at the external CLKOUT pin uint32_t CLKOFF:1; //Setting this bit allows the external CLKOUT signal to be disabled uint32_t RSVD:28; //31:4 reserved }; union CAN_CDR_REG { uint32_t all; struct CAN_CDR_BITS bit; }; struct CAN_RXFIFO_BITS{ uint32_t RX_DATA:8; uint32_t RSVD:24; }; union CAN_RXFIFO_REG { uint32_t all; struct CAN_RXFIFO_BITS bit; }; struct CAN_TB_BITS{ uint32_t TX_DATA:8; uint32_t RSVD:24; }; union CAN_TB_REG { uint32_t all; struct CAN_TB_BITS bit; }; // struct CAN_ACR_BITS{ // uint32_t ACR:8; // uint32_t RSVD:24; // }; // union CAN_ACR_REG{ // uint32_t all; // struct CAN_ACR_BITS bit; // }; // struct CAN_AMR_BITS{ // uint32_t ACR:8; // uint32_t RSVD:24; // }; // union CAN_AMR_REG{ // uint32_t all; // struct CAN_AMR_BITS bit; // }; struct CAN_ACCEPTANCE_FILTER { union CAN_ACR_REG ACR[4]; union CAN_AMR_REG AMR[4]; }; struct CAN_TxDATAINFO { union CAN_FRAMEINFO_REG TxFRAME; union CAN_DATAINFO_REG TxDATA[12]; }; struct CAN_RxDATAINFO { union CAN_FRAMEINFO_REG RxFRAME; union CAN_DATAINFO_REG RxDATA[12]; }; typedef struct { __IO union CAN_MOD_REG MOD; /*!< Offset: 0x000 MOD Register (R/W) */ __IO union CAN_CMR_REG CMR; /*!< Offset: 0x004 Command Register (W) */ __IO union CAN_SR_REG SR; /*!< Offset: 0x008 Status Register (R) */ __IO union CAN_IR_REG IR; /*!< Offset: 0x00C Interrupt Register (R) */ __IO union CAN_IER_REG IER; /*!< Offset: 0x010 Interrupt Enable Register (R/W) */ uint32_t RESERVED1; __IO union CAN_BTR0_REG BTR0; /*!< Offset: 0x018 Bus Timing 0 Register (R) */ __IO union CAN_BTR1_REG BTR1; /*!< Offset: 0x01C Bus Timing 1 Register (R) */ __IO union CAN_OCR_REG OCR; /*!< Offset: 0x020 Output Control Register (R) */ uint32_t RESERVED2[2]; __IO union CAN_ALC_REG ALC; /*!< Offset: 0x02C Arbitration Lost Capture Register (R) */ __IO union CAN_ECC_REG ECC; /*!< Offset: 0x030 Error Code Capture Register (R) */ __IO union CAN_EWLR_REG EWLR; /*!< Offset: 0x034 Error Warning Register (R) */ __IO union CAN_RXERR_REG RXERR; /*!< Offset: 0x038 Receive Error Counter Register (R) */ __IO union CAN_TXERR_REG TXERR; /*!< Offset: 0x03C Transmit Error Register (R) */ //__IO union CAN_FRAMEINFO_REG FRAMEINFO; /*!< Offset: 0x040 Transmit Buffer (Frame Information) Register (W) */ // __IO union CAN_DATAINFO_REG DATAINFO[12]; /*!< Offset: 0x044 - 0x70 Transmit Buffer (Frame Information) Register (W) */ union { __IO struct CAN_ACCEPTANCE_FILTER FILTER; __O struct CAN_TxDATAINFO TxDATAINFO; __I struct CAN_RxDATAINFO RxDATAINFO; }DATAINFO; __I union CAN_RMC_REG RMC; /*!< Offset: 0x074 Receive Message Count Register (R) */ __I union CAN_RBSA_REG RBSA; /*!< Offset: 0x078 Receive Buffer Start Address Register (R) */ __IO union CAN_CDR_REG CDR; /*!< Offset: 0x07C Clock Divider Register (R/W) */ __I union CAN_RXFIFO_REG RXFIFO[64]; /*!< Offset: 0x080 - 0x Receive FFIO (R) */ __O union CAN_TB_REG TB[13]; /*!< Offset: 0x000 Transmit Buffer (R) */ }HHD32F1_CAN_TypeDef; #define CAN ((HHD32F1_CAN_TypeDef *) HHD_CAN_BASE) #endif void CAN_SetMode(uint32_t mode); void CAN_EnableInt(uint32_t intbit); void CAN_DisableInt(uint32_t intbit); int CAN_GetStatus(void); void CAN_ClearStatus(uint32_t clrbit); void CAN_SetCMD(uint32_t cmddata); void CAN_ClrCMD(uint32_t cmddata); /* end __CAN */ /***************************************************************************** ** End Of File ******************************************************************************/
源文件:
/***************************************************************************** * hhd_can.C: Sourse file for MCU CAN application * * Copyright(C) 2015, Technology * All rights reserved. * * History * 2015.08.14 ver 1.00 * ******************************************************************************/ #include "hhd_can.h" #include "hhd_sys.h" /***************************************************************************** Function Name CAN_SetMode Function Definition void CAN_SetMode(uint32_t mod) Function Description Set CAN mode Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ void CAN_SetMode(uint32_t mode) { CAN->MOD.all = mode; return; } /***************************************************************************** Function Name CAN_GetStatus Function Definition int CAN_GetStatus() Function Description Get CAN SR status register Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ int CAN_GetStatus(void) { return (CAN->SR.all); } /***************************************************************************** Function Name CAN_ClearStatus Function Definition int CAN_ClearStatus() Function Description Clear CAN SR status register Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ void CAN_ClearStatus(uint32_t clrbit) { CAN->SR.all &= ~clrbit; return ; } /***************************************************************************** Function Name CAN_SetCMD Function Definition int CAN_SetCMD() Function Description Set CAN command register Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ void CAN_SetCMD(uint32_t cmddata) { CAN->CMR.all |= cmddata; return; } /***************************************************************************** Function Name CAN_ClrCMD Function Definition int CAN_ClrCMD() Function Description CAN command register Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ void CAN_ClrCMD(uint32_t cmddata) { CAN->CMR.all &= ~cmddata; return; } /***************************************************************************** Function Name CAN_EnableInt Function Definition void CAN_EnableInt(uint32_t intbit) Function Description Setup CAN interrupt Input Parameters Condition #include sys.h Function called - Last Change Date: 2015/12/12 *****************************************************************************/ void CAN_EnableInt(uint32_t intbit) { CAN->IER.all |= intbit ; ///int enable NVIC_EnableIRQ(CAN_IRQn); return; } /***************************************************************************** Function Name CAN_DisableInt Function Definition void CAN_DisableInt(uint32_t intbit) Condition #include sys.h Function called - Last Chang Date: 2015/12/12 *****************************************************************************/ void CAN_DisableInt(uint32_t intbit) { CAN->IER.all &= ~intbit ; ///int disable NVIC_DisableIRQ(CAN_IRQn); return; }