v1 Stable

Dependencies:   F401RE-USBHost USBHostXpad mbed

Committer:
Ownasaurus
Date:
Wed Oct 26 02:02:09 2016 +0000
Revision:
0:eb2258e8c4b5
Child:
1:3c21da72660d
board<-->N64 communication functional

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ownasaurus 0:eb2258e8c4b5 1 #include "mbed.h"
Ownasaurus 0:eb2258e8c4b5 2
Ownasaurus 0:eb2258e8c4b5 3 extern "C" void my_wait_us_asm (int n);
Ownasaurus 0:eb2258e8c4b5 4
Ownasaurus 0:eb2258e8c4b5 5 DigitalOut myled(LED1);
Ownasaurus 0:eb2258e8c4b5 6 Serial pc(USBTX, USBRX); // tx, rx
Ownasaurus 0:eb2258e8c4b5 7 DigitalInOut data(PA_8);
Ownasaurus 0:eb2258e8c4b5 8 DigitalIn button(PC_13);
Ownasaurus 0:eb2258e8c4b5 9
Ownasaurus 0:eb2258e8c4b5 10 // 0 is 3 microseconds low followed by 1 microsecond high
Ownasaurus 0:eb2258e8c4b5 11 // 1 is 1 microsecond low followed by 3 microseconds high
Ownasaurus 0:eb2258e8c4b5 12 unsigned int GetMiddleOfPulse()
Ownasaurus 0:eb2258e8c4b5 13 {
Ownasaurus 0:eb2258e8c4b5 14 // wait for line to go high
Ownasaurus 0:eb2258e8c4b5 15 while(1)
Ownasaurus 0:eb2258e8c4b5 16 {
Ownasaurus 0:eb2258e8c4b5 17 if(data.read() == 1) break;
Ownasaurus 0:eb2258e8c4b5 18 }
Ownasaurus 0:eb2258e8c4b5 19
Ownasaurus 0:eb2258e8c4b5 20 // wait for line to go low
Ownasaurus 0:eb2258e8c4b5 21 while(1)
Ownasaurus 0:eb2258e8c4b5 22 {
Ownasaurus 0:eb2258e8c4b5 23 if(data.read() == 0) break;
Ownasaurus 0:eb2258e8c4b5 24 }
Ownasaurus 0:eb2258e8c4b5 25
Ownasaurus 0:eb2258e8c4b5 26 // now we have the falling edge
Ownasaurus 0:eb2258e8c4b5 27 // wait 2 microseconds to be in the middle of the pulse, and read. high --> 1. low --> 0.
Ownasaurus 0:eb2258e8c4b5 28 my_wait_us_asm(2);
Ownasaurus 0:eb2258e8c4b5 29 return (unsigned int) data.read();
Ownasaurus 0:eb2258e8c4b5 30 }
Ownasaurus 0:eb2258e8c4b5 31
Ownasaurus 0:eb2258e8c4b5 32 // continuously read bits until at least 9 are read, confirm valid command, return without stop bit
Ownasaurus 0:eb2258e8c4b5 33 unsigned int readCommand()
Ownasaurus 0:eb2258e8c4b5 34 {
Ownasaurus 0:eb2258e8c4b5 35 unsigned int command = GetMiddleOfPulse(), bits_read = 1;
Ownasaurus 0:eb2258e8c4b5 36
Ownasaurus 0:eb2258e8c4b5 37 while(1) // read at least 9 bits (2 bytes + stop bit)
Ownasaurus 0:eb2258e8c4b5 38 {
Ownasaurus 0:eb2258e8c4b5 39 //my_wait_us_asm(4);
Ownasaurus 0:eb2258e8c4b5 40 command = command << 1; // make room for the new bit
Ownasaurus 0:eb2258e8c4b5 41 //command += data.read(); // place the new bit into the command
Ownasaurus 0:eb2258e8c4b5 42 command += GetMiddleOfPulse();
Ownasaurus 0:eb2258e8c4b5 43 command &= 0x1FF; // remove all except the last 9 bits
Ownasaurus 0:eb2258e8c4b5 44
Ownasaurus 0:eb2258e8c4b5 45 bits_read++;
Ownasaurus 0:eb2258e8c4b5 46
Ownasaurus 0:eb2258e8c4b5 47 if(bits_read >= 9) // only consider when at least a whole command's length has been read
Ownasaurus 0:eb2258e8c4b5 48 {
Ownasaurus 0:eb2258e8c4b5 49 if(command == 0x3 || command == 0x1 || command == 0x1FF)
Ownasaurus 0:eb2258e8c4b5 50 {
Ownasaurus 0:eb2258e8c4b5 51 // 0x3 = 0x1 + stop bit --> get controller state
Ownasaurus 0:eb2258e8c4b5 52 // 0x1 = 0x0 + stop bit --> who are you?
Ownasaurus 0:eb2258e8c4b5 53 // 0x1FF = 0xFF + stop bit --> reset signal
Ownasaurus 0:eb2258e8c4b5 54 command = command >> 1; // get rid of the stop bit
Ownasaurus 0:eb2258e8c4b5 55 return command;
Ownasaurus 0:eb2258e8c4b5 56 }
Ownasaurus 0:eb2258e8c4b5 57 }
Ownasaurus 0:eb2258e8c4b5 58 }
Ownasaurus 0:eb2258e8c4b5 59 }
Ownasaurus 0:eb2258e8c4b5 60
Ownasaurus 0:eb2258e8c4b5 61 void write_1()
Ownasaurus 0:eb2258e8c4b5 62 {
Ownasaurus 0:eb2258e8c4b5 63 data = 0;
Ownasaurus 0:eb2258e8c4b5 64 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 65 data = 1;
Ownasaurus 0:eb2258e8c4b5 66 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 67 //data = 0;
Ownasaurus 0:eb2258e8c4b5 68 //pc.printf("1");
Ownasaurus 0:eb2258e8c4b5 69 }
Ownasaurus 0:eb2258e8c4b5 70
Ownasaurus 0:eb2258e8c4b5 71 void write_0()
Ownasaurus 0:eb2258e8c4b5 72 {
Ownasaurus 0:eb2258e8c4b5 73 data = 0;
Ownasaurus 0:eb2258e8c4b5 74 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 75 data = 1;
Ownasaurus 0:eb2258e8c4b5 76 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 77 //data = 0;
Ownasaurus 0:eb2258e8c4b5 78 //pc.printf("0");
Ownasaurus 0:eb2258e8c4b5 79 }
Ownasaurus 0:eb2258e8c4b5 80
Ownasaurus 0:eb2258e8c4b5 81
Ownasaurus 0:eb2258e8c4b5 82 void sendStop()
Ownasaurus 0:eb2258e8c4b5 83 {
Ownasaurus 0:eb2258e8c4b5 84 data = 0;
Ownasaurus 0:eb2258e8c4b5 85 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 86 data = 1;
Ownasaurus 0:eb2258e8c4b5 87 }
Ownasaurus 0:eb2258e8c4b5 88
Ownasaurus 0:eb2258e8c4b5 89 void sendByte(unsigned char b)
Ownasaurus 0:eb2258e8c4b5 90 {
Ownasaurus 0:eb2258e8c4b5 91 //pc.printf("\nTrying to send 0x%x\n",b);
Ownasaurus 0:eb2258e8c4b5 92 for(int i = 0;i < 8;i++) // send all 8 bits, one at a time
Ownasaurus 0:eb2258e8c4b5 93 //for(int i = 7;i >= 0;i--) // send all 8 bits, in reverse order, one at a time
Ownasaurus 0:eb2258e8c4b5 94 {
Ownasaurus 0:eb2258e8c4b5 95 if((b >> i) & 1)
Ownasaurus 0:eb2258e8c4b5 96 {
Ownasaurus 0:eb2258e8c4b5 97 write_1();
Ownasaurus 0:eb2258e8c4b5 98 }
Ownasaurus 0:eb2258e8c4b5 99 else
Ownasaurus 0:eb2258e8c4b5 100 {
Ownasaurus 0:eb2258e8c4b5 101 write_0();
Ownasaurus 0:eb2258e8c4b5 102 }
Ownasaurus 0:eb2258e8c4b5 103 }
Ownasaurus 0:eb2258e8c4b5 104 }
Ownasaurus 0:eb2258e8c4b5 105
Ownasaurus 0:eb2258e8c4b5 106 int main()
Ownasaurus 0:eb2258e8c4b5 107 {
Ownasaurus 0:eb2258e8c4b5 108 __disable_irq(); // Disable Interrupts
Ownasaurus 0:eb2258e8c4b5 109 pc.printf("SystemCoreClock = %d Hz\n", SystemCoreClock);
Ownasaurus 0:eb2258e8c4b5 110
Ownasaurus 0:eb2258e8c4b5 111 while(1)
Ownasaurus 0:eb2258e8c4b5 112 {
Ownasaurus 0:eb2258e8c4b5 113 // Set pin mode to input
Ownasaurus 0:eb2258e8c4b5 114 data.input();
Ownasaurus 0:eb2258e8c4b5 115
Ownasaurus 0:eb2258e8c4b5 116 // Read command
Ownasaurus 0:eb2258e8c4b5 117 unsigned int cmd = readCommand();
Ownasaurus 0:eb2258e8c4b5 118
Ownasaurus 0:eb2258e8c4b5 119 //pc.printf("Read command: %u\n", cmd);
Ownasaurus 0:eb2258e8c4b5 120
Ownasaurus 0:eb2258e8c4b5 121 my_wait_us_asm(2); // wait a small amount of time before replying
Ownasaurus 0:eb2258e8c4b5 122
Ownasaurus 0:eb2258e8c4b5 123 // Set pin mode to output
Ownasaurus 0:eb2258e8c4b5 124 data.output();
Ownasaurus 0:eb2258e8c4b5 125
Ownasaurus 0:eb2258e8c4b5 126 switch(cmd)
Ownasaurus 0:eb2258e8c4b5 127 {
Ownasaurus 0:eb2258e8c4b5 128 case 0x00: // identity
Ownasaurus 0:eb2258e8c4b5 129 case 0xFF: // reset
Ownasaurus 0:eb2258e8c4b5 130 //pc.printf("Received identity ");
Ownasaurus 0:eb2258e8c4b5 131 // reply 0x05, 0x00, 0x02
Ownasaurus 0:eb2258e8c4b5 132 sendByte(0x05);
Ownasaurus 0:eb2258e8c4b5 133 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 134 sendByte(0x02);
Ownasaurus 0:eb2258e8c4b5 135 sendStop();
Ownasaurus 0:eb2258e8c4b5 136 break;
Ownasaurus 0:eb2258e8c4b5 137 case 0x01: // poll for state
Ownasaurus 0:eb2258e8c4b5 138 if(!button.read()) // simulate Start pressed
Ownasaurus 0:eb2258e8c4b5 139 {
Ownasaurus 0:eb2258e8c4b5 140 sendByte(0x08); // I think this is start, 4th bit
Ownasaurus 0:eb2258e8c4b5 141 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 142 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 143 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 144 sendStop();
Ownasaurus 0:eb2258e8c4b5 145 break;
Ownasaurus 0:eb2258e8c4b5 146 }
Ownasaurus 0:eb2258e8c4b5 147 else
Ownasaurus 0:eb2258e8c4b5 148 {
Ownasaurus 0:eb2258e8c4b5 149 // respond with controller state
Ownasaurus 0:eb2258e8c4b5 150 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 151 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 152 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 153 sendByte(0x00);
Ownasaurus 0:eb2258e8c4b5 154 sendStop();
Ownasaurus 0:eb2258e8c4b5 155 break;
Ownasaurus 0:eb2258e8c4b5 156 }
Ownasaurus 0:eb2258e8c4b5 157 }
Ownasaurus 0:eb2258e8c4b5 158 }
Ownasaurus 0:eb2258e8c4b5 159 }