Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of spi_tester by
main.cpp@1:51bc46468482, 2013-10-27 (annotated)
- Committer:
- jpelletier
- Date:
- Sun Oct 27 04:32:14 2013 +0000
- Revision:
- 1:51bc46468482
- Parent:
- 0:a5957f25b150
- Child:
- 2:0cc974f03339
This program emulates the bidirectional port of the 8255 Peripheral IO chip.
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 | #define PAR_NEGOTIATE_EXTENSIBILITY_LINK 0x80 |
| jpelletier | 0:a5957f25b150 | 10 | #define PAR_NEGOTIATE_REQ_EPP_MODE 0x40 |
| jpelletier | 0:a5957f25b150 | 11 | #define PAR_NEGOTIATE_REQ_ECP_MODE 0x10 |
| jpelletier | 0:a5957f25b150 | 12 | #define PAR_NEGOTIATE_REQ_ECP_RLE_MODE 0x30 |
| jpelletier | 0:a5957f25b150 | 13 | #define PAR_NEGOTIATE_REQ_DEV_ID_NIBBLE_MODE 0x04 |
| jpelletier | 0:a5957f25b150 | 14 | #define PAR_NEGOTIATE_REQ_DEV_ID_BYTE_MODE 0x05 |
| jpelletier | 0:a5957f25b150 | 15 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_MODE 0x14 |
| jpelletier | 0:a5957f25b150 | 16 | #define PAR_NEGOTIATE_REQ_DEV_ID_ECP_RLE_MODE 0x34 |
| jpelletier | 0:a5957f25b150 | 17 | #define PAR_NEGOTIATE_NIBBLE_MODE 0x00 |
| jpelletier | 0:a5957f25b150 | 18 | #define PAR_NEGOTIATE_BYTE_MODE 0x01 |
| jpelletier | 1:51bc46468482 | 19 | */ |
| jpelletier | 0:a5957f25b150 | 20 | |
| jpelletier | 0:a5957f25b150 | 21 | /* |
| jpelletier | 0:a5957f25b150 | 22 | Instructions for use: connect the mbed to a parallel port using these connexions. |
| jpelletier | 1:51bc46468482 | 23 | use a terminal program to connect via USB to the mbed side. */ |
| jpelletier | 0:a5957f25b150 | 24 | |
| jpelletier | 1:51bc46468482 | 25 | #define PAR_INVERT_OBF_SIGNAL |
| jpelletier | 1:51bc46468482 | 26 | |
| jpelletier | 1:51bc46468482 | 27 | #define PAR_8255_SEND_MASK 0x80 |
| jpelletier | 1:51bc46468482 | 28 | #define PAR_8255_RECV_MASK 0x40 |
| jpelletier | 0:a5957f25b150 | 29 | |
| jpelletier | 1:51bc46468482 | 30 | /* |
| jpelletier | 1:51bc46468482 | 31 | 8255 Parallel Pin Bit |
| jpelletier | 1:51bc46468482 | 32 | PC7 /OBF -> /ACK 10 6 |
| jpelletier | 1:51bc46468482 | 33 | PC6 /ACK <- /SLCTIN 17 3 |
| jpelletier | 1:51bc46468482 | 34 | PC5 IBF -> BUSY 11 7 |
| jpelletier | 1:51bc46468482 | 35 | PC4 /STB <- /STB 1 0 |
| jpelletier | 0:a5957f25b150 | 36 | |
| jpelletier | 1:51bc46468482 | 37 | 15 nError -> p9 not used |
| jpelletier | 1:51bc46468482 | 38 | 13 Select -> p10 not used |
| jpelletier | 1:51bc46468482 | 39 | 12 PE -> p11 not used |
| jpelletier | 1:51bc46468482 | 40 | 11 Busy -> p12 IBF |
| jpelletier | 1:51bc46468482 | 41 | 10 nAck -> p13 /OBF |
| jpelletier | 1:51bc46468482 | 42 | |
| jpelletier | 1:51bc46468482 | 43 | 1 nStrobe -> p14 /STB |
| jpelletier | 1:51bc46468482 | 44 | 14 nAutoFeed -> p15 not used |
| jpelletier | 1:51bc46468482 | 45 | 16 nInit -> p16 not used |
| jpelletier | 1:51bc46468482 | 46 | 17 nSelectIn -> p17 /ACK |
| jpelletier | 0:a5957f25b150 | 47 | */ |
| jpelletier | 0:a5957f25b150 | 48 | |
| jpelletier | 1:51bc46468482 | 49 | DigitalOut IBF(p12); // IBF |
| jpelletier | 1:51bc46468482 | 50 | DigitalOut nOBF(p13); // /OBF |
| jpelletier | 0:a5957f25b150 | 51 | |
| jpelletier | 1:51bc46468482 | 52 | InterruptIn nSTB(p14); |
| jpelletier | 1:51bc46468482 | 53 | InterruptIn nACK(p17); |
| jpelletier | 0:a5957f25b150 | 54 | |
| jpelletier | 0:a5957f25b150 | 55 | /* |
| jpelletier | 0:a5957f25b150 | 56 | D0 p30 p0.4 |
| jpelletier | 0:a5957f25b150 | 57 | D1 p29 p0.5 |
| jpelletier | 0:a5957f25b150 | 58 | D2 p8 p0.6 |
| jpelletier | 0:a5957f25b150 | 59 | D3 p7 p0.7 |
| jpelletier | 0:a5957f25b150 | 60 | D4 p6 p0.8 |
| jpelletier | 0:a5957f25b150 | 61 | D5 p5 p0.9 |
| jpelletier | 0:a5957f25b150 | 62 | D6 p28 p0.10 |
| jpelletier | 0:a5957f25b150 | 63 | D7 p27 p0.11 |
| jpelletier | 0:a5957f25b150 | 64 | */ |
| jpelletier | 0:a5957f25b150 | 65 | BusInOut PtrData(p30,p29,p8,p7,p6,p5,p28,p27); |
| jpelletier | 0:a5957f25b150 | 66 | |
| jpelletier | 0:a5957f25b150 | 67 | #define __DOUTBUFSIZE 256 |
| jpelletier | 0:a5957f25b150 | 68 | #define __DINBUFSIZE 256 |
| jpelletier | 0:a5957f25b150 | 69 | char __outstr[__DOUTBUFSIZE]; |
| jpelletier | 0:a5957f25b150 | 70 | char __instr[__DINBUFSIZE]; |
| jpelletier | 0:a5957f25b150 | 71 | |
| jpelletier | 0:a5957f25b150 | 72 | Serial pc(USBTX, USBRX); // tx, rx |
| jpelletier | 0:a5957f25b150 | 73 | |
| jpelletier | 1:51bc46468482 | 74 | unsigned char rx_data; |
| jpelletier | 1:51bc46468482 | 75 | |
| jpelletier | 1:51bc46468482 | 76 | // Peripheral should check that there is no output pending from the 8255 to the peripheral before writing to the 8255 |
| jpelletier | 1:51bc46468482 | 77 | |
| jpelletier | 1:51bc46468482 | 78 | // When /STB is falling |
| jpelletier | 1:51bc46468482 | 79 | void perif2mbed(void) |
| jpelletier | 1:51bc46468482 | 80 | { |
| jpelletier | 1:51bc46468482 | 81 | // read byte from peripheral |
| jpelletier | 1:51bc46468482 | 82 | rx_data = PtrData; |
| jpelletier | 1:51bc46468482 | 83 | IBF = 1; |
| jpelletier | 1:51bc46468482 | 84 | } |
| jpelletier | 1:51bc46468482 | 85 | |
| jpelletier | 1:51bc46468482 | 86 | // When /ACK is rising |
| jpelletier | 1:51bc46468482 | 87 | void mbed2perif(void) |
| jpelletier | 1:51bc46468482 | 88 | { |
| jpelletier | 1:51bc46468482 | 89 | nOBF = 1; |
| jpelletier | 1:51bc46468482 | 90 | PtrData.input(); |
| jpelletier | 1:51bc46468482 | 91 | } |
| jpelletier | 1:51bc46468482 | 92 | |
| jpelletier | 1:51bc46468482 | 93 | void write_byte(unsigned char out) |
| jpelletier | 1:51bc46468482 | 94 | { |
| jpelletier | 1:51bc46468482 | 95 | // wait for /OBF = 1 and no read cycle in progress for politeness |
| jpelletier | 1:51bc46468482 | 96 | while ((nOBF == 0) || (IBF == 1)); |
| jpelletier | 0:a5957f25b150 | 97 | |
| jpelletier | 1:51bc46468482 | 98 | PtrData = out; |
| jpelletier | 1:51bc46468482 | 99 | PtrData.output(); |
| jpelletier | 1:51bc46468482 | 100 | nOBF = 0; |
| jpelletier | 1:51bc46468482 | 101 | } |
| jpelletier | 1:51bc46468482 | 102 | |
| jpelletier | 1:51bc46468482 | 103 | unsigned char read_byte(void) |
| jpelletier | 1:51bc46468482 | 104 | { |
| jpelletier | 1:51bc46468482 | 105 | while (IBF == 0); |
| jpelletier | 1:51bc46468482 | 106 | IBF = 0; |
| jpelletier | 1:51bc46468482 | 107 | return rx_data; |
| jpelletier | 1:51bc46468482 | 108 | } |
| jpelletier | 1:51bc46468482 | 109 | |
| jpelletier | 1:51bc46468482 | 110 | int main() |
| jpelletier | 1:51bc46468482 | 111 | { |
| jpelletier | 1:51bc46468482 | 112 | PtrData.input(); |
| jpelletier | 1:51bc46468482 | 113 | |
| jpelletier | 1:51bc46468482 | 114 | /* 9600 baud serial port */ |
| jpelletier | 1:51bc46468482 | 115 | pc.printf("8255 emulator on mbed\r\n\n"); |
| jpelletier | 1:51bc46468482 | 116 | |
| jpelletier | 1:51bc46468482 | 117 | IBF = 0; |
| jpelletier | 1:51bc46468482 | 118 | nOBF = 1; |
| jpelletier | 1:51bc46468482 | 119 | nSTB.fall(&perif2mbed); |
| jpelletier | 1:51bc46468482 | 120 | nACK.rise(&mbed2perif); |
| jpelletier | 0:a5957f25b150 | 121 | |
| jpelletier | 0:a5957f25b150 | 122 | PtrData.input(); |
| jpelletier | 0:a5957f25b150 | 123 | |
| jpelletier | 1:51bc46468482 | 124 | while(1) |
| jpelletier | 1:51bc46468482 | 125 | { |
| jpelletier | 1:51bc46468482 | 126 | // bytes from peripherals to 8255 |
| jpelletier | 1:51bc46468482 | 127 | if (IBF == 1) |
| jpelletier | 0:a5957f25b150 | 128 | { |
| jpelletier | 1:51bc46468482 | 129 | IBF = 0; |
| jpelletier | 1:51bc46468482 | 130 | pc.putc(rx_data); |
| jpelletier | 1:51bc46468482 | 131 | } |
| jpelletier | 1:51bc46468482 | 132 | else |
| jpelletier | 1:51bc46468482 | 133 | { |
| jpelletier | 1:51bc46468482 | 134 | if (pc.readable()) |
| jpelletier | 0:a5957f25b150 | 135 | { |
| jpelletier | 1:51bc46468482 | 136 | write_byte(pc.getc()); |
| jpelletier | 0:a5957f25b150 | 137 | } |
| jpelletier | 1:51bc46468482 | 138 | } |
| jpelletier | 0:a5957f25b150 | 139 | } |
| jpelletier | 0:a5957f25b150 | 140 | } |
