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:
Sun Oct 27 04:39:17 2013 +0000
Revision:
2:0cc974f03339
Parent:
1:51bc46468482
Child:
3:422d80770413
Initial commit

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 #define PAR_INVERT_OBF_SIGNAL
jpelletier 1:51bc46468482 15
jpelletier 1:51bc46468482 16 #define PAR_8255_SEND_MASK 0x80
jpelletier 1:51bc46468482 17 #define PAR_8255_RECV_MASK 0x40
jpelletier 0:a5957f25b150 18
jpelletier 1:51bc46468482 19 /*
jpelletier 1:51bc46468482 20 8255 Parallel Pin Bit
jpelletier 1:51bc46468482 21 PC7 /OBF -> /ACK 10 6
jpelletier 1:51bc46468482 22 PC6 /ACK <- /SLCTIN 17 3
jpelletier 1:51bc46468482 23 PC5 IBF -> BUSY 11 7
jpelletier 1:51bc46468482 24 PC4 /STB <- /STB 1 0
jpelletier 0:a5957f25b150 25
jpelletier 1:51bc46468482 26 15 nError -> p9 not used
jpelletier 1:51bc46468482 27 13 Select -> p10 not used
jpelletier 1:51bc46468482 28 12 PE -> p11 not used
jpelletier 1:51bc46468482 29 11 Busy -> p12 IBF
jpelletier 1:51bc46468482 30 10 nAck -> p13 /OBF
jpelletier 1:51bc46468482 31
jpelletier 1:51bc46468482 32 1 nStrobe -> p14 /STB
jpelletier 1:51bc46468482 33 14 nAutoFeed -> p15 not used
jpelletier 1:51bc46468482 34 16 nInit -> p16 not used
jpelletier 1:51bc46468482 35 17 nSelectIn -> p17 /ACK
jpelletier 0:a5957f25b150 36 */
jpelletier 0:a5957f25b150 37
jpelletier 1:51bc46468482 38 DigitalOut IBF(p12); // IBF
jpelletier 1:51bc46468482 39 DigitalOut nOBF(p13); // /OBF
jpelletier 0:a5957f25b150 40
jpelletier 1:51bc46468482 41 InterruptIn nSTB(p14);
jpelletier 1:51bc46468482 42 InterruptIn nACK(p17);
jpelletier 0:a5957f25b150 43
jpelletier 0:a5957f25b150 44 /*
jpelletier 0:a5957f25b150 45 D0 p30 p0.4
jpelletier 0:a5957f25b150 46 D1 p29 p0.5
jpelletier 0:a5957f25b150 47 D2 p8 p0.6
jpelletier 0:a5957f25b150 48 D3 p7 p0.7
jpelletier 0:a5957f25b150 49 D4 p6 p0.8
jpelletier 0:a5957f25b150 50 D5 p5 p0.9
jpelletier 0:a5957f25b150 51 D6 p28 p0.10
jpelletier 0:a5957f25b150 52 D7 p27 p0.11
jpelletier 0:a5957f25b150 53 */
jpelletier 0:a5957f25b150 54 BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27);
jpelletier 0:a5957f25b150 55
jpelletier 0:a5957f25b150 56 #define __DOUTBUFSIZE 256
jpelletier 0:a5957f25b150 57 #define __DINBUFSIZE 256
jpelletier 0:a5957f25b150 58 char __outstr[__DOUTBUFSIZE];
jpelletier 0:a5957f25b150 59 char __instr[__DINBUFSIZE];
jpelletier 0:a5957f25b150 60
jpelletier 0:a5957f25b150 61 Serial pc(USBTX, USBRX); // tx, rx
jpelletier 0:a5957f25b150 62
jpelletier 1:51bc46468482 63 unsigned char rx_data;
jpelletier 1:51bc46468482 64
jpelletier 1:51bc46468482 65 // Peripheral should check that there is no output pending from the 8255 to the peripheral before writing to the 8255
jpelletier 1:51bc46468482 66
jpelletier 1:51bc46468482 67 // When /STB is falling
jpelletier 1:51bc46468482 68 void perif2mbed(void)
jpelletier 1:51bc46468482 69 {
jpelletier 1:51bc46468482 70 // read byte from peripheral
jpelletier 1:51bc46468482 71 rx_data = PtrData;
jpelletier 1:51bc46468482 72 IBF = 1;
jpelletier 1:51bc46468482 73 }
jpelletier 1:51bc46468482 74
jpelletier 1:51bc46468482 75 // When /ACK is rising
jpelletier 1:51bc46468482 76 void mbed2perif(void)
jpelletier 1:51bc46468482 77 {
jpelletier 1:51bc46468482 78 nOBF = 1;
jpelletier 1:51bc46468482 79 PtrData.input();
jpelletier 1:51bc46468482 80 }
jpelletier 1:51bc46468482 81
jpelletier 1:51bc46468482 82 void write_byte(unsigned char out)
jpelletier 1:51bc46468482 83 {
jpelletier 1:51bc46468482 84 // wait for /OBF = 1 and no read cycle in progress for politeness
jpelletier 1:51bc46468482 85 while ((nOBF == 0) || (IBF == 1));
jpelletier 0:a5957f25b150 86
jpelletier 1:51bc46468482 87 PtrData = out;
jpelletier 1:51bc46468482 88 PtrData.output();
jpelletier 1:51bc46468482 89 nOBF = 0;
jpelletier 1:51bc46468482 90 }
jpelletier 1:51bc46468482 91
jpelletier 1:51bc46468482 92 unsigned char read_byte(void)
jpelletier 1:51bc46468482 93 {
jpelletier 1:51bc46468482 94 while (IBF == 0);
jpelletier 1:51bc46468482 95 IBF = 0;
jpelletier 1:51bc46468482 96 return rx_data;
jpelletier 1:51bc46468482 97 }
jpelletier 1:51bc46468482 98
jpelletier 1:51bc46468482 99 int main()
jpelletier 1:51bc46468482 100 {
jpelletier 1:51bc46468482 101 PtrData.input();
jpelletier 1:51bc46468482 102
jpelletier 1:51bc46468482 103 /* 9600 baud serial port */
jpelletier 1:51bc46468482 104 pc.printf("8255 emulator on mbed\r\n\n");
jpelletier 1:51bc46468482 105
jpelletier 1:51bc46468482 106 IBF = 0;
jpelletier 1:51bc46468482 107 nOBF = 1;
jpelletier 1:51bc46468482 108 nSTB.fall(&perif2mbed);
jpelletier 1:51bc46468482 109 nACK.rise(&mbed2perif);
jpelletier 0:a5957f25b150 110
jpelletier 0:a5957f25b150 111 PtrData.input();
jpelletier 0:a5957f25b150 112
jpelletier 1:51bc46468482 113 while(1)
jpelletier 1:51bc46468482 114 {
jpelletier 1:51bc46468482 115 // bytes from peripherals to 8255
jpelletier 1:51bc46468482 116 if (IBF == 1)
jpelletier 0:a5957f25b150 117 {
jpelletier 1:51bc46468482 118 IBF = 0;
jpelletier 1:51bc46468482 119 pc.putc(rx_data);
jpelletier 1:51bc46468482 120 }
jpelletier 1:51bc46468482 121 else
jpelletier 1:51bc46468482 122 {
jpelletier 1:51bc46468482 123 if (pc.readable())
jpelletier 0:a5957f25b150 124 {
jpelletier 1:51bc46468482 125 write_byte(pc.getc());
jpelletier 0:a5957f25b150 126 }
jpelletier 1:51bc46468482 127 }
jpelletier 0:a5957f25b150 128 }
jpelletier 0:a5957f25b150 129 }