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







Zitieren

Lesezeichen