This program implements a slave SPI in software for testing the SPI interface of protocoltool.
Fork of 8255_emulator by
main.cpp@2:0cc974f03339, 2013-10-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |