Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
libuavcan_drivers/lpc11c24/driver/src/c_can.hpp@0:dfe6edabb8ec, 2018-04-14 (annotated)
- Committer:
- RuslanUrya
- Date:
- Sat Apr 14 10:25:32 2018 +0000
- Revision:
- 0:dfe6edabb8ec
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| RuslanUrya | 0:dfe6edabb8ec | 1 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 2 | * Bosch C_CAN controller API. |
| RuslanUrya | 0:dfe6edabb8ec | 3 | * |
| RuslanUrya | 0:dfe6edabb8ec | 4 | * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com> |
| RuslanUrya | 0:dfe6edabb8ec | 5 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 6 | |
| RuslanUrya | 0:dfe6edabb8ec | 7 | #pragma once |
| RuslanUrya | 0:dfe6edabb8ec | 8 | |
| RuslanUrya | 0:dfe6edabb8ec | 9 | #include <cstdint> |
| RuslanUrya | 0:dfe6edabb8ec | 10 | #include <cstddef> |
| RuslanUrya | 0:dfe6edabb8ec | 11 | |
| RuslanUrya | 0:dfe6edabb8ec | 12 | namespace uavcan_lpc11c24 |
| RuslanUrya | 0:dfe6edabb8ec | 13 | { |
| RuslanUrya | 0:dfe6edabb8ec | 14 | namespace c_can |
| RuslanUrya | 0:dfe6edabb8ec | 15 | { |
| RuslanUrya | 0:dfe6edabb8ec | 16 | |
| RuslanUrya | 0:dfe6edabb8ec | 17 | struct MsgIfaceType |
| RuslanUrya | 0:dfe6edabb8ec | 18 | { |
| RuslanUrya | 0:dfe6edabb8ec | 19 | std::uint32_t CMDREQ; |
| RuslanUrya | 0:dfe6edabb8ec | 20 | |
| RuslanUrya | 0:dfe6edabb8ec | 21 | union |
| RuslanUrya | 0:dfe6edabb8ec | 22 | { |
| RuslanUrya | 0:dfe6edabb8ec | 23 | std::uint32_t W; |
| RuslanUrya | 0:dfe6edabb8ec | 24 | std::uint32_t R; |
| RuslanUrya | 0:dfe6edabb8ec | 25 | } CMDMSK; |
| RuslanUrya | 0:dfe6edabb8ec | 26 | |
| RuslanUrya | 0:dfe6edabb8ec | 27 | std::uint32_t MSK1; |
| RuslanUrya | 0:dfe6edabb8ec | 28 | std::uint32_t MSK2; |
| RuslanUrya | 0:dfe6edabb8ec | 29 | |
| RuslanUrya | 0:dfe6edabb8ec | 30 | std::uint32_t ARB1; |
| RuslanUrya | 0:dfe6edabb8ec | 31 | std::uint32_t ARB2; |
| RuslanUrya | 0:dfe6edabb8ec | 32 | |
| RuslanUrya | 0:dfe6edabb8ec | 33 | std::uint32_t MCTRL; |
| RuslanUrya | 0:dfe6edabb8ec | 34 | |
| RuslanUrya | 0:dfe6edabb8ec | 35 | std::uint32_t DA1; |
| RuslanUrya | 0:dfe6edabb8ec | 36 | std::uint32_t DA2; |
| RuslanUrya | 0:dfe6edabb8ec | 37 | std::uint32_t DB1; |
| RuslanUrya | 0:dfe6edabb8ec | 38 | std::uint32_t DB2; |
| RuslanUrya | 0:dfe6edabb8ec | 39 | |
| RuslanUrya | 0:dfe6edabb8ec | 40 | const std::uint32_t _skip[13]; |
| RuslanUrya | 0:dfe6edabb8ec | 41 | }; |
| RuslanUrya | 0:dfe6edabb8ec | 42 | |
| RuslanUrya | 0:dfe6edabb8ec | 43 | static_assert(offsetof(MsgIfaceType, CMDMSK) == 0x04, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 44 | static_assert(offsetof(MsgIfaceType, MSK1) == 0x08, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 45 | static_assert(offsetof(MsgIfaceType, ARB1) == 0x10, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 46 | static_assert(offsetof(MsgIfaceType, MCTRL) == 0x18, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 47 | static_assert(offsetof(MsgIfaceType, DA1) == 0x1c, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 48 | static_assert(offsetof(MsgIfaceType, DB2) == 0x28, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 49 | |
| RuslanUrya | 0:dfe6edabb8ec | 50 | static_assert(sizeof(MsgIfaceType) == 96, "C_CAN size"); |
| RuslanUrya | 0:dfe6edabb8ec | 51 | |
| RuslanUrya | 0:dfe6edabb8ec | 52 | |
| RuslanUrya | 0:dfe6edabb8ec | 53 | struct Type |
| RuslanUrya | 0:dfe6edabb8ec | 54 | { |
| RuslanUrya | 0:dfe6edabb8ec | 55 | std::uint32_t CNTL; |
| RuslanUrya | 0:dfe6edabb8ec | 56 | std::uint32_t STAT; |
| RuslanUrya | 0:dfe6edabb8ec | 57 | const std::uint32_t EC; |
| RuslanUrya | 0:dfe6edabb8ec | 58 | std::uint32_t BT; |
| RuslanUrya | 0:dfe6edabb8ec | 59 | const std::uint32_t INT; |
| RuslanUrya | 0:dfe6edabb8ec | 60 | std::uint32_t TEST; |
| RuslanUrya | 0:dfe6edabb8ec | 61 | std::uint32_t BRPE; |
| RuslanUrya | 0:dfe6edabb8ec | 62 | |
| RuslanUrya | 0:dfe6edabb8ec | 63 | const std::uint32_t _skip_a[1]; |
| RuslanUrya | 0:dfe6edabb8ec | 64 | |
| RuslanUrya | 0:dfe6edabb8ec | 65 | MsgIfaceType IF[2]; // [0] @ 0x020, [1] @ 0x080 |
| RuslanUrya | 0:dfe6edabb8ec | 66 | |
| RuslanUrya | 0:dfe6edabb8ec | 67 | const std::uint32_t _skip_b[8]; |
| RuslanUrya | 0:dfe6edabb8ec | 68 | |
| RuslanUrya | 0:dfe6edabb8ec | 69 | const std::uint32_t TXREQ[2]; // 0x100 |
| RuslanUrya | 0:dfe6edabb8ec | 70 | |
| RuslanUrya | 0:dfe6edabb8ec | 71 | const std::uint32_t _skip_c[6]; |
| RuslanUrya | 0:dfe6edabb8ec | 72 | |
| RuslanUrya | 0:dfe6edabb8ec | 73 | const std::uint32_t ND[2]; // 0x120 |
| RuslanUrya | 0:dfe6edabb8ec | 74 | |
| RuslanUrya | 0:dfe6edabb8ec | 75 | const std::uint32_t _skip_d[6]; |
| RuslanUrya | 0:dfe6edabb8ec | 76 | |
| RuslanUrya | 0:dfe6edabb8ec | 77 | const std::uint32_t IR[2]; // 0x140 |
| RuslanUrya | 0:dfe6edabb8ec | 78 | |
| RuslanUrya | 0:dfe6edabb8ec | 79 | const std::uint32_t _skip_e[6]; |
| RuslanUrya | 0:dfe6edabb8ec | 80 | |
| RuslanUrya | 0:dfe6edabb8ec | 81 | const std::uint32_t MSGV[2]; // 0x160 |
| RuslanUrya | 0:dfe6edabb8ec | 82 | |
| RuslanUrya | 0:dfe6edabb8ec | 83 | const std::uint32_t _skip_f[6]; |
| RuslanUrya | 0:dfe6edabb8ec | 84 | |
| RuslanUrya | 0:dfe6edabb8ec | 85 | std::uint32_t CLKDIV; // 0x180 |
| RuslanUrya | 0:dfe6edabb8ec | 86 | }; |
| RuslanUrya | 0:dfe6edabb8ec | 87 | |
| RuslanUrya | 0:dfe6edabb8ec | 88 | static_assert(offsetof(Type, CNTL) == 0x000, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 89 | static_assert(offsetof(Type, STAT) == 0x004, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 90 | static_assert(offsetof(Type, TEST) == 0x014, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 91 | static_assert(offsetof(Type, BRPE) == 0x018, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 92 | static_assert(offsetof(Type, IF[0]) == 0x020, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 93 | static_assert(offsetof(Type, IF[1]) == 0x080, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 94 | static_assert(offsetof(Type, TXREQ) == 0x100, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 95 | static_assert(offsetof(Type, ND) == 0x120, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 96 | static_assert(offsetof(Type, IR) == 0x140, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 97 | static_assert(offsetof(Type, MSGV) == 0x160, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 98 | static_assert(offsetof(Type, CLKDIV) == 0x180, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 99 | |
| RuslanUrya | 0:dfe6edabb8ec | 100 | static_assert(offsetof(Type, IF[0].DB2) == 0x048, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 101 | static_assert(offsetof(Type, IF[1].DB2) == 0x0A8, "C_CAN offset"); |
| RuslanUrya | 0:dfe6edabb8ec | 102 | |
| RuslanUrya | 0:dfe6edabb8ec | 103 | |
| RuslanUrya | 0:dfe6edabb8ec | 104 | volatile Type& CAN = *reinterpret_cast<volatile Type*>(0x40050000); |
| RuslanUrya | 0:dfe6edabb8ec | 105 | |
| RuslanUrya | 0:dfe6edabb8ec | 106 | |
| RuslanUrya | 0:dfe6edabb8ec | 107 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 108 | * CNTL |
| RuslanUrya | 0:dfe6edabb8ec | 109 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 110 | static constexpr std::uint32_t CNTL_TEST = 1 << 7; |
| RuslanUrya | 0:dfe6edabb8ec | 111 | static constexpr std::uint32_t CNTL_CCE = 1 << 6; |
| RuslanUrya | 0:dfe6edabb8ec | 112 | static constexpr std::uint32_t CNTL_DAR = 1 << 5; |
| RuslanUrya | 0:dfe6edabb8ec | 113 | static constexpr std::uint32_t CNTL_EIE = 1 << 3; |
| RuslanUrya | 0:dfe6edabb8ec | 114 | static constexpr std::uint32_t CNTL_SIE = 1 << 2; |
| RuslanUrya | 0:dfe6edabb8ec | 115 | static constexpr std::uint32_t CNTL_IE = 1 << 1; |
| RuslanUrya | 0:dfe6edabb8ec | 116 | static constexpr std::uint32_t CNTL_INIT = 1 << 0; |
| RuslanUrya | 0:dfe6edabb8ec | 117 | |
| RuslanUrya | 0:dfe6edabb8ec | 118 | static constexpr std::uint32_t CNTL_IRQ_MASK = CNTL_EIE | CNTL_IE | CNTL_SIE; |
| RuslanUrya | 0:dfe6edabb8ec | 119 | |
| RuslanUrya | 0:dfe6edabb8ec | 120 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 121 | * TEST |
| RuslanUrya | 0:dfe6edabb8ec | 122 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 123 | static constexpr std::uint32_t TEST_RX = 1 << 7; |
| RuslanUrya | 0:dfe6edabb8ec | 124 | static constexpr std::uint32_t TEST_LBACK = 1 << 4; |
| RuslanUrya | 0:dfe6edabb8ec | 125 | static constexpr std::uint32_t TEST_SILENT = 1 << 3; |
| RuslanUrya | 0:dfe6edabb8ec | 126 | static constexpr std::uint32_t TEST_BASIC = 1 << 2; |
| RuslanUrya | 0:dfe6edabb8ec | 127 | static constexpr std::uint32_t TEST_TX_SHIFT = 5; |
| RuslanUrya | 0:dfe6edabb8ec | 128 | |
| RuslanUrya | 0:dfe6edabb8ec | 129 | enum class TestTx : std::uint32_t |
| RuslanUrya | 0:dfe6edabb8ec | 130 | { |
| RuslanUrya | 0:dfe6edabb8ec | 131 | Controller = 0, |
| RuslanUrya | 0:dfe6edabb8ec | 132 | SamplePoint = 1, |
| RuslanUrya | 0:dfe6edabb8ec | 133 | LowDominant = 2, |
| RuslanUrya | 0:dfe6edabb8ec | 134 | HighRecessive = 3 |
| RuslanUrya | 0:dfe6edabb8ec | 135 | }; |
| RuslanUrya | 0:dfe6edabb8ec | 136 | |
| RuslanUrya | 0:dfe6edabb8ec | 137 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 138 | * STAT |
| RuslanUrya | 0:dfe6edabb8ec | 139 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 140 | static constexpr std::uint32_t STAT_BOFF = 1 << 7; |
| RuslanUrya | 0:dfe6edabb8ec | 141 | static constexpr std::uint32_t STAT_EWARN = 1 << 6; |
| RuslanUrya | 0:dfe6edabb8ec | 142 | static constexpr std::uint32_t STAT_EPASS = 1 << 5; |
| RuslanUrya | 0:dfe6edabb8ec | 143 | static constexpr std::uint32_t STAT_RXOK = 1 << 4; |
| RuslanUrya | 0:dfe6edabb8ec | 144 | static constexpr std::uint32_t STAT_TXOK = 1 << 3; |
| RuslanUrya | 0:dfe6edabb8ec | 145 | static constexpr std::uint32_t STAT_LEC_MASK = 7; |
| RuslanUrya | 0:dfe6edabb8ec | 146 | static constexpr std::uint32_t STAT_LEC_SHIFT = 0; |
| RuslanUrya | 0:dfe6edabb8ec | 147 | |
| RuslanUrya | 0:dfe6edabb8ec | 148 | enum class StatLec : std::uint32_t |
| RuslanUrya | 0:dfe6edabb8ec | 149 | { |
| RuslanUrya | 0:dfe6edabb8ec | 150 | NoError = 0, |
| RuslanUrya | 0:dfe6edabb8ec | 151 | StuffError = 1, |
| RuslanUrya | 0:dfe6edabb8ec | 152 | FormError = 2, |
| RuslanUrya | 0:dfe6edabb8ec | 153 | AckError = 3, |
| RuslanUrya | 0:dfe6edabb8ec | 154 | Bit1Error = 4, |
| RuslanUrya | 0:dfe6edabb8ec | 155 | Bit0Error = 5, |
| RuslanUrya | 0:dfe6edabb8ec | 156 | CRCError = 6, |
| RuslanUrya | 0:dfe6edabb8ec | 157 | Unused = 7 |
| RuslanUrya | 0:dfe6edabb8ec | 158 | }; |
| RuslanUrya | 0:dfe6edabb8ec | 159 | |
| RuslanUrya | 0:dfe6edabb8ec | 160 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 161 | * IF.CMDREQ |
| RuslanUrya | 0:dfe6edabb8ec | 162 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 163 | static constexpr std::uint32_t IF_CMDREQ_BUSY = 1 << 15; |
| RuslanUrya | 0:dfe6edabb8ec | 164 | |
| RuslanUrya | 0:dfe6edabb8ec | 165 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 166 | * IF.CMDMSK |
| RuslanUrya | 0:dfe6edabb8ec | 167 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 168 | static constexpr std::uint32_t IF_CMDMSK_W_DATA_A = 1 << 0; |
| RuslanUrya | 0:dfe6edabb8ec | 169 | static constexpr std::uint32_t IF_CMDMSK_W_DATA_B = 1 << 1; |
| RuslanUrya | 0:dfe6edabb8ec | 170 | static constexpr std::uint32_t IF_CMDMSK_W_TXRQST = 1 << 2; |
| RuslanUrya | 0:dfe6edabb8ec | 171 | static constexpr std::uint32_t IF_CMDMSK_W_CTRL = 1 << 4; |
| RuslanUrya | 0:dfe6edabb8ec | 172 | static constexpr std::uint32_t IF_CMDMSK_W_ARB = 1 << 5; |
| RuslanUrya | 0:dfe6edabb8ec | 173 | static constexpr std::uint32_t IF_CMDMSK_W_MASK = 1 << 6; |
| RuslanUrya | 0:dfe6edabb8ec | 174 | static constexpr std::uint32_t IF_CMDMSK_W_WR_RD = 1 << 7; |
| RuslanUrya | 0:dfe6edabb8ec | 175 | |
| RuslanUrya | 0:dfe6edabb8ec | 176 | /* |
| RuslanUrya | 0:dfe6edabb8ec | 177 | * IF.MCTRL |
| RuslanUrya | 0:dfe6edabb8ec | 178 | */ |
| RuslanUrya | 0:dfe6edabb8ec | 179 | static constexpr std::uint32_t IF_MCTRL_NEWDAT = 1 << 15; |
| RuslanUrya | 0:dfe6edabb8ec | 180 | static constexpr std::uint32_t IF_MCTRL_MSGLST = 1 << 14; |
| RuslanUrya | 0:dfe6edabb8ec | 181 | static constexpr std::uint32_t IF_MCTRL_INTPND = 1 << 13; |
| RuslanUrya | 0:dfe6edabb8ec | 182 | static constexpr std::uint32_t IF_MCTRL_UMASK = 1 << 12; |
| RuslanUrya | 0:dfe6edabb8ec | 183 | static constexpr std::uint32_t IF_MCTRL_TXIE = 1 << 11; |
| RuslanUrya | 0:dfe6edabb8ec | 184 | static constexpr std::uint32_t IF_MCTRL_RXIE = 1 << 10; |
| RuslanUrya | 0:dfe6edabb8ec | 185 | static constexpr std::uint32_t IF_MCTRL_RMTEN = 1 << 9; |
| RuslanUrya | 0:dfe6edabb8ec | 186 | static constexpr std::uint32_t IF_MCTRL_TXRQST = 1 << 8; |
| RuslanUrya | 0:dfe6edabb8ec | 187 | static constexpr std::uint32_t IF_MCTRL_EOB = 1 << 7; |
| RuslanUrya | 0:dfe6edabb8ec | 188 | static constexpr std::uint32_t IF_MCTRL_DLC_MASK = 15; |
| RuslanUrya | 0:dfe6edabb8ec | 189 | |
| RuslanUrya | 0:dfe6edabb8ec | 190 | } |
| RuslanUrya | 0:dfe6edabb8ec | 191 | } |