CANDriver.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. struct CANFrame;
  2. class CANDriver {
  3. public:
  4. CANDriver();
  5. void init(uint32_t bitrate, uint32_t acceptance_code, uint32_t acceptance_mask);
  6. bool send(const CANFrame &frame);
  7. bool receive(CANFrame &out_frame);
  8. private:
  9. struct Timings {
  10. uint16_t prescaler;
  11. uint8_t sjw;
  12. uint8_t bs1;
  13. uint8_t bs2;
  14. Timings()
  15. : prescaler(0)
  16. , sjw(0)
  17. , bs1(0)
  18. , bs2(0)
  19. { }
  20. };
  21. bool init_bus(const uint32_t bitrate);
  22. void init_once(bool enable_irq);
  23. bool computeTimings(uint32_t target_bitrate, Timings& out_timings);
  24. uint32_t bitrate;
  25. uint32_t last_bus_recovery_ms;
  26. };
  27. /**
  28. * Raw CAN frame, as passed to/from the CAN driver.
  29. */
  30. struct CANFrame {
  31. static const uint32_t MaskStdID = 0x000007FFU;
  32. static const uint32_t MaskExtID = 0x1FFFFFFFU;
  33. static const uint32_t FlagEFF = 1U << 31; ///< Extended frame format
  34. static const uint32_t FlagRTR = 1U << 30; ///< Remote transmission request
  35. static const uint32_t FlagERR = 1U << 29; ///< Error frame
  36. static const uint8_t NonFDCANMaxDataLen = 8;
  37. static const uint8_t MaxDataLen = 8;
  38. uint32_t id; ///< CAN ID with flags (above)
  39. union {
  40. uint8_t data[MaxDataLen];
  41. uint32_t data_32[MaxDataLen/4];
  42. };
  43. uint8_t dlc; ///< Data Length Code
  44. CANFrame() :
  45. id(0),
  46. dlc(0)
  47. {
  48. memset(data,0, MaxDataLen);
  49. }
  50. CANFrame(uint32_t can_id, const uint8_t* can_data, uint8_t data_len, bool canfd_frame = false);
  51. bool operator!=(const CANFrame& rhs) const
  52. {
  53. return !operator==(rhs);
  54. }
  55. bool operator==(const CANFrame& rhs) const
  56. {
  57. return (id == rhs.id) && (dlc == rhs.dlc) && (memcmp(data, rhs.data, dlc) == 0);
  58. }
  59. bool isExtended() const
  60. {
  61. return id & FlagEFF;
  62. }
  63. bool isRemoteTransmissionRequest() const
  64. {
  65. return id & FlagRTR;
  66. }
  67. bool isErrorFrame() const
  68. {
  69. return id & FlagERR;
  70. }
  71. static uint8_t dlcToDataLength(uint8_t dlc);
  72. static uint8_t dataLengthToDlc(uint8_t data_length);
  73. /**
  74. * CAN frame arbitration rules, particularly STD vs EXT:
  75. * Marco Di Natale - "Understanding and using the Controller Area Network"
  76. * http://www6.in.tum.de/pub/Main/TeachingWs2013MSE/CANbus.pdf
  77. */
  78. bool priorityHigherThan(const CANFrame& rhs) const;
  79. bool priorityLowerThan(const CANFrame& rhs) const
  80. {
  81. return rhs.priorityHigherThan(*this);
  82. }
  83. };