OSDN Git Service

Updated the SPI bus control module.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Sat, 14 Jul 2012 22:43:29 +0000 (07:43 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Sat, 14 Jul 2012 22:43:29 +0000 (07:43 +0900)
firm/sample/sample1/os/spi.c

index 480299e..97b3885 100644 (file)
@@ -2,6 +2,20 @@
 #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;
 }