46 C1CTRL1bits.CANCKS = ECAN_FCAN_IS_FCY;
48 C1CFG2 = ECAN_NO_WAKEUP |
51 ECAN_SEG2_PROGRAMMABLE |
55 C1CFG1 = ECAN_SYNC_JUMP_4 |
59 #warning ECAN module not configured! Edit function configECAN1()
64 #define NUM_TX_BUFS 1 //reserve 1 for TX
65 #define NUM_BUFS 2 //make this a power of 2 for the alignment to work or enter alignment manually
66 ECANMSG msgBuf[NUM_BUFS] __attribute__((space(dma),aligned(NUM_BUFS*16)));
69 #define MSG_ID 0x7A0 //arbitrary choice for 11-bit messsage ID
72 void configDMA0(
void) {
75 DMA0PAD = (
unsigned int) &C1TXD;
76 DMA0REQ = DMA_IRQ_ECAN1TX;
77 DMA0STA = __builtin_dmaoffset(msgBuf);
78 DMA0CNT =
sizeof(ECANMSG)/2 -1;
82 DMA_DIR_WRITE_PERIPHERAL |
85 DMA_AMODE_PERIPHERAL_INDIRECT |
90 void configDMA1(
void) {
92 DMA1PAD = (
unsigned int) &C1RXD;
93 DMA1REQ = DMA_IRQ_ECAN1RX;
94 DMA1STA = __builtin_dmaoffset(msgBuf);
95 DMA1CNT =
sizeof(ECANMSG)/2 -1;
99 DMA_DIR_READ_PERIPHERAL |
102 DMA_AMODE_PERIPHERAL_INDIRECT |
103 DMA_MODE_CONTINUOUS);
107 #define RX_BUFFER_ID 1
111 CHANGE_MODE_ECAN1(ECAN_MODE_CONFIGURE);
120 for (u8_i = 0; u8_i<8; u8_i++) {
121 if (u8_i < NUM_TX_BUFS)
129 CHANGE_MODE_ECAN1(ECAN_MODE_NORMAL);
135 u32_x = u32_x | 0x8000;
136 }
else u32_x = u32_x >> 1;
141 uint32_t u32_out0, u32_out1, u32_in0, u32_in1;
146 CHANGE_MODE_ECAN1(ECAN_MODE_LOOPBACK);
147 u32_out0 = 0xFEDCBA98;
148 u32_out1 = 0x76543210;
152 msgBuf[0].data.u32[0] = u32_out0;
153 msgBuf[0].data.u32[1] = u32_out1;
163 printf(
"Message ID 0x%X rejected by acceptance filter.\n",MSG_ID+u8_cnt);
166 rx_buff_id = RX_BUFFER_ID;
167 u32_in0 = msgBuf[rx_buff_id].data.u32[0];
168 u32_in1 = msgBuf[rx_buff_id].data.u32[1];
169 printf(
"Msg ID: 0x%X, Out: 0x%lx%lx, In: 0x%lx%lx\n",
170 msgBuf[rx_buff_id].w0.SID,u32_out0, u32_out1, u32_in0, u32_in1 );
173 u32_out0 = rrot32(u32_out0);
174 u32_out1 = rrot32(u32_out1);
176 if (u8_cnt == 8) u8_cnt = 0;