Still trying to get SPI working.
authorethereal <ethereal@ethv.net>
Thu, 13 Mar 2014 20:11:58 +0000 (14:11 -0600)
committerethereal <ethereal@ethv.net>
Thu, 13 Mar 2014 20:11:58 +0000 (14:11 -0600)
vm/src/peripherals.h
vm/src/spi.c
vm/src/startup.c

index 1aa9ea2..e1caf36 100644 (file)
@@ -3,7 +3,6 @@
 
 #define PERIPHERAL_ID_UART_0    8
 #define PERIPHERAL_ID_UART_1    9
-
 #define PERIPHERAL_ID_SPI       21
 
 #endif
index 95bb734..13fdba4 100644 (file)
@@ -4,6 +4,7 @@
 #include "pio.h"
 #include "registers.h"
 #include "uart.h"
+#include "debug.h"
 
 static void spi_wait_tdre(void);
 static void spi_wait_rdrf(void);
@@ -21,12 +22,12 @@ void spi_init(void) {
     /* enable SPI */
     register_write(SPI_CR, 1);
 
-    /* set master mode, fixed-peripheral mode, no decoder */
+    /* set master mode, fixed-peripheral mode, no decoder, local loopback (testing) */
     register_write(SPI_MR, (1<<0) | (1<<4));
 
     /* configure slave 0 */
     /* CSNAAT, SPCK = MCK/2 */
-    register_write(SPI_CSR0, (1<<2) | (2<<8));
+    register_write(SPI_CSR0, (1<<2) | (255<<8));
 }
 
 static void spi_wait_tdre(void) {
@@ -38,16 +39,37 @@ static void spi_wait_rdrf(void) {
 }
 
 void spi_test(void) {
-    uint8_t val[] = {0x03, 0x0, 0x0, 0x0};
+    while(1) {
+    uint8_t val[] = {0x03, 0x0, 0x0, 0x0, 0x55, 0x0};
+    uint8_t ret[5];
+    DEBUG("about to send");
     for(int i = 0; i < sizeof(val); i ++) {
         spi_wait_tdre();
         register_write(SPI_TDR, val[i]);
+        spi_wait_rdrf();
+        ret[i] = register_read(SPI_RDR) & 0xff;
     }
-    spi_wait_rdrf();
-    uint8_t ret = register_read(SPI_RDR) & 0xff;
+    DEBUG("sent! waiting for response...");
+    //spi_wait_rdrf();
+    /*register_read(SPI_RDR) & 0xff;*/
+    DEBUG("received:");
 
     const char *hex = "0123456789abcdef";
 
-    uart_send((uint8_t *)&hex[ret & 0xf], 1);
-    uart_send((uint8_t *)&hex[(ret>>4) & 0xf], 1);
-}
+    for(int i = 0; i < 5; i ++) {
+        uart_send((uint8_t *)&hex[(ret[i]>>4) & 0xf], 1);
+        uart_send((uint8_t *)&hex[ret[i] & 0xf], 1);
+    }
+
+    DEBUG(".");
+
+    DEBUG("SPI_SR:");
+    uint32_t v = register_read(SPI_SR);
+    for(int i = 0; i < 4; i ++) {
+        uint8_t vv = (v & 0xff000000) >> 24;
+        uart_send((uint8_t *)&hex[vv & 0xf], 1);
+        uart_send((uint8_t *)&hex[(vv>>4) & 0xf], 1);
+        v >>= 8;
+    }
+    DEBUG(".");
+} }
index 388956a..e18b560 100644 (file)
@@ -102,8 +102,8 @@ static void startup_reset_handler(void) {
 
     debug_init();
 
-    /*spi_init();
-    spi_test();*/
+    spi_init();
+    spi_test();
 
     *(uint32_t *)(0x400e0e00) = 0x8;
     *(uint32_t *)(0x400e0e10) = 0x8;