Ähm ich meinte eigentlich rund 10 Nanosekunden, also 150 nop-Befehle, hatte das verwechselt. SPI läuft auch bei mir mit fosc/2.
@pongi: MCP2515 ist ein externer CAN-Controller. Das mit der Anlaufzeit klingt zwar einleuchtend, aber ich habe bisher noch nirgends einen Beispielcode gesehen, der wirklich zwischen Reset und dem Konfigurieren der Register eine Zeit lang wartet. Im Datenblatt kann ich dazu auch nichts finden.
Mein Code:
Code:
// Enable SPI, Master, set clock rate fck/2 -> 8 MHz
SPCR = (1<<SPE) | (1<<MSTR);
SPSR = (1<<SPI2X);
mcp2515_reset();
mcp2515_write(BFPCTRL, (1<<B0BFS) | (1<<B0BFE)); // Enable LED at RX0BF-Pin
Code:
uint8_t spi_putc(uint8_t data)
{
SPDR = data;
while (!(SPSR & (1<<SPIF))) ;
return SPDR;
}
void mcp2515_reset()
{
PORTB &= ~(0b00000100); // Chip Select low
spi_putc(0xC0);
PORTB |= 0b00000100; // Chip Select high
}
void mcp2515_write(uint8_t address, uint8_t data)
{
PORTB &= ~(0b00000100); // Chip Select low
spi_putc(0x02);
spi_putc(address);
spi_putc(data);
PORTB |= 0b00000100; // Chip Select high
}
Wenn ich den Code so ausführe geht die LED nicht an (auch wenn ich in ein anderes Register schreibe und das Register wieder auslese, wurde der Wert darin nicht gespeichert). Aber wenn ich zwischen dem Reset und dem Write eben die 150 nop-Befehle warte, DANN funktioniert der Code.
Lesezeichen