- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 7 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 68

Thema: CAN - Controller Area Network

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795

    CAN - Controller Area Network

    Anzeige

    Praxistest und DIY Projekte
    Hallo Ihr!

    Wie man dem Titel schon antnehmen kann, geht es um den CAN-BUS.

    Ich möchte gerne mehrere Controller über den CAN-BUS verbinden.
    Zur Übermittlung von Temperaturen, Drehzahlen, Stellungswerten usw.

    Ich habe den CAN-BUS gewählt, weil:
    - er sicher ist
    - das Protokoll Identifier "besitzt", welche die gesendeten daten "identifizieren"
    - es ein bewährter Industriestandard ist.
    - er flexibel ist
    usw.

    Um dies zu realisieren habe ich mir kleine CAN-Module gebaut:

    Bild hier  

    Der Versuchsaufbau ist einfach:

    ATMEGA8535 ----- CAN-Modul ====CAN BUS ==== CAN-Modul ----- ATMEGA8535

    Ich hatte zuerst vorgehabt Kjion's Version einfach nachzubauen.
    https://www.roboternetz.de/phpBB2/vi...er=asc&start=0

    Aber dann würde ich die Sache wohl nie verstehen, und auch andere lassen die Finer davon, weil es zu aufwendig erscheint.

    Ich denke dass es nicht verkehrt ist, das Thema CAN mal von 0auf aufzuziehen, da es in den meisten Foren nie so richtig besprochen wird ( nur unter den Profis, für die das ein Klacks ist , respekt an Kjion! ), und weil CAN eigentlich ne coole Sache ist!


    Es wäre echt super, wenn sich dieses Thema in eine Schritt-für-Schritt - Anleitung für CAN über den MCP2515 entwickeln würde.


    ===============================================

    Ich denke der erste Schritt ist zunächst einmal eine Headerdatei zu erstellen, welche alle Register des MCP2515 beschreibt.

    Das war ursprünglich Kjion's Code!

    ==== Code wurde Aktualisiert, Siehe weiter unten ====

    Bitte verbessert mich!
    Was Fehlt,
    Was braucht man nicht,
    Was könnte man verbessern

    Ich bedanke mich!
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken img_1370.jpg  
    Gruß,
    Franz

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    So, nun gut,

    So wie ich das verstanden habe, muss man nun folgendes tun.

    Den MCP2515 Initialisieren...

    Um Daten zu senden:
    In einem Transmit-Buffer den Identifier und die Daten schreiben,
    und dann den Sendebefehl senden....

    Um Daten zu empfangen.
    Wenn eingestellt, dann löst der MCP2515 einen interrupt aus ( über den INT pin ) wenn daten empfangen wurden.
    Diese kann man dann aus den Reciever-Buffer auslesen.

    Eigentlich einfach....
    Jetzt fehlt mir nur noch der Code!

    fortsetzung folgt.!
    Gruß,
    Franz

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197

    Läuft was ?

    Ich habe interessiert mitgelesen, da ich auch mit CAN anfangen will. Ist der Code so in Ordnung? Hast du was getestet?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    dauert noch ne weile, bin noch im urlaub... Fortsetzung folgt
    Gruß,
    Franz

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Hallo,

    Wollte nur mal eben melden dass ich daran weiterarbeite!

    Leider habe ich schwierigkeiten das BIT-TIMING zu verstehen, evtl kann jemand Hilfestellung geben.

    Danke!
    Gruß,
    Franz

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    So, Nun mal wieder Zwischenergebnisse.

    Hier ist die neue mcp2515.h
    und auch schon die mcp2515.c

    Code:
    /******************************************************************************/
    /**********************  M C P 2 5 1 5   C O N T R O L  ***********************/
    /******************************* Kaiser Franz *********************************/
    /******************************************************************************/
    
    
    //|======================== MCP2515 Includes & Defines ========================|
    #include "mcp2515.h"
    
    //+============================================================================+
    //|=========================== Funktionen Übersicht ===========================|
    //============================================================================+
    	void mcp2515_init(void);												// MCP2515 Initialisation
    	void spi_init(void);													// SPI Initialisation
    	uint8_t spi_putc( uint8_t data );										// SPI Transmission
    	uint8_t mcp2515_read_register(uint8_t adress);							// Ein Register lesen
    	void mcp2515_write_register( uint8_t adress, uint8_t data );			// In ein Register schreiben
    	void mcp2515_bit_modify(uint8_t adress, uint8_t mask, uint8_t data);	// In einem Register ein Bit schreiben
    
    
    //+============================================================================+
    //|=========================== F U N K T I O N E N ============================|
    //+============================================================================+
    
    
    //|========================== MCP2515 Initialisation ==========================|
    void mcp2515_init(void)
    {
    //|------------------ SPI Interface initialisieren ------------------|
    	spi_init();
    
    
    //|------------- MCP2515 per Software Reset zurücksetzten -----------|	
    	PORTB &= ~(1<<SPI_CS);
    	spi_putc( SPI_RESET );
    	PORTB |= (1<<SPI_CS);
    
    
    //|---------- Device in den Konfigurations Modus versetzten ---------|	
    //|-------------------- CLKOUT Pin deaktivieren ---------------------|
    	mcp2515_bit_modify( CANCTRL, 0xE0, (1<<REQOP2) );
    
    
    //|------------------- Einstellen des Bit Timings -------------------|
    
    //	+------------------- Hilfe für das Bit Timing -----------------+
    //	|		Fosc 	   = 16MHz									   |
    //	|		BRP        = 7					( teilen durch 8 )	   |
    //	|		TQ = 2 * (BRP + 1) / Fosc		( => 1 ns )			   |
    //	|															   |
    //	|		Sync Seg   = 1 TQ									   |
    //	|		Prop Seg   = ( PRSEG  + 1 ) * TQ = 1 TQ				   |	
    //	|		Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 3 TQ				   |
    //	|		Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 3 TQ				   |
    //	|															   |
    //	|		Bus speed  = 1 / (Total # of TQ) * TQ				   |
    //	|			       = 1 / 8 * TQ = 125 kHz					   |
    //	+--------------------------------------------------------------+
    	
    	// BRP = 7
    	mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) );
    	
    	// Prop Seg und Phase Seg1 einstellen
    	mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) );
    	
    	// Phase Seg2 einstelen
    	mcp2515_write_register( CNF3, (1<<PHSEG21) );
    
    
    //|-------------- Einstellen der Rx Buffer Interrupts ---------------|
    	//mcp2515_write_register( CANINTE, (1<<RX1IE)|(1<<RX0IE) );
    
    
    //|--------------------- Buffer Operating Mode ----------------------|
    	// Buffer 0 : Empfangen aller Nachrichten, Infos Datasheet S.27
    	mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
    	
    	// Buffer 1 : Empfangen aller Nachrichten, Infos Datasheet S.28
    	mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );
    	
    
    //|--------- Device zurück in den normalen Modus versetzten ---------|
    	mcp2515_bit_modify( CANCTRL, 0xE0, 0);
    
    
    }
    
    
    
    //|============================ SPI Initialisation ============================|
    void spi_init(void)
    {
    //|----------- Aktivieren der Pins für das SPI Interface ------------|
    	DDRB  |= (1<<SPI_CS)|(1<<SPI_SCK)|(1<<SPI_MOSI);
    	PORTB |= (1<<SPI_CS);
    	PORTB &= ~(1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_MISO);
    	
    //|--- Aktivieren des SPI Master Interfaces, fosc = fclk / 4 --------|
    	SPCR = (1<<SPE)|(1<<MSTR)/*|(1<<SPIE)*/;
    	//SPSR = (1<<SPI2X);
    }
    
    
    
    //|============================= SPI Transmission =============================|
    uint8_t spi_putc( uint8_t data )
    {
    	// Sende ein Byte
    	SPDR = data;
    	
    	// Warten bis Byte gesendet wurde
    	while( !( SPSR & (1<<SPIF) ) );
    	
    	return SPDR;
    }
    
    
    
    //|============================ Ein Register lesen ============================|
    uint8_t mcp2515_read_register(uint8_t adress)
    {
    	uint8_t data;
    	
    	PORTB &= ~(1<<SPI_CS); 	// CS low
    	
    	spi_putc(SPI_READ);
    	
    	spi_putc(adress);
    	
    	data = spi_putc(0xff);	
    	
    	PORTB |= (1<<SPI_CS);		// CS high
    	
    	return data;
    }
    
    
    
    //|========================= In ein Register schreiben ========================|
    void mcp2515_write_register( uint8_t adress, uint8_t data )
    {
    	PORTB &= ~(1<<SPI_CS); 	// CS low
    	
    	spi_putc(SPI_WRITE);
    	
    	spi_putc(adress);
    	
    	spi_putc(data);
    	
    	PORTB |= (1<<SPI_CS);		// CS high
    }
    
    
    
    //|======= Mehrere hintereinanderliegende Register auf einmal schreiben =======|
    //Note: Das ist nur bei bestimmten stellen zu empfehlen, 
    //      zB dem Transmit-Daten-Puffer
    //Infos Datasheet S.63
    void mcp2515_write_register_f( uint8_t adress, uint8_t data, uint8_t length)
    {
    	uint8_t i;
    	
    	PORTB &= ~(1<<SPI_CS); 	// CS low
    	
    	spi_putc(SPI_WRITE);
    	
    	spi_putc(adress);
    	
    	for (i=0; i<length ;i++ )
    		spi_putc(*data++);
    	
    	PORTB |= (1<<SPI_CS);		// CS high
    }
    
    
    
    //|================ In einem Register einzelne Bits schreiben =================|
    // Note: Bit-Modify funktionjiert nicht bei allen Registern!
    // Nur die Bits, die mit der Maske "selektiert" wurden, können geändert werden,
    // Infos Datasheet S.64
    void mcp2515_bit_modify(uint8_t adress, uint8_t mask, uint8_t data)
    {
    	PORTB &= ~(1<<SPI_CS); 	// CS low
    	
    	spi_putc(SPI_BIT_MODIFY);
    	
    	spi_putc(adress);
    	
    	spi_putc(mask);
    	
    	spi_putc(data);
    
    	PORTB |= (1<<SPI_CS);		// CS high
    }

    Code:
    /******************************************************************************/
    /**********************  M C P 2 5 1 5   D E F I N E S  ***********************/
    /******************************* Kaiser Franz *********************************/
    /******************************************************************************/
    
    
    //|================================= SPI-Pins =================================|
    // ( Eingestellt für ATmega8535 ):
    #define	SPI_CS		4
    #define	SPI_MOSI	5
    #define	SPI_MISO	6
    #define	SPI_SCK		7
    
    //|============================== SPI Kommandos ===============================|
    #define SPI_RESET		0xC0
    #define	SPI_READ		0x03
    #define	SPI_READ_RX		0x90
    #define	SPI_WRITE		0x02
    #define	SPI_WRITE_TX	0x40
    #define	SPI_RTS			0x80
    #define SPI_READ_STATUS	0xA0
    #define	SPI_RX_STATUS	0xB0
    #define	SPI_BIT_MODIFY	0x05
    
    //|========================== Alle Register-Adressen ==========================|
    // Nicht aufgelistet: CANSTAT ( 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E)
    //					  CANCTRL ( 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F)
    // Siehe MCP2515 Datenblatt S.61
    
    #define RXF0SIDH	0x00
    #define RXF0SIDL	0x01
    #define RXF0EID8	0x02
    #define RXF0EID0	0x03
    #define RXF1SIDH	0x04
    #define RXF1SIDL	0x05
    #define RXF1EID8	0x06
    #define RXF1EID0	0x07
    #define RXF2SIDH	0x08
    #define RXF2SIDL	0x09
    #define RXF2EID8	0x0A
    #define RXF2EID0	0x0B
    #define BFPCTRL		0x0C
    #define TXRTSCTRL	0x0D
    #define CANSTAT		0x0E
    #define CANCTRL		0x0F
    
    #define RXF3SIDH	0x10
    #define RXF3SIDL	0x11
    #define RXF3EID8	0x12
    #define RXF3EID0	0x13
    #define RXF4SIDH	0x14
    #define RXF4SIDL	0x15
    #define RXF4EID8	0x16
    #define RXF4EID0	0x17
    #define RXF5SIDH	0x18
    #define RXF5SIDL	0x19
    #define RXF5EID8	0x1A
    #define RXF5EID0	0x1B
    #define TEC			0x1C
    #define REC         0x1D
    
    #define RXM0SIDH	0x20
    #define RXM0SIDL	0x21
    #define RXM0EID8	0x22
    #define RXM0EID0	0x23
    #define RXM1SIDH	0x24
    #define RXM1SIDL	0x25
    #define RXM1EID8	0x26
    #define RXM1EID0	0x27
    #define CNF3		0x28
    #define CNF2		0x29
    #define CNF1		0x2A
    #define CANINTE		0x2B
    #define CANINTF		0x2C
    #define EFLG		0x2D
    
    #define TXB0CTRL	0x30
    #define TXB0SIDH	0x31
    #define TXB0SIDL	0x32
    #define TXB0EID8	0x33
    #define TXB0EID0	0x34
    #define TXB0DLC		0x35
    #define TXB0D0		0x36
    #define TXB0D1		0x37
    #define TXB0D2		0x38
    #define TXB0D3		0x39
    #define TXB0D4		0x3A
    #define TXB0D5		0x3B
    #define TXB0D6		0x3C
    #define TXB0D7		0x3D
    
    #define TXB1CTRL	0x40
    #define TXB1SIDH	0x41
    #define TXB1SIDL	0x42
    #define TXB1EID8	0x43
    #define TXB1EID0	0x44
    #define TXB1DLC		0x45
    #define TXB1D0		0x46
    #define TXB1D1		0x47
    #define TXB1D2		0x48
    #define TXB1D3		0x49
    #define TXB1D4		0x4A
    #define TXB1D5		0x4B
    #define TXB1D6		0x4C
    #define TXB1D7		0x4D
    
    #define TXB2CTRL	0x50
    #define TXB2SIDH	0x51
    #define TXB2SIDL	0x52
    #define TXB2EID8	0x53
    #define TXB2EID0	0x54
    #define TXB2DLC		0x55
    #define TXB2D0		0x56
    #define TXB2D1		0x57
    #define TXB2D2		0x58
    #define TXB2D3		0x59
    #define TXB2D4		0x5A
    #define TXB2D5		0x5B
    #define TXB2D6		0x5C
    #define TXB2D7		0x5D
    
    #define RXB0CTRL	0x60
    #define RXB0SIDH	0x61
    #define RXB0SIDL	0x62
    #define RXB0EID8	0x63
    #define RXB0EID0	0x64
    #define RXB0DLC		0x65
    #define RXB0D0		0x66
    #define RXB0D1		0x67
    #define RXB0D2		0x68
    #define RXB0D3		0x69
    #define RXB0D4		0x6A
    #define RXB0D5		0x6B
    #define RXB0D6		0x6C
    #define RXB0D7		0x6D
    
    #define RXB1CTRL	0x70
    #define RXB1SIDH	0x71
    #define RXB1SIDL	0x72
    #define RXB1EID8	0x73
    #define RXB1EID0	0x74
    #define RXB1DLC		0x75
    #define RXB1D0		0x76
    #define RXB1D1		0x77
    #define RXB1D2		0x78
    #define RXB1D3		0x79
    #define RXB1D4		0x7A
    #define RXB1D5		0x7B
    #define RXB1D6		0x7C
    #define RXB1D7		0x7D
    
    //|============================= Bitdefinitionen ==============================|
    //                    Bitdefinition der verschiedenen Register
    
    //|------------------- Bitdefinition von BFPCTRL --------------------|
    #define B1BFS		5
    #define B0BFS		4
    #define B1BFE		3
    #define B0BFE		2
    #define B1BFM		1
    #define B0BFM		0
    
    //|------------------- Bitdefinition von TXRTSCTRL ------------------|
    #define B2RTS		5
    #define B1RTS		4
    #define B0RTS		3
    #define B2RTSM		2
    #define B1RTSM		1
    #define B0RTSM		0
    
    //|------------------- Bitdefinition von CANSTAT --------------------|
    #define OPMOD2		7
    #define OPMOD1		6
    #define OPMOD0		5
    #define ICOD2		3
    #define ICOD1		2
    #define ICOD0		1
    
    //|------------------- Bitdefinition von CANCTRL --------------------|
    #define REQOP2		7
    #define REQOP1		6
    #define REQOP0		5
    #define ABAT		4
    #define CLKEN		2
    #define CLKPRE1		1
    #define CLKPRE0		0
    
    //|------------------- Bitdefinition von CNF3 -----------------------|
    #define WAKFIL		6
    #define PHSEG22		2
    #define PHSEG21		1
    #define PHSEG20		0
    
    //|------------------- Bitdefinition von CNF2 -----------------------|
    #define BTLMODE		7
    #define SAM			6
    #define PHSEG12		5
    #define PHSEG11		4
    #define PHSEG10		3
    #define PHSEG2		2
    #define PHSEG1		1
    #define PHSEG0		0
    
    //|------------------- Bitdefinition von CNF1 -----------------------|
    #define SJW1		7
    #define SJW0		6
    #define BRP5		5
    #define BRP4		4
    #define BRP3		3
    #define BRP2		2
    #define BRP1		1
    #define BRP0		0
    
    //|------------------- Bitdefinition von CANINTE --------------------|
    #define MERRE		7
    #define WAKIE		6
    #define ERRIE		5
    #define TX2IE		4
    #define TX1IE		3
    #define TX0IE		2
    #define RX1IE		1
    #define RX0IE		0
    
    //|------------------- Bitdefinition von CANINTF --------------------|
    #define MERRF		7
    #define WAKIF		6
    #define ERRIF		5
    #define TX2IF		4
    #define TX1IF		3
    #define TX0IF		2
    #define RX1IF		1
    #define RX0IF		0
    
    //|------------------- Bitdefinition von EFLG -----------------------|
    #define RX1OVR		7
    #define RX0OVR		6
    #define TXB0		5
    #define TXEP		4
    #define RXEP		3
    #define TXWAR		2
    #define RXWAR		1
    #define EWARN		0
    
    
    //|------------------- Bitdefinition von TXBnCTRL -------------------|
    //                             ( n = 0, 1, 2 )
    #define ABTF		6
    #define MLOA		5
    #define TXERR		4
    #define TXREQ		3
    #define TXP1		1
    #define TXP0		0
    
    //|------------------- Bitdefinition von RXB0CTRL -------------------|
    #define RXM1		6
    #define RXM0		5
    #define RXRTR		3
    #define BUKT		2
    #define BUKT1		1
    #define FILHIT0		0
    
    //|------------------- Bitdefinition von TXBnSIDL -------------------|
    //                            ( n = 0, 1 )
    #define	EXIDE		3
    
    //|------------------- Bitdefinition von RXB1CTRL -------------------|
    //RXM1, RXM0, RXRTR und FILHIT0 sind schon für RXB0CTRL definiert
    #define FILHIT2		2
    #define FILHIT1		1
    
    //|------------------- Bitdefinition von RXBnSIDL -------------------|
    //                            ( n = 0, 1 )
    #define	SRR			4
    #define	IDE			3
    
    //|------------------- Bitdefinition von RXBnDLC BZW. TXBnDLC -------|
    //                      ( n = 0, 1 ) BZW. ( n = 0, 1, 2 )
    #define	RTR			6
    #define	DLC3		3
    #define	DLC2		2
    #define	DLC1		1
    #define DLC0		0

    Damit kann man schon was anfangen.
    Arbeite heute daran mal endlich was zu versenden

    Bitte beachtet, dass ich die Alten Codes immer rauslösche wenn ich neue Poste, welche dieselbe Datei betreffen
    Gruß,
    Franz

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Hallo,

    Was haltet Ihr von dieser Transmit-Funktion?
    Mit Autosuche nach einem freien Transmit-Puffer,
    Priorität einstellbar,
    Remotetransmit einschaltbar,
    11Bit Standart Identifyer,
    16Bit Extended identifyer, ( wer hier die 18 Bit haben will, muss sich halt das nötige daruproggen, aber ich denke kaum dass von uns jemand überhaupt einen Extended identifyer braucht )
    8-DatenBytes

    Bitte Verbessert mich!

    Code:
    // CAN-Sendefunktion:              Priorität|      Remote|          SID|          EID|        Daten|     Datenlänge|
    // 						                 0-3|         0-1|      11 Bits|      16 Bits|     1-8Stück|    =Anz. Daten|
    void mcp2515_can_transmit(uint8_t prioritiy, uint8_t rtr, uint16_t sid, uint16_t eid, uint8_t data, uint8_t length)
    {
    
    //|========================= Freien Sendepuffer suchen ========================|
    	uint8_t buffer[4];
    
    	buffer[0] = mcp2515_read_register(0x30);
    	buffer[1] = mcp2515_read_register(0x40);
    	buffer[2] = mcp2515_read_register(0x50);
    
    	if ( buffer[2] !& (1<<TXREQ) ){ buffer[3] = 0x50; }
    	if ( buffer[1] !& (1<<TXREQ) ){ buffer[3] = 0x40; }
    	if ( buffer[0] !& (1<<TXREQ) ){ buffer[3] = 0x30; }
    	
    
    //|============================= Bytes vorbereiten ============================|
    	uint8_t x[6];
    
    	// Byte für TXBnCTRL vorbereiten, Datasheet S.18, TRANSMIT BUFFER n CONTROL REGISTER
    	if(priority > 3){ priority = 3; }
    	x[0] = ( priority );
    
    	// Byte für TXBnSIDH vorbereiten, Datasheet S.19, TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
    	x[1] = ( sid >> 3 );
    	
    	// Byte für TXBnSIDL vorbereiten, Datasheet S.20, TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
    	if(eid){ x[2] = ( 5 << sid ) + 0b00001000; }
    	   else{ x[2] = ( 5 << sid ); }
    	
    	// Byte für TXBnEID8 vorbereiten, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
    	x[3] = ( eid >> 8 );
    
    	// Byte für TXBnEID0 vorbereiten, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
    	x[4] = ( eid );
    
    	// Byte für TXBnDLC  vorbereiten, Datasheet S.21, TRANSMIT BUFFER n DATA LENGTH CODE
    	if(length > 8){ length = 8; }
    	if(RTR){ x[5] = length + 0b01000000; }
    	   else{ x[5] = length; }	
    
    
    //|============================= Bytes übertragen =============================|
    
    	PORTB &= ~(1<<SPI_CS); 	// CS low
    	
    	spi_putc(SPI_WRITE);		// Write condition
    	
    	spi_putc(buffer[3]);		// TXBnCTRL von Puffer n adressieren
    	
    	spi_putc(x[0]);				// in TXBnCTRL schreiben, Datasheet S.18, TRANSMIT BUFFER n CONTROL REGISTER 
    	
    	spi_putc(x[1]);				// in TXBnSIDH schreiben, Datasheet S.19, TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
    	
    	spi_putc(x[2]);				// in TXBnSIDL schreiben, Datasheet S.20, TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
    	
    	spi_putc(x[3]);				// in TXBnEID8 schreiben, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
    	
    	spi_putc(x[4]);				// in TXBnEID0 schreiben, Datasheet S.20, TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
    	
    	spi_putc(x[5]);				// in TXBnDLC  schreiben, Datasheet S.21, TRANSMIT BUFFER n DATA LENGTH CODE
    
    	while(length > 1){			// in TXBnDm   schreiben, Datasheet S.21, TRANSMIT BUFFER n DATA BYTE m
    		spi_putc(*data++);
    		length--;
    	}
    
    	PORTB |= (1<<SPI_CS);		// CS high
    
    
    //|=========================== Übertragung Starten ============================|
    
    	// TXREQ setzen, um Transmission zu starten
    	mcp2515_bit_modify(buffer[3], TXREQ, TXREQ);  
    
    }
    Gruß,
    Franz

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Hallo CANer,

    Kjion hat sich entschieden ein Tutorial über den MCP2515 zu schreiben.

    Ich bin mir sicher dass hier bald der Link auftauchen wird, sobald er fertig ist.

    Soll aber kein Grund sein, hier nicht weiter über dieses Thema zu plaudern.

    Ich bedanke mich bei Kjion, dass er diese Aufgabe in die Hand genommen hat.
    Gruß,
    Franz

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Zitat Zitat von Kaiser-F
    Ich bin mir sicher dass hier bald der Link auftauchen wird, sobald er fertig ist.
    ... und hier ist auch der versprochene Link
    http://www.kreatives-chaos.com/index.php?seite=mcp2515

    MfG Kjion

Seite 1 von 7 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen