32 #ifdef SUPPORT_FOR_AT90CAN__
34 #include <avr/pgmspace.h>
84 #if CAN_RX_BUFFER_SIZE > 0
88 volatile uint8_t _messages_waiting;
91 #if CAN_TX_BUFFER_SIZE > 0
95 volatile uint8_t _transmission_in_progress = 0;
105 #if CAN_TX_BUFFER_SIZE == 0
106 if (_free_buffer == 0)
108 #elif CAN_FORCE_TX_ORDER
109 if (_transmission_in_progress)
114 for (i = 0;i < 15;i++)
120 if ((CANCDMOB & ((1 << CONMOB1) | (1 << CONMOB0))) == 0)
130 void _disable_mob_interrupt(
uint8_t mob)
133 CANIE2 &= ~(1 << mob);
135 CANIE1 &= ~(1 << (mob - 8));
141 void _enable_mob_interrupt(
uint8_t mob)
144 CANIE2 |= (1 << mob);
146 CANIE1 |= (1 << (mob - 8));
151 bool at90can_init(
uint8_t bitrate)
157 CANGCON |= (1 << SWRES);
161 CANBT1 = pgm_read_byte(&_at90can_cnf[bitrate][0]);
162 CANBT2 = pgm_read_byte(&_at90can_cnf[bitrate][1]);
163 CANBT3 = pgm_read_byte(&_at90can_cnf[bitrate][2]);
167 CANGIE = (1 << ENIT) | (1 << ENRX) | (1 << ENTX);
174 at90can_disable_filter( 0xff );
176 #if CAN_RX_BUFFER_SIZE > 0
180 #if CAN_TX_BUFFER_SIZE > 0
185 CANGCON = (1 << ENASTB);
199 if ((CANHPMOB & 0xF0) != 0xF0)
205 CANPAGE = CANHPMOB & 0xF0;
206 mob = (CANHPMOB >> 4);
209 if (CANSTMOB & (1 << TXOK))
215 #if CAN_TX_BUFFER_SIZE > 0
221 at90can_copy_message_to_mob( buf );
225 CANCDMOB |= (1<<CONMOB0);
229 _disable_mob_interrupt(mob);
230 _transmission_in_progress = 0;
237 CANIE2 &= ~(1 << mob);
239 CANIE1 &= ~(1 << (mob - 8));
246 #if CAN_RX_BUFFER_SIZE > 0
252 at90can_copy_mob_to_message( buf );
264 CANCDMOB = (1 << CONMOB1) | (CANCDMOB & (1 <<
IDE));
270 CANIE2 &= ~(1 << mob);
272 CANIE1 &= ~(1 << (mob - 8));
292 #endif // SUPPORT_FOR_AT90CAN__