#include "spi.h"
#include "portconf.h"
+#define SPI_SCI2_SMR ((volatile uint8 *)0xFFFFC0)
+#define SPI_SCI2_BRR ((volatile uint8 *)0xFFFFC1)
+#define SPI_SCI2_SCR ((volatile uint8 *)0xFFFFC2)
+#define SPI_SCI2_TDR ((volatile uint8 *)0xFFFFC3)
+#define SPI_SCI2_SSR ((volatile uint8 *)0xFFFFC4)
+#define SPI_SCI2_RDR ((volatile uint8 *)0xFFFFC5)
+#define SPI_SCI2_SCMR ((volatile uint8 *)0xFFFFC6)
+
+#define SSR_BIT_TDRE (1 << 7)
+#define SSR_BIT_RDRF (1 << 6)
+#define SSR_BIT_ORER (1 << 5)
+#define SSR_BIT_FER (1 << 4)
+#define SSR_BIT_PER (1 << 3)
+
#define CK_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "high" */
#define CK_L() do { *PORTCONF_PBDR &= ~PORTCONF_PBBIT_SCLK; } while (0) /* Set MMC SCLK "low" */
#define DI_H() do { *PORTCONF_PBDR |= PORTCONF_PBBIT_MOSI; } while (0) /* Set MMC DI "high" */
void spi_init(void)
{
+ int i;
+ *SPI_SCI2_SCR = 0x00;
+ *SPI_SCI2_SMR = 0x80;
+ *SPI_SCI2_BRR = 0x04;
+ for (i = 0; i < 20; i++) { asm("nop;"); }
+ *SPI_SCI2_SCR = 0x30;
+ *SPI_SCI2_SCMR = 0xFA;
}
void spi_tx(uint8 d)
{
- if (d & 0x80) DI_H(); else DI_L(); /* bit7 */
- CK_H(); CK_L();
- if (d & 0x40) DI_H(); else DI_L(); /* bit6 */
- CK_H(); CK_L();
- if (d & 0x20) DI_H(); else DI_L(); /* bit5 */
- CK_H(); CK_L();
- if (d & 0x10) DI_H(); else DI_L(); /* bit4 */
- CK_H(); CK_L();
- if (d & 0x08) DI_H(); else DI_L(); /* bit3 */
- CK_H(); CK_L();
- if (d & 0x04) DI_H(); else DI_L(); /* bit2 */
- CK_H(); CK_L();
- if (d & 0x02) DI_H(); else DI_L(); /* bit1 */
- CK_H(); CK_L();
- if (d & 0x01) DI_H(); else DI_L(); /* bit0 */
- CK_H(); CK_L();
+ *SPI_SCI2_TDR = d;
+ *SPI_SCI2_SSR &= ~(SSR_BIT_TDRE | SSR_BIT_ORER | SSR_BIT_FER | SSR_BIT_PER);
+ while (!(*SPI_SCI2_SSR & SSR_BIT_RDRF)) {
+ }
+ *SPI_SCI2_SSR &= ~(SSR_BIT_RDRF);
}
uint8 spi_rx(void)
{
uint8 r;
-
- DI_H(); /* Send 0xFF */
-
- r = 0; if (DO) r++; /* bit7 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit6 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit5 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit4 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit3 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit2 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit1 */
- CK_H(); CK_L();
- r <<= 1; if (DO) r++; /* bit0 */
- CK_H(); CK_L();
-
+ *SPI_SCI2_TDR = 0xff;
+ *SPI_SCI2_SSR &= ~(SSR_BIT_TDRE | SSR_BIT_ORER | SSR_BIT_FER | SSR_BIT_PER);
+ while (!(*SPI_SCI2_SSR & SSR_BIT_RDRF)) {
+ }
+ r = *SPI_SCI2_RDR;
+ *SPI_SCI2_SSR &= ~(SSR_BIT_RDRF);
return r;
}