--- Sd2Card.cpp 2020-11-27 17:31:58.073651000 +0900 +++ Sd2Card_due.cpp 2021-01-02 09:08:34.772669100 +0900 @@ -52,6 +52,68 @@ #endif } #else // SOFTWARE_SPI +#ifdef __SAM3X8E__ +// 1YEN_201109: to use sd card i/f on the tft shield for due + +// NOP tune software spi timing +#define spi_NOP __asm__ __volatile__ ("nop") +// SCK: D13(PB27/NCS3/TIOB0) +#define spi_SCK0 REG_PIOB_CODR=(1U<<27) +#define spi_SCK1 REG_PIOB_SODR=(1U<<27) +// MOSI: D11(PD7/A17/BA1/TIOA8) +#define spi_MOSI0 REG_PIOD_CODR=(1U<<7) +#define spi_MOSI1 REG_PIOD_SODR=(1U<<7) +// MISO: D12(PD8/A21/NANDALE/TIOB8) +#define spi_MISO (REG_PIOD_PDSR&(1U<<8)) + +uint8_t spiRec (void) +{ + int idx; + int data; + + // no interrupts during byte receive - about 1 us + noInterrupts (); + // output pin high - like sending 0XFF + spi_MOSI1; + data=0; + for (idx=0; idx<8; idx++) + { + spi_SCK1; + data <<= 1; + data |= (spi_MISO)? 1: 0; + + spi_SCK0; + } + // enable interrupts + interrupts (); + + return (data); +} + +void spiSend ( +uint8_t data) +{ + int idx; + + // no interrupts during byte send - about 1 us + noInterrupts (); + for (idx=0; idx<8; idx++) + { + spi_SCK0; + if (data&0x80) + spi_MOSI1; + else + spi_MOSI0; + data <<= 1; + + spi_SCK1; + } + spi_SCK0; + // enable interrupts + interrupts (); +} +#undef USE_SPI_LIB +#else // __SAM3X8E__ //------------------------------------------------------------------------------ /** nop to tune soft SPI timing */ #define nop asm volatile ("nop\n\t") @@ -105,6 +167,7 @@ // enable interrupts sei(); } +#endif // __SAM3X8E__ #endif // SOFTWARE_SPI //------------------------------------------------------------------------------ // send command and return error code. Return zero for OK @@ -162,7 +225,9 @@ } } //------------------------------------------------------------------------------ +#ifdef USE_SPI_LIB // 1YEN_201109: to suppress WARNING static uint8_t chip_select_asserted = 0; +#endif void Sd2Card::chipSelectHigh(void) { digitalWrite(chipSelectPin_, HIGH); @@ -258,6 +323,8 @@ pinMode(SPI_MISO_PIN, INPUT); pinMode(SPI_MOSI_PIN, OUTPUT); pinMode(SPI_SCK_PIN, OUTPUT); +// 1YEN_201109: to suppress WARNING +sckRateID=sckRateID; #endif #ifndef SOFTWARE_SPI @@ -510,6 +577,7 @@ return false; } #ifndef USE_SPI_LIB +#ifndef __SAM3X8E__ // see avr processor datasheet for SPI register bit definitions if ((sckRateID & 1) || sckRateID == 6) { SPSR &= ~(1 << SPI2X); @@ -519,6 +587,7 @@ SPCR &= ~((1 <