This is a program for testing the 8255 interface on protocoltool. It implements a software emulation of the bidirectional mode 2 of a 8255 chip.

Dependencies:   mbed

Fork of parallel_port_tester by Jacques Pelletier

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?

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 #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 }