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

Dependencies:   mbed

Fork of 8255_emulator by Jacques Pelletier

Committer:
jpelletier
Date:
Mon Sep 07 05:50:57 2015 +0000
Revision:
6:dccae7a269f9
Parent:
5:c79a6e66ed00
revert

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jpelletier 0:a5957f25b150 1 #include "mbed.h"
jpelletier 0:a5957f25b150 2
jpelletier 0:a5957f25b150 3 //#include <stdarg.h>
jpelletier 0:a5957f25b150 4 #include <stdio.h>
jpelletier 0:a5957f25b150 5 #include <stdlib.h>
jpelletier 0:a5957f25b150 6 #include <string.h>
jpelletier 0:a5957f25b150 7
jpelletier 1:51bc46468482 8 /*
jpelletier 0:a5957f25b150 9 Instructions for use: connect the mbed to a parallel port using these connexions.
jpelletier 1:51bc46468482 10 use a terminal program to connect via USB to the mbed side. */
jpelletier 0:a5957f25b150 11
jpelletier 2:0cc974f03339 12 /* This is for testing since it uses the serial port at 9600 bauds to connect to a PC */
jpelletier 2:0cc974f03339 13
jpelletier 1:51bc46468482 14 /*
jpelletier 6:dccae7a269f9 15 8255 Parallel Pin Bit
jpelletier 6:dccae7a269f9 16 PC7 /OBF -> /ACK 10 6
jpelletier 6:dccae7a269f9 17 PC6 /ACK <- /SLCTIN 17 3
jpelletier 6:dccae7a269f9 18 PC5 IBF -> BUSY 11 7
jpelletier 6:dccae7a269f9 19 PC4 /STB <- /STB 1 0
jpelletier 6:dccae7a269f9 20
jpelletier 6:dccae7a269f9 21 15 nError -> p9 not used
jpelletier 6:dccae7a269f9 22 13 Select -> p10 not used
jpelletier 6:dccae7a269f9 23 12 PE -> p11 not used
jpelletier 6:dccae7a269f9 24 11 Busy -> p12 MISO
jpelletier 6:dccae7a269f9 25 10 nAck -> p13 not used
jpelletier 6:dccae7a269f9 26
jpelletier 6:dccae7a269f9 27 1 nStrobe -> p14 MOSI
jpelletier 6:dccae7a269f9 28 14 nAutoFeed -> p15 SCLK
jpelletier 6:dccae7a269f9 29 16 nInit -> p16 not used
jpelletier 6:dccae7a269f9 30 17 nSelectIn -> p17 not used
jpelletier 6:dccae7a269f9 31 */
jpelletier 0:a5957f25b150 32
jpelletier 6:dccae7a269f9 33 DigitalOut MISO(p12);
jpelletier 6:dccae7a269f9 34 DigitalIn MOSI(p14);
jpelletier 6:dccae7a269f9 35 InterruptIn SCLK(p15);
jpelletier 6:dccae7a269f9 36
jpelletier 6:dccae7a269f9 37 /*
jpelletier 6:dccae7a269f9 38 CE0 p30 p0.4
jpelletier 6:dccae7a269f9 39 CE1 p29 p0.5
jpelletier 6:dccae7a269f9 40 CE2 p8 p0.6
jpelletier 6:dccae7a269f9 41 CE3 p7 p0.7
jpelletier 6:dccae7a269f9 42 CE4 p6 p0.8
jpelletier 6:dccae7a269f9 43 CE5 p5 p0.9
jpelletier 6:dccae7a269f9 44 CE6 p28 p0.10
jpelletier 6:dccae7a269f9 45 CE7 p27 p0.11
jpelletier 0:a5957f25b150 46 */
jpelletier 6:dccae7a269f9 47 BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27);
jpelletier 6:dccae7a269f9 48
jpelletier 6:dccae7a269f9 49 #define __DOUTBUFSIZE 256
jpelletier 6:dccae7a269f9 50 #define __DINBUFSIZE 256
jpelletier 6:dccae7a269f9 51 char __outstr[__DOUTBUFSIZE];
jpelletier 6:dccae7a269f9 52 char __instr[__DINBUFSIZE];
jpelletier 0:a5957f25b150 53
jpelletier 0:a5957f25b150 54 Serial pc(USBTX, USBRX); // tx, rx
jpelletier 0:a5957f25b150 55
jpelletier 3:422d80770413 56 unsigned char rx_data, tx_data;
jpelletier 1:51bc46468482 57
jpelletier 6:dccae7a269f9 58 bool msb_first = true;
jpelletier 6:dccae7a269f9 59 bool edge_falling = false; // false: CPOL = 0, CPHA = 0; true: CPOL = 1, CPHA = 1
jpelletier 6:dccae7a269f9 60 bool byte_ready;
jpelletier 6:dccae7a269f9 61 int bit_count;
jpelletier 6:dccae7a269f9 62
jpelletier 6:dccae7a269f9 63 void shift_bit(void)
jpelletier 6:dccae7a269f9 64 {
jpelletier 6:dccae7a269f9 65 if (msb_first)
jpelletier 6:dccae7a269f9 66 {
jpelletier 6:dccae7a269f9 67 rx_data = (rx_data << 1) | MOSI;
jpelletier 6:dccae7a269f9 68 MISO = (tx_data & 0x80) >> 7;
jpelletier 6:dccae7a269f9 69 tx_data <<= 1;
jpelletier 6:dccae7a269f9 70 }
jpelletier 6:dccae7a269f9 71 else
jpelletier 6:dccae7a269f9 72 {
jpelletier 6:dccae7a269f9 73 rx_data = (rx_data >> 1) | (MOSI << 7);
jpelletier 6:dccae7a269f9 74 MISO = tx_data & 1;
jpelletier 6:dccae7a269f9 75 tx_data >>= 1;
jpelletier 6:dccae7a269f9 76 }
jpelletier 6:dccae7a269f9 77 bit_count++;
jpelletier 6:dccae7a269f9 78 if (bit_count == 8)
jpelletier 6:dccae7a269f9 79 {
jpelletier 6:dccae7a269f9 80 byte_ready = true;
jpelletier 6:dccae7a269f9 81 bit_count = 0;
jpelletier 6:dccae7a269f9 82 }
jpelletier 6:dccae7a269f9 83 }
jpelletier 6:dccae7a269f9 84
jpelletier 6:dccae7a269f9 85 void sclk_fall(void)
jpelletier 6:dccae7a269f9 86 {
jpelletier 6:dccae7a269f9 87 if (edge_falling && (PtrData == 0xfe))
jpelletier 6:dccae7a269f9 88 {
jpelletier 6:dccae7a269f9 89 shift_bit();
jpelletier 6:dccae7a269f9 90 }
jpelletier 6:dccae7a269f9 91 }
jpelletier 6:dccae7a269f9 92
jpelletier 6:dccae7a269f9 93 void sclk_rise(void)
jpelletier 6:dccae7a269f9 94 {
jpelletier 6:dccae7a269f9 95 if (!edge_falling && (PtrData == 0xfe))
jpelletier 6:dccae7a269f9 96 {
jpelletier 6:dccae7a269f9 97 shift_bit();
jpelletier 6:dccae7a269f9 98 }
jpelletier 6:dccae7a269f9 99 }
jpelletier 1:51bc46468482 100
jpelletier 1:51bc46468482 101 int main()
jpelletier 1:51bc46468482 102 {
jpelletier 6:dccae7a269f9 103 unsigned char key;
jpelletier 6:dccae7a269f9 104 bool configure_end = false;
jpelletier 6:dccae7a269f9 105
jpelletier 6:dccae7a269f9 106 PtrData.input();
jpelletier 6:dccae7a269f9 107
jpelletier 6:dccae7a269f9 108 /* 9600 baud serial port */
jpelletier 6:dccae7a269f9 109 pc.printf("SPI tester on mbed\r\n\n");
jpelletier 3:422d80770413 110
jpelletier 6:dccae7a269f9 111 MISO = 0;
jpelletier 6:dccae7a269f9 112 SCLK.fall(&sclk_fall);
jpelletier 6:dccae7a269f9 113 SCLK.rise(&sclk_rise);
jpelletier 6:dccae7a269f9 114 SCLK.mode(PullUp);
jpelletier 6:dccae7a269f9 115 SCLK.enable_irq();
jpelletier 5:c79a6e66ed00 116
jpelletier 6:dccae7a269f9 117 byte_ready = false;
jpelletier 6:dccae7a269f9 118 bit_count = 0;
jpelletier 6:dccae7a269f9 119
jpelletier 6:dccae7a269f9 120 pc.printf("Actual configuration\r\n\n");
jpelletier 6:dccae7a269f9 121 pc.printf("MSB first\r\n");
jpelletier 6:dccae7a269f9 122 pc.printf("Rising edge clock\r\n\n");
jpelletier 3:422d80770413 123
jpelletier 6:dccae7a269f9 124 pc.printf("Configure\r\n\n");
jpelletier 6:dccae7a269f9 125 pc.printf("M: MSB first\r\n");
jpelletier 6:dccae7a269f9 126 pc.printf("L: LSB first\r\n");
jpelletier 6:dccae7a269f9 127 pc.printf("F: Falling edge clock\r\n");
jpelletier 6:dccae7a269f9 128 pc.printf("R: Rising edge clock\r\n");
jpelletier 6:dccae7a269f9 129 pc.printf("G: Go\r\n\n");
jpelletier 3:422d80770413 130
jpelletier 6:dccae7a269f9 131 do
jpelletier 5:c79a6e66ed00 132 {
jpelletier 6:dccae7a269f9 133 key = pc.getc();
jpelletier 5:c79a6e66ed00 134
jpelletier 6:dccae7a269f9 135 switch (key)
jpelletier 6:dccae7a269f9 136 {
jpelletier 6:dccae7a269f9 137 case 'M':
jpelletier 6:dccae7a269f9 138 case 'm':
jpelletier 6:dccae7a269f9 139 msb_first = true;
jpelletier 6:dccae7a269f9 140 pc.printf("MSB first\r\n");
jpelletier 6:dccae7a269f9 141 break;
jpelletier 6:dccae7a269f9 142
jpelletier 6:dccae7a269f9 143 case 'L':
jpelletier 6:dccae7a269f9 144 case 'l':
jpelletier 6:dccae7a269f9 145 msb_first = false;
jpelletier 6:dccae7a269f9 146 pc.printf("LSB first\r\n");
jpelletier 6:dccae7a269f9 147 break;
jpelletier 6:dccae7a269f9 148
jpelletier 6:dccae7a269f9 149 case 'F':
jpelletier 6:dccae7a269f9 150 case 'f':
jpelletier 6:dccae7a269f9 151 edge_falling = true;
jpelletier 6:dccae7a269f9 152 pc.printf("Falling edge clock\r\n");
jpelletier 6:dccae7a269f9 153 break;
jpelletier 6:dccae7a269f9 154
jpelletier 6:dccae7a269f9 155 case 'R':
jpelletier 6:dccae7a269f9 156 case 'r':
jpelletier 6:dccae7a269f9 157 edge_falling = true;
jpelletier 6:dccae7a269f9 158 pc.printf("Rising edge clock\r\n");
jpelletier 6:dccae7a269f9 159 break;
jpelletier 6:dccae7a269f9 160
jpelletier 6:dccae7a269f9 161 case 'G':
jpelletier 6:dccae7a269f9 162 case 'g':
jpelletier 6:dccae7a269f9 163 configure_end = true;
jpelletier 6:dccae7a269f9 164 break;
jpelletier 6:dccae7a269f9 165
jpelletier 6:dccae7a269f9 166 default:
jpelletier 6:dccae7a269f9 167 ;
jpelletier 6:dccae7a269f9 168 }
jpelletier 6:dccae7a269f9 169 } while (!configure_end);
jpelletier 3:422d80770413 170
jpelletier 6:dccae7a269f9 171 pc.printf("Configure end, begin test\r\n\n");
jpelletier 6:dccae7a269f9 172
jpelletier 6:dccae7a269f9 173 while(1)
jpelletier 6:dccae7a269f9 174 {
jpelletier 6:dccae7a269f9 175 if (pc.readable())
jpelletier 6:dccae7a269f9 176 {
jpelletier 6:dccae7a269f9 177 tx_data = pc.getc();
jpelletier 1:51bc46468482 178 }
jpelletier 6:dccae7a269f9 179 else
jpelletier 6:dccae7a269f9 180 {
jpelletier 6:dccae7a269f9 181 if (byte_ready)
jpelletier 6:dccae7a269f9 182 {
jpelletier 6:dccae7a269f9 183 pc.putc(rx_data);
jpelletier 6:dccae7a269f9 184 byte_ready = false;
jpelletier 6:dccae7a269f9 185 }
jpelletier 6:dccae7a269f9 186 }
jpelletier 0:a5957f25b150 187 }
jpelletier 0:a5957f25b150 188 }