diff options
Diffstat (limited to 'can.c')
-rw-r--r-- | can.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -24,13 +24,6 @@ #ifndef R0KET #define spi_ss(x) PORTB = ((x) << B_SS) | 0x3; -static volatile bool canint = false; - -ISR(INT0_vect) -{ - canint = true; -} - static uint8_t spi_wrrd(uint8_t out) { SPDR = out; @@ -152,6 +145,9 @@ union { } can_rx_addr; uint8_t can_rx_dlc, can_rx_data[8]; +#define can_rx_avail() (can_rx_addr.u) +#define can_rx_pop() do { can_rx_addr.u = 0; } while (0) + static void can_rxh(uint8_t buffer) { uint8_t c, byte; @@ -162,6 +158,14 @@ static void can_rxh(uint8_t buffer) uart_puts("can: RX0IF\n"); spi_ss(0); spi_wrrd(0x90 + 0x04 * buffer); + + if (can_rx_addr.u) { + spi_wrrd(0xff); + spi_ss(1); + uart_puts("-- CAN RX overrun\n"); + return; + }; + c = 0; #define rdaddr() byte = spi_wrrd(0xff); uart_puthex(byte); can_rx_addr.b[c++] = byte rdaddr(); @@ -180,7 +184,7 @@ static void can_rxh(uint8_t buffer) spi_ss(1); } -static void can_int(void) +ISR(INT0_vect) { uint8_t canintf, eflg, canstat; @@ -230,6 +234,8 @@ static void can_int(void) static void can_preinit(void) { + can_rx_addr.u = 0; + spi_ss(1); #ifndef R0KET DDRB |= (1 << B_SCK) | (1 << B_MOSI) | (1 << B_SS); |