// ----------------------------------------------------------------------------
void sja1000_set_mode(can_mode_t mode)
{
	uint8_t reg = 0;
	
	// enter reset mode
	sja1000_write(MOD, (1<<AFM) | (1<<RM));
	
	if (mode == LISTEN_ONLY_MODE) {
		reg = (1<<LOM);
	}
	else if (mode == LOOPBACK_MODE) {
		reg = (1<<STM);
	}
	
	// set new mode
	sja1000_write(MOD, (1<<AFM) | (1<<RM) | reg);
	
	// leave reset mode
	sja1000_write(MOD, (1<<AFM) | reg);
}
uint8_t sja1000_send_message(const can_t *msg)
{
	uint8_t frame_info;
	uint8_t address;
	
	if (!sja1000_check_free_buffer() || (msg->length > 8))
		return FALSE;
	
	frame_info = msg->length | ((msg->flags.rtr) ? (1<<RTR) : 0);
	
	if (msg->flags.extended)
	{
		// write frame info
		sja1000_write(TX_INFO, frame_info | (1<<FF));
		
		// write extended identifier
		sja1000_write(20, msg->id << 3);
		sja1000_write(19, msg->id >> 5);
		sja1000_write(18, msg->id >> 13);
		sja1000_write(17, msg->id >> 21);
		
		address = 21;
	}
Beispiel #3
0
bool sja1000_init(uint8_t bitrate)
{
	if (bitrate >= 8)
		return false;

	#if !SJA1000_MEMORY_MAPPED
		SET(SJA1000_WR);
		SET(SJA1000_RD);
		RESET(SJA1000_ALE);
		RESET(SJA1000_CS);

		SET_OUTPUT(SJA1000_WR);
		SET_OUTPUT(SJA1000_RD);
		SET_OUTPUT(SJA1000_ALE);

		SET_OUTPUT(SJA1000_CS);
		DDR(SJA1000_DATA) = 0xff;
	#endif

	// enter reset mode
	sja1000_write(MOD, (1<<RM)|(1<<AFM));

	// choose PeliCAN-Mode
	sja1000_write(CDR, (1<<CANMODE) | SJA1000_CLOCK_REGISTER);

	// select the bitrate configuration
	sja1000_write(BTR0, pgm_read_byte(&_sja1000_cnf[bitrate][0]));
	sja1000_write(BTR1, pgm_read_byte(&_sja1000_cnf[bitrate][1]));

	// filter are not practical useable, so we disable them
	sja1000_write(AMR0, 0xff);
	sja1000_write(AMR1, 0xff);
	sja1000_write(AMR2, 0xff);
	sja1000_write(AMR3, 0xff);

	// set output driver configuration
	sja1000_write(OCR, (1<<OCTP0)|(1<<OCTN0)|(1<<OCMODE1));

	// enable receive interrupt
	sja1000_write(IER, (1<<RIE));

	// leave reset-mode
	sja1000_write(MOD, (1<<AFM));

	return true;
}
// ----------------------------------------------------------------------------
void sja1000_reset_bus_off(void)
{
    uint8_t status = sja1000_read(SR) & (1<<BS);
    sja1000_write(SR, status & ~(1<<BS));
}