Problem med SPI mellan PIC18F4550 och MCP2515
Postat: 30 januari 2011, 16:14:44
Hej!
Jag har lite problem med att skriva till registren i CAN-controllern MCP2515. Jag använder HI-TECH C kompilatorn tillsammans med MPLAB och SPI funktionerna är mina egna. Problemet är att när jag försöker skriva till ett register och sedan läsa registret igen får jag tillbaka 0x00, 0xFF eller något annat random. Jag provade därför att skriva ett litet program i mikroC och använde det inbyggda biblioteket för SPI men mina egna funktioner för att skriva till CAN-controllern och fick då tillbaka rätt data. Sedan provade jag att använda min egen init-kod för SPI modulen och min egen Read funktion vilket också fungerar. Men använder jag min egen Write funktion funkar det inte varefter det borde vara något fel i denna men jag vet inte vad.
Koden jag använder mig av är:
Använder en 20 MHz kristall med 22 pF kondingar till CAN-controllern och kör PICen i 48 MHz (använder USB också).
Tacksam för all hjälp jag kan få!
Jag har lite problem med att skriva till registren i CAN-controllern MCP2515. Jag använder HI-TECH C kompilatorn tillsammans med MPLAB och SPI funktionerna är mina egna. Problemet är att när jag försöker skriva till ett register och sedan läsa registret igen får jag tillbaka 0x00, 0xFF eller något annat random. Jag provade därför att skriva ett litet program i mikroC och använde det inbyggda biblioteket för SPI men mina egna funktioner för att skriva till CAN-controllern och fick då tillbaka rätt data. Sedan provade jag att använda min egen init-kod för SPI modulen och min egen Read funktion vilket också fungerar. Men använder jag min egen Write funktion funkar det inte varefter det borde vara något fel i denna men jag vet inte vad.
Koden jag använder mig av är:
Kod: Markera allt
// =========================
// CAN
// =========================
LATB.RB3 = 0; // Chip Select
SPI1_Write(0x05); // Bit Modify Command
SPI1_Write(0x0F); // Address
SPI1_Write(0xE0); // Mask
SPI1_Write(0x40); // Data (Loopback Mode)
LATB.RB3 = 1; // Chip Select
LATB.RB3 = 0; // Chip Select
SPI1_Write(0x03); // Read Command
SPI1_Write(0x0E); // Address
OperationMode = SPI_Read(0x00); // Read data
LATB.RB3 = 1; // Chip Select
// =========================
// SPI
// =========================
void SPI_Init(void)
{
SSPCON1.SSPEN = 0; // Disable serial port
SSPCON1 = 0x01; // Master mode, Fosc/16
SSPCON1.CKP = 0; // Mode 0,0
SSPSTAT.CKE = 1;
SSPSTAT.SMP = 0; // Data sampled at middle
SSPCON1.SSPEN = 1; // Enable serial port
}
unsigned char SPI_Read(unsigned char DummyData)
{
SSPBUF = DummyData;
while (!SSPSTAT.BF);
return (SSPBUF);
}
void SPI_Write(unsigned char Data)
{
unsigned char Temp;
SSPBUF = Data;
while (!SSPSTAT.BF);
Temp = SSPBUF;
}
Tacksam för all hjälp jag kan få!