FlexCAN.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //==============================================================================
  2. // Purpose: allgemeines CAN Interface für FlexCAN von MPC5646
  3. //
  4. // Created on: 20.04.2012 by IPE
  5. //
  6. // History
  7. // 20.04.2012 neu, T.Maurer
  8. //==============================================================================
  9. #ifndef __FLEXCAN_H__
  10. #define __FLEXCAN_H__
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. // Constants
  15. #define CAN_DATA_ARR_LEN 8 //Max Anzahl der Datenbytes der CAN-Schittstelle
  16. //==============================================================================
  17. //== API ==
  18. //Return-Werte der Funktionen
  19. #define CAN_OK 0
  20. #define CAN_ERROR -1
  21. // Globale Datentypen
  22. //CAN_CONFIG
  23. //Konfiguration des CAN-Moduls
  24. typedef struct {
  25. volatile struct FLEXCAN_tag *CAN_Modul; //Adresse des FlexCAN-Moduls
  26. enum {CAN0_PortB0_1=0, CAN1_PortC10_11, CAN2_PortE8_9, CAN3_PortF8_9 } Port; //Auswahl der Rx/Tx-Port-Pins für ein CAN-Modul
  27. enum {TxPushPull=0,Tx_OpenDrain} TxPortType; //Tx Pin wird als Push-Pull (CMOS) oder Open-Drain konfiguriert
  28. enum {RxMask_Global=0,RxMask_Individual} RxMaskType; //Auswahl zwischen globaler RxMaske oder individueller RxMaske
  29. uint32_t GlobalRxMask; //globale RxMaske des Moduls; nur von Bedeutung wenn in RxMaskType "RxMask_Global" ausgewählt
  30. enum {CANBaud_1000kHz_OSC_40MHz=0, CANBaud_500kHz_OSC_40MHz, CANBaud_250kHz_OSC_40MHz, CANBaud_125kHz_OSC_40MHz} BaudConfig;
  31. } CAN_CONFIG;
  32. //CAN_MAILBOX
  33. //Konfiguration und ID der MessageBox
  34. typedef struct {
  35. CAN_CONFIG *p_CAN_Config;
  36. uint8_t MBNumber; //Message Buffer Number, 0..63
  37. enum {MB_Tx,MB_Rx} Direction;
  38. uint8_t RemoteEn; //Remote Frame Transmission Ein, aktiviert den RTR-Modus der MB
  39. uint8_t DataBytes; //Anzahl der Datenbytes, max=8
  40. uint8_t Interrupt; //Empfang oder Senden generiert einen Interrupt
  41. uint32_t AcceptMask; //individuelle RxMaske der MsgBox; ohne Bedeutung,wenn in CAN_CONFIG RxMask_Global oder wenn es eine Tx-MB ist
  42. enum {SHORT_ID, LONG_ID} IDE;
  43. uint32_t ID; //ID : Rx -> ID oder maskierte ID zur CAN-Nachrichten-Filterung. Nur die in AcceptMask/GlobalRxMask selektierten Bits werden beachtet
  44. } CAN_MAILBOX;
  45. // Global functions
  46. extern int8_t CAN_Init(CAN_CONFIG *config);
  47. //Initialisierung der Kontrollregister des CAN-Moduls
  48. //return: CAN_OK oder CAN_ERROR
  49. extern int8_t CAN_Init_Mailbox(CAN_MAILBOX *mbox);
  50. //Initialisierung der Message-Buffer und ihrer Einstellungen
  51. //return: CAN_OK oder CAN_ERROR
  52. extern int8_t CAN_Write(CAN_MAILBOX *mbox, uint8_t *data);
  53. //schreiben auf einen Tx-MessageBuffer
  54. //return: CAN_OK oder CAN_ERROR
  55. extern int8_t CAN_Write_dataset(CAN_MAILBOX *mbox, uint8_t* data,uint64_t timestamp);
  56. extern int8_t CAN_Read(CAN_MAILBOX *mbox, uint8_t *data);
  57. //lesen von einem Message-Buffer
  58. //return: CAN_OK oder CAN_ERROR
  59. extern int8_t CAN_Abort(CAN_MAILBOX *mbox);
  60. //Abbruch eines Sende-Prozesses
  61. //Gibt CAN_ERROR zurück, wenn mbox eine Rx-MB ist
  62. extern uint8_t CAN_Get_error_Register(CAN_CONFIG *config,uint32_t* can_esr);
  63. extern int8_t CAN_Check_error_Register(CAN_CONFIG *config) ;
  64. //==============================================================================
  65. #ifdef __cplusplus
  66. }
  67. #endif
  68. #endif /* ifndef*/