Gast
#510866
Hallo,
ich versuche vergeblich den CAN-SPI-Adapter zum Laufen zu bringen.:
(Code komplett im Anhang)
int main(void)
{
SW_DDR &= ~(1 << SW0);
SW_DDR &= ~(1 << SW1);
SW_PORT |= (1 << SW0);
SW_PORT |= (1 << SW1);
LED_DDR |= (1 << LED); // LED auf Ausgang
LED_PORT &= ~(1 << LED); // LED EIN
initLCD(); // LCD-Display initialisieren
init_SPI_Master(); // SPI initialisieren
LCD_TextOut(" Init ");
initMCP2515();
LED_PORT |= (1 << LED); // LED AUS
}
int8_t initMCP2515(void)
{
uint8_t test;
char testtext[]= " .: ";
// Software-Reset durchführen
SPI_PORT &= ~(1<<SPI_SS);
asm("nop");
SPI_TX(MCP2515_RESET);
asm("nop");
SPI_PORT |= (1<<SPI_SS);
MCP2515_WRREG(MCP2515_CNF1,5);
asm("nop");
test = MCP2515_RDREG(MCP2515_CNF1);
testtext[1]=test+48;
LCD_TextOut(testtext);
if (test == 5)
{
LCD_TextOut("match");
}
else
{
LCD_TextOut("fail");
}
test = MCP2515_READ_STATUS();
testtext[1]=test+48;
LCD_TextOut(testtext);
return 0;
}
uint8_t MCP2515_WRREG(uint8_t Adresse, uint8_t Daten)
{
SPI_PORT &= ~(1<<SPI_SS);
asm("nop");
SPI_TX(MCP2515_WRITE);
asm("nop");
SPI_TX(Adresse);
asm("nop");
SPI_TX(Daten);
asm("nop");
SPI_PORT |= (1<<SPI_SS);
return 0;
}
uint8_t MCP2515_RDREG(uint8_t Adresse)
{
uint8_t Daten;
SPI_PORT &= ~(1<<SPI_SS);
asm("nop");
SPI_TX(MCP2515_READ);
asm("nop");
SPI_TX(Adresse);
asm("nop");
Daten= SPI_PUT(0xff);
SPI_PORT |= (1<<SPI_SS);
return Daten;
}
uint8_t MCP2515_READ_STATUS()
{
uint8_t Daten;
SPI_PORT &= ~(1<<SPI_SS);
asm("nop");
SPI_TX(MCP2515_READ_STAT);
asm("nop");
Daten= SPI_PUT(0xff);
SPI_PORT |= (1<<SPI_SS);
}
int8_t init_SPI_Master(void)
{
/* Set MOSI and SCK output, all others input */
SPI_DDR |= ((1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS));
SPI_PORT &= ~((1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_MISO));
SPI_PORT |= (1<<SPI_SS);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0));//|(1<<SPR1));
//SPSR = (1<<SPI2X);
return 0;
}
int8_t SPI_TX(int8_t cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
return 0;
}
int8_t SPI_RX(void)
{
return SPDR;
}
uint8_t SPI_PUT(uint8_t cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
hat da vielleicht jemand einen Tipp, woran es liegen könnte? Ausgabe ist
immer "0"!
MFG
Matthias

