Gast
#3556613
Hallo zusammen, ich habe zwar schon etwas in C programmiert, aber das Thema hardwarenahe bzw. uC-Programmierung ist ziemlich neu für mich. Ich habe den folgenden Aufbau (Arduino Uno + CANdiy-Shield): https://github.com/watterott/CANdiy-Shield/blob/master/pcb/CANdiy-Shield_v13.pdf?raw=true Das CANdiy-Shield beinhaltet hauptsächlich einen MCP2515 CAN-Controller und MCP2551 CAN-Transceiver. Die Verbindung zum ATmega328 ist im oberen Link ersichtlicht. MCP2515-Datenblatt: http://ww1.microchip.com/downloads/en/DeviceDoc/21801G.pdf MCP2551-Datenblatt: http://ww1.microchip.com/downloads/en/DeviceDoc/21667f.pdf ATmega328-Datenblatt: http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Summary.pdf Ich konnte über das Atmel Studio 6.1 ein simples Programm auf den Atmega328 übertragen, womit LEDs angesteuert wurden. Als nächstes möchte ich eine CAN-Botschaft in einem CAN-Bus absetzen und habe dazu folgendes Tutorial gefunden: http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515#receive Jetzt kann ich aber schon die Initialisierung des SPI-Interface nicht ganz nachvollziehen. Hier der C-Code: void spi_init(void) { // Aktivieren der Pins für das SPI Interface DDR_SPI |= (1<<P_SCK)|(1<<P_MOSI); PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO)); DDR_CS |= (1<<P_CS); PORT_CS |= (1<<P_CS); // Aktivieren des SPI Master Interfaces, fosc = fclk / 2 SPCR = (1<<SPE)|(1<<MSTR); SPSR = (1<<SPI2X); } Ich könnte natürlich das Ganze Tutorial kopieren, aber ich würde diesen Code auch gerne nachvollziehen. DDR und PORT dient dazu die Datenrichtung bzw. den Ausgang zu definieren, auch Bitweise UND/ODER kann ich nachvollziehen, aber wozu das BIT KOMPLEMENT und wozu wird z.B. P_SCK/P_MOSI/P_CS um 1 digit nach links (<<) verschoben? Wenn im Laufe des Tutorials weitere Unklarheiten ergeben, würde ich gerne weiterhin diesen Thread nutzen. Danke. LG