From fdcb017d418267ec219857d310916d318925c880 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 5 Dec 2011 19:21:19 +0100 Subject: [PATCH] SPI initialization fix. Seems working need more testing --- hardware/sam/libraries/SPI/SPI.cpp | 24 +++++++++++++++++++++--- hardware/sam/libraries/SPI/SPI.h | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/hardware/sam/libraries/SPI/SPI.cpp b/hardware/sam/libraries/SPI/SPI.cpp index 8b3ab0fd3..bd7a6433a 100644 --- a/hardware/sam/libraries/SPI/SPI.cpp +++ b/hardware/sam/libraries/SPI/SPI.cpp @@ -10,13 +10,16 @@ #include "SPI.h" -SPIClass::SPIClass(Spi *_spi, uint32_t _id) : spi(_spi), id(_id) { +SPIClass::SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void)) : + spi(_spi), id(_id), initCb(_initCb) { // Empty } void SPIClass::begin() { + initCb(); + // Set CS on NPCS3 - SPI_Configure(spi, id, SPI_MR_MSTR | SPI_MR_PS | SPI_MR_PCS(0x07)); + SPI_Configure(spi, id, SPI_MR_MSTR | SPI_MR_PCS(0x07)); SPI_Enable( spi); setClockDivider(1); } @@ -53,5 +56,20 @@ void SPIClass::detachInterrupt(void) { } #if SPI_INTERFACES_COUNT > 0 -SPIClass SPI0(SPI_INTERFACE, SPI_INTERFACE_ID); +static void SPI0_Init(void) { + PIO_Configure(g_APinDescription[PIN_SPI_MOSI].pPort, + g_APinDescription[PIN_SPI_MOSI].ulPinType, + g_APinDescription[PIN_SPI_MOSI].ulPin, + g_APinDescription[PIN_SPI_MOSI].ulPinConfiguration); + PIO_Configure(g_APinDescription[PIN_SPI_MISO].pPort, + g_APinDescription[PIN_SPI_MISO].ulPinType, + g_APinDescription[PIN_SPI_MISO].ulPin, + g_APinDescription[PIN_SPI_MISO].ulPinConfiguration); + PIO_Configure(g_APinDescription[PIN_SPI_SCK].pPort, + g_APinDescription[PIN_SPI_SCK].ulPinType, + g_APinDescription[PIN_SPI_SCK].ulPin, + g_APinDescription[PIN_SPI_SCK].ulPinConfiguration); +} + +SPIClass SPI0(SPI_INTERFACE, SPI_INTERFACE_ID, SPI0_Init); #endif diff --git a/hardware/sam/libraries/SPI/SPI.h b/hardware/sam/libraries/SPI/SPI.h index 1bc39a0e2..ceeaa3f52 100644 --- a/hardware/sam/libraries/SPI/SPI.h +++ b/hardware/sam/libraries/SPI/SPI.h @@ -34,7 +34,7 @@ class SPIClass { public: - SPIClass(Spi *_spi, uint32_t _id); + SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void)); byte transfer(byte _data); @@ -53,6 +53,7 @@ class SPIClass { private: Spi *spi; uint32_t id, divider, mode; + void (*initCb)(void); }; #if SPI_INTERFACES_COUNT > 0