00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 #include "board.h"
00097
00098 #include <stdbool.h>
00099 #include <stdio.h>
00100
00101
00102
00103
00104
00105 #define MSG_ID_0 0x555 // standard ID
00106 #define MSG_ID_0_DATA1 0x81 // 1 byte message
00107 #define MSG_ID_1 0x11111111 // extended ID
00108 #define MSG_ID_1_DATA1_4 0x55555555 // 8 byte message
00109 #define MSG_ID_1_DATA5_8 0x00FF00FF
00110 #define MSG_ID_2 0x444 // standard ID
00111 #define MSG_ID_2_MASK 0x7FC // bits 0 & 1 are don't care
00112 #define TX_BUFFER_0 0
00113 #define TX_BUFFER_1 1
00114 #define RX_BUFFER_0 0
00115 #define RX_BUFFER_1 1
00116 #define FILTER_0 0
00117 #define FILTER_1 1
00118
00119 #define BUTTON_NOT_PUSHED 1
00120 #define BUTTON_PUSHED 0
00121
00122 #define CAN_STANDARD 0
00123 #define CAN_FD 1
00124
00125
00126
00127
00128
00129 static const Pin pushbutton[] = PINS_PUSHBUTTONS;
00130
00131 volatile uint8_t tick = 0;
00132
00133 uint32_t txdCntr;
00134 uint32_t rxdCntr;
00135 uint32_t rxFifoCntr;
00136 uint32_t * txMailbox0;
00137 uint32_t * txMailbox1;
00138 Mailbox8Type rxMailbox0;
00139 Mailbox8Type rxMailbox1;
00140 Mailbox8Type rxMailbox2;
00141 uint8_t txData[8];
00142
00143
00144
00145
00146
00147
00148 void MCAN0_Handler(void)
00149 {
00150 }
00151
00152
00153 void MCAN0_Line1_Handler(void)
00154 {
00155 }
00156
00157
00158 void MCAN1_Handler(void)
00159 {
00160 }
00161
00162
00163 void MCAN1_Line1_Handler(void)
00164 {
00165 if (MCAN_IsMessageStoredToRxDedBuffer(&mcan1Config)) {
00166 MCAN_ClearMessageStoredToRxBuffer(&mcan1Config);
00167 if (MCAN_IsNewDataInRxDedBuffer(&mcan1Config, RX_BUFFER_0)) {
00168 MCAN_GetRxDedBuffer(&mcan1Config, RX_BUFFER_0, (Mailbox64Type *)
00169 &rxMailbox0);
00170
00171 if (rxMailbox0.data[0] == MSG_ID_0_DATA1) {
00172
00173 LED_Toggle(0);
00174 rxdCntr++;
00175 }
00176 }
00177 if (MCAN_IsNewDataInRxDedBuffer(&mcan1Config, RX_BUFFER_1)) {
00178 MCAN_GetRxDedBuffer(&mcan1Config, RX_BUFFER_1, (Mailbox64Type *)
00179 &rxMailbox1);
00180 rxdCntr++;
00181 }
00182 }
00183 }
00184
00185
00186
00187
00188 void TC0_Handler(void)
00189 {
00190 volatile uint32_t dummy;
00191
00192 dummy = TC0->TC_CHANNEL[0].TC_SR;
00193 tick = 1;
00194 }
00195
00196
00197
00198
00199 static void _ConfigureTc(void)
00200 {
00201 uint32_t div;
00202 uint32_t tcclks;
00203
00204
00205 PMC_EnablePeripheral(ID_TC0);
00206
00207 TC_FindMckDivisor(4, BOARD_MCK, &div, &tcclks, BOARD_MCK);
00208
00209 TC_Configure(TC0, 0, tcclks | TC_CMR_CPCTRG);
00210 TC0->TC_CHANNEL[0].TC_RC = (BOARD_MCK / div) / 4;
00211
00212
00213 NVIC_ClearPendingIRQ(TC0_IRQn);
00214 NVIC_EnableIRQ(TC0_IRQn);
00215
00216 TC0->TC_CHANNEL[0].TC_IER = TC_IER_CPCS;
00217
00218
00219 TC_Start(TC0, 0);
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 extern int main(void)
00231 {
00232 uint32_t id_offset = 0;
00233 uint32_t fifo_entries;
00234 uint32_t button_state = BUTTON_PUSHED;
00235 uint32_t button_state2 = BUTTON_NOT_PUSHED;
00236 uint32_t can_mode = CAN_STANDARD;
00237
00238
00239 WDT_Disable(WDT);
00240
00241
00242 printf("\n\r-- Controller Area Network (CAN) Example %s --\n\r",
00243 SOFTPACK_VERSION);
00244 printf("-- %s\n\r", BOARD_NAME);
00245 printf("-- Compiled: %s %s --\n\r\n\r", __DATE__, __TIME__);
00246 printf("-- LED0 toggles on CAN message reception\n\r");
00247 printf("-- LED1 toggles on CAN message transmission\n\r");
00248 printf("-- CAN message transmission stopped while SW0 is pushed\n\r");
00249 printf("-- SW1 pushes alternate between standard CAN and CAN-FD\n\r");
00250
00251 SCB_EnableICache();
00252 SCB_EnableDCache();
00253
00254
00255 TimeTick_Configure();
00256
00257
00258 LED_Configure(0);
00259 #if 2 == LED_NUM
00260 LED_Configure(1);
00261 #endif
00262
00263
00264 _ConfigureTc();
00265
00266
00267
00268 MATRIX->CCFG_SYSIO |= (1u << 12);
00269
00270
00271 PIOB->PIO_PPDDR = 1 << 12;
00272 PIO_Configure(pushbutton, PIO_LISTSIZE(pushbutton));
00273
00274 PIO_SetDebounceFilter(&pushbutton[0], 10);
00275 #if 2 == BUTTON_NUM
00276 PIO_SetDebounceFilter(&pushbutton[1], 10000);
00277 #endif
00278
00279 SystemCoreClockUpdate();
00280
00281 MCAN_Init(&mcan1Config);
00282
00283 MCAN_InitFdBitRateSwitchEnable(&mcan1Config);
00284 MCAN_InitTxQueue(&mcan1Config);
00285 MCAN_InitLoopback(&mcan1Config);
00286 MCAN_Enable(&mcan1Config);
00287
00288 MCAN_IEnableMessageStoredToRxDedBuffer(&mcan1Config, CAN_INTR_LINE_1);
00289
00290 txMailbox0 = (uint32_t *)MCAN_ConfigTxDedBuffer(&mcan1Config, TX_BUFFER_0,
00291 MSG_ID_0, CAN_STD_ID, CAN_DLC_1);
00292 txMailbox1 = (uint32_t *)MCAN_ConfigTxDedBuffer(&mcan1Config, TX_BUFFER_1,
00293 MSG_ID_1, CAN_EXT_ID, CAN_DLC_8);
00294 MCAN_ConfigRxBufferFilter(&mcan1Config, RX_BUFFER_0, FILTER_0, MSG_ID_0,
00295 CAN_STD_ID);
00296 MCAN_ConfigRxBufferFilter(&mcan1Config, RX_BUFFER_1, FILTER_0, MSG_ID_1,
00297 CAN_EXT_ID);
00298 MCAN_ConfigRxClassicFilter(&mcan1Config, CAN_FIFO_0, FILTER_1, MSG_ID_2,
00299 CAN_STD_ID, MSG_ID_2_MASK);
00300
00301 while (1) {
00302 if (tick) {
00303 tick = 0;
00304 if (PIO_Get(&pushbutton[0]) == BUTTON_NOT_PUSHED) {
00305 if (button_state2 == BUTTON_NOT_PUSHED) {
00306
00307
00308 *txMailbox0 = MSG_ID_0_DATA1;
00309 MCAN_SendTxDedBuffer(&mcan1Config, TX_BUFFER_0);
00310 txdCntr++;
00311
00312 *txMailbox1 = MSG_ID_1_DATA1_4;
00313 *(txMailbox1 + 1) = MSG_ID_1_DATA5_8;
00314 MCAN_SendTxDedBuffer(&mcan1Config, TX_BUFFER_1);
00315 txdCntr++;
00316
00317 MCAN_AddToTxFifoQ(&mcan1Config, MSG_ID_2 + id_offset, CAN_STD_ID,
00318 CAN_DLC_1, &txData[0]);
00319 txdCntr++;
00320
00321
00322 id_offset = (id_offset + 1) & (uint32_t) ~MSG_ID_2_MASK;
00323
00324 txData[0]++;
00325 button_state2 = BUTTON_NOT_PUSHED;
00326 }
00327 } else {
00328 if (button_state2 == BUTTON_NOT_PUSHED)
00329 button_state2 = BUTTON_PUSHED;
00330 else
00331 button_state2 = BUTTON_NOT_PUSHED;
00332 }
00333 }
00334
00335 if (MCAN_IsTxComplete(&mcan1Config)) {
00336 MCAN_ClearTxComplete(&mcan1Config);
00337 if (MCAN_IsBufferTxd(&mcan1Config, TX_BUFFER_0)) {
00338 #if 2 == LED_NUM
00339 LED_Toggle(1);
00340 #endif
00341 }
00342 }
00343
00344 do {
00345 fifo_entries = MCAN_GetRxFifoBuffer(&mcan1Config, CAN_FIFO_0,
00346 (Mailbox64Type *) &rxMailbox2);
00347 if (fifo_entries > 0) rxdCntr++;
00348 } while (fifo_entries > 1);
00349
00350
00351 #if 2 == BUTTON_NUM
00352 if (PIO_Get(&pushbutton[1]) == BUTTON_NOT_PUSHED) {
00353 #else
00354 if (1) {
00355 #endif
00356 button_state = BUTTON_NOT_PUSHED;
00357 } else {
00358 if (button_state == BUTTON_NOT_PUSHED ) {
00359
00360 button_state = BUTTON_PUSHED;
00361 if (can_mode == CAN_STANDARD) {
00362 can_mode = CAN_FD;
00363 MCAN_RequestFdBitRateSwitch( &mcan1Config );
00364 } else {
00365 can_mode = CAN_STANDARD;
00366 MCAN_RequestIso11898_1( &mcan1Config );
00367 }
00368 }
00369 }
00370 #ifdef POLLKEYBOARD
00371
00372 if (DBG_IsRxReady()) {
00373 keyboard = DBG_GetChar();
00374 if (((char) keyboard == 'L' ) || ( (char) keyboard == 'l')) {
00375 if (loopback == 1) {
00376 MCAN_LoopbackOff(&mcan1Config);
00377 loopback = 0;
00378 } else {
00379 MCAN_LoopbackOn(&mcan1Config);
00380 loopback = 1;
00381 }
00382 }
00383 }
00384 #endif
00385 }
00386 }