30 void accessBuffer(
uint8_t buffer) {
32 while ((CAN_IF1CREQ &
_BV(CAN_IFCREQ_BUSY))) {};
34 #pragma inline accessBuffer
48 CAN_COER |=
_BV(CAN_COER_OE);
54 CAN_CTRLR =
_BV(CAN_CTRLR_INIT);
57 CAN_CTRLR |=
_BV(CAN_CTRLR_CCE);
59 CAN_CTRLR |=
_BV(CAN_CTRLR_EIE) |
_BV(CAN_CTRLR_IE) |
_BV(CAN_CTRLR_SIE);
60 CAN_BTR = (prescaler - 1) & CAN_BTR_BRP_MASK;
61 CAN_BTR |= ((propSeg + phSeg1 - 1) << CAN_BTR_TSEG1_SHIFT) & CAN_BTR_TSEG1_MASK;
62 CAN_BTR |= ((phSeg2 - 1) << CAN_BTR_TSEG2_SHIFT) & CAN_BTR_TSEG2_MASK;
63 CAN_BTR |= ((jumpWidth - 1) << CAN_BTR_SJW_SHIFT) & CAN_BTR_SJW_MASK;
65 CAN_CTRLR &= ~
_BV(CAN_CTRLR_CCE);
69 CAN_IF1ARB &= ~
_BV(CAN_IFARB_MSGVAL);
70 CAN_IF1CMSK =
_BV(CAN_IFCMSK_WRRD) |
_BV(CAN_IFCMSK_ARB);
75 CAN_CTRLR &= ~
_BV(CAN_CTRLR_INIT);
91 CAN_IF1ARB |=
_BV(CAN_IFARB_XTD);
100 CAN_IF1ARB |=
_BV(CAN_IFARB_DIR);
104 CAN_IF1ARB |=
_BV(CAN_IFARB_MSGVAL);
108 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_UMASK);
111 CAN_IF1MSK |=
_BV(CAN_IFMSK_MDIR);
114 CAN_IF1MSK |=
_BV(CAN_IFMSK_MXTD);
118 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_RXIE);
121 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_TXIE);
124 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_EOB);
127 CAN_IF1CMSK =
_BV(CAN_IFCMSK_WRRD) |
_BV(CAN_IFCMSK_MASK) |
_BV(CAN_IFCMSK_ARB)
128 |
_BV(CAN_IFCMSK_CONTROL);
131 accessBuffer(buffer);
140 CAN_IF1CMSK =
_BV(CAN_IFCMSK_CONTROL);
141 accessBuffer(buffer);
145 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_RMTEN);
147 CAN_IF1MCTR &= ~
_BV(CAN_IFMCTR_RMTEN);
150 CAN_IF1CMSK =
_BV(CAN_IFCMSK_WRRD) |
_BV(CAN_IFCMSK_CONTROL);
153 accessBuffer(buffer);
163 CAN_IF1CMSK =
_BV(CAN_IFCMSK_CONTROL);
164 accessBuffer(buffer);
167 CAN_IF1MCTR &= ~CAN_IFMCTR_DLC_MASK;
168 CAN_IF1MCTR |= len & CAN_IFMCTR_DLC_MASK;
172 CAN_IF1DTB = *((
uint32_t*) (data + 4));
175 CAN_IF1CMSK =
_BV(CAN_IFCMSK_WRRD) |
_BV(CAN_IFCMSK_CONTROL) |
_BV(CAN_IFCMSK_DATAA)
176 |
_BV(CAN_IFCMSK_DATAB);
179 accessBuffer(buffer);
187 CAN_IF1CMSK =
_BV(CAN_IFCMSK_CONTROL);
188 accessBuffer(buffer);
191 CAN_IF1MCTR |=
_BV(CAN_IFMCTR_NEWDAT);
194 CAN_IF1CMSK =
_BV(CAN_IFCMSK_WRRD) |
_BV(CAN_IFCMSK_CONTROL) |
_BV(CAN_IFCMSK_TXREQ);
197 accessBuffer(buffer);
210 return (tmp &
_BV(buffer-1)) > 0 ? buffer : 0;
213 for (; (tmp & 1) == 0; tmp >> 1, i++);
225 CAN_IF1CMSK =
_BV(CAN_IFCMSK_CONTROL) |
_BV(CAN_IFCMSK_ARB) |
_BV(CAN_IFCMSK_CIP) |
_BV(CAN_IFCMSK_TXREQ) |
_BV(CAN_IFCMSK_DATAB) |
_BV(CAN_IFCMSK_DATAA);
226 accessBuffer(buffer);
228 len = (
uint8_t)(CAN_IF1MCTR & CAN_IFMCTR_DLC_MASK);
231 *((
uint32_t*) (data + 4)) = CAN_IF1DTB;
233 *
id = CAN_IF1ARB & CAN_IFARB_ID_MASK;
#define CAN_BUF_MASK_DIRECTION
uint8_t can_config_buffer(uint8_t buffer, uint32_t id, uint8_t options, uint8_t maskOptions, uint32_t idMask)
#define CAN_BUF_OPT_TRANSMIT
#define CAN_RX_BIT
Bit in the input enable register of the CAN input pin.
#define CAN_BUF_OPT_TX_INTERRUPT
#define ID_TO_STDFRAME(id)
#define CAN_RX_ENABLE
Input enable register which contains the CAN input pin.
uint8_t can_set_buffer_autoreply(uint8_t buffer, uint8_t enable)
#define CAN_BUF_OPT_ENABLED
uint8_t can_set_buffer_data(uint8_t buffer, uint8_t *data, uint8_t len)
#define CAN_BUF_OPT_EXTENDED
#define ID_TO_EXTFRAME(id)
int8_t can_buffer_getData(uint8_t buffer, uint8_t *data, uint32_t *id)
#define CAN_BUFFERCOUNT
Number of CAN buffers in the CAN engine of the controller.
#define CAN_BUF_MASK_EXTENDED
uint8_t can_init(uint8_t prescaler, uint8_t propSeg, uint8_t phSeg1, uint8_t phSeg2, uint8_t jumpWidth, uint8_t interrupts)
uint8_t can_buffer_newData(uint8_t buffer)
#define RETURN_ERROR(value, max)
#define CAN_BUF_OPT_RX_INTERRUPT
uint8_t can_send_buffer(uint8_t buffer)