This program implements a slave SPI in software for testing the SPI interface of protocoltool.

Dependencies:   mbed

Fork of 8255_emulator by Jacques Pelletier

Revision:
6:dccae7a269f9
Parent:
5:c79a6e66ed00
--- a/main.cpp	Mon Sep 07 05:31:33 2015 +0000
+++ b/main.cpp	Mon Sep 07 05:50:57 2015 +0000
@@ -1,4 +1,3 @@
-/* Implement the SPI slave 8-bit in hardware */
 #include "mbed.h"
 
 //#include <stdarg.h>
@@ -6,8 +5,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <SPISlave.h>
-
 /*
 Instructions for use: connect the mbed to a parallel port using these connexions.
 use a terminal program to connect via USB to the mbed side. */
@@ -15,58 +12,177 @@
 /* This is for testing since it uses the serial port at 9600 bauds to connect to a PC */
 
 /*
-Doesn't use the Mbed-parallel port PCB
+  8255          Parallel    Pin     Bit
+  PC7   /OBF    ->  /ACK        10      6
+  PC6   /ACK    <-  /SLCTIN     17      3
+  PC5   IBF     ->  BUSY        11      7
+  PC4   /STB    <-  /STB        1       0
+
+15 nError       -> p9       not used
+13 Select       -> p10      not used
+12 PE           -> p11      not used
+11 Busy         -> p12      MISO
+10 nAck         -> p13      not used
+
+ 1 nStrobe      -> p14      MOSI
+14 nAutoFeed    -> p15      SCLK
+16 nInit        -> p16      not used
+17 nSelectIn    -> p17      not used
+*/
 
-  SPI          Parallel    Pin     Bit
-  MISO  p6      ->  BUSY        11      7
-  SCK   p7      <-  /AutoFeed   14
-  /SS   p8      <-> D0          2
-  MOSI  p5      <-  /STB        1       0
+DigitalOut MISO(p12);
+DigitalIn MOSI(p14);
+InterruptIn SCLK(p15);
+
+/*
+CE0 p30  p0.4
+CE1 p29  p0.5
+CE2 p8   p0.6
+CE3 p7   p0.7
+CE4 p6   p0.8
+CE5 p5   p0.9
+CE6 p28  p0.10
+CE7 p27  p0.11
 */
+BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27);
+
+#define __DOUTBUFSIZE 256
+#define __DINBUFSIZE 256
+char __outstr[__DOUTBUFSIZE];
+char __instr[__DINBUFSIZE];
 
 Serial pc(USBTX, USBRX); // tx, rx
 
 unsigned char rx_data, tx_data;
 
-SPISlave device(p5, p6, p7, p8); // mosi, miso, sclk, ssel
+bool msb_first = true;
+bool edge_falling = false; // false: CPOL = 0, CPHA = 0; true: CPOL = 1, CPHA = 1
+bool byte_ready;
+int bit_count;
+
+void shift_bit(void)
+{
+    if (msb_first)
+    {
+        rx_data = (rx_data << 1) | MOSI;
+        MISO = (tx_data & 0x80) >> 7;
+        tx_data <<= 1;
+    }
+    else
+    {
+        rx_data = (rx_data >> 1) | (MOSI << 7);
+        MISO = tx_data & 1;
+        tx_data >>= 1;
+    }
+    bit_count++;
+    if (bit_count == 8)
+    {
+        byte_ready = true;
+        bit_count = 0;
+    }
+}
+
+void sclk_fall(void)
+{
+    if (edge_falling && (PtrData == 0xfe))
+    {
+        shift_bit();
+    }
+}
+
+void sclk_rise(void)
+{
+   if (!edge_falling && (PtrData == 0xfe))
+   {
+        shift_bit();
+   }
+}
 
 int main()
 {
-    char key;
-    int i = 0;
+unsigned char key;
+bool configure_end = false;
+
+    PtrData.input();
+
+    /* 9600 baud serial port */
+    pc.printf("SPI tester on mbed\r\n\n");
     
-    /* 9600 baud serial port */
-    pc.printf("SPI slave test on mbed\r\n\n");
+    MISO = 0;
+    SCLK.fall(&sclk_fall);
+    SCLK.rise(&sclk_rise);
+    SCLK.mode(PullUp);
+    SCLK.enable_irq();
     
-    pc.printf("Configure\r\n\n");
-    pc.printf("Mode: 0-3\r\n\n");
+    byte_ready = false;
+    bit_count = 0;
+    
+    pc.printf("Actual configuration\r\n\n");
+    pc.printf("MSB first\r\n");
+    pc.printf("Rising edge clock\r\n\n");
 
-    key = pc.getc();    
+    pc.printf("Configure\r\n\n");
+    pc.printf("M: MSB first\r\n");
+    pc.printf("L: LSB first\r\n");
+    pc.printf("F: Falling edge clock\r\n");
+    pc.printf("R: Rising edge clock\r\n");
+    pc.printf("G: Go\r\n\n");
 
-    switch (key)
+    do
     {
-        case '0':
-        case '1':
-        case '2':
-        case '3':
-            i = key & 0x03;
-            break;
-
-        default:
-        ;                        
-    }
+        key = pc.getc();    
     
-    pc.printf("Configure end, mode: %d, begin test\r\n\n",i);
-    device.format(8,i);
-    device.frequency(8000000); //8MHz    
+        switch (key)
+        {
+            case 'M':
+            case 'm':
+                msb_first = true;
+                pc.printf("MSB first\r\n");
+                break;
+
+            case 'L':
+            case 'l':
+                msb_first = false;
+                pc.printf("LSB first\r\n");
+                break;
+                
+            case 'F':
+            case 'f':
+                edge_falling = true;
+                pc.printf("Falling edge clock\r\n");
+                break;
+
+            case 'R':
+            case 'r':
+                edge_falling = true;
+                pc.printf("Rising edge clock\r\n");
+                break;
+                
+            case 'G':
+            case 'g':
+                configure_end = true;
+                break;
+                
+            default:
+            ;                        
+        }
+    } while (!configure_end);
     
-    i = 0;
-    device.reply(0);              // Prime SPI with first reply
-    
-    while(1) {
-        if(device.receive()) {
-            int v = device.read();   // Read byte from master
-            device.reply(v);         // Make this the next reply
+    pc.printf("Configure end, begin test\r\n\n");
+
+    while(1)
+    {
+        if (pc.readable())
+        {
+            tx_data = pc.getc();
         }
+        else
+        {
+            if (byte_ready)
+            {
+                pc.putc(rx_data);
+                byte_ready = false;
+            }
+        }  
     }
 }