Marine Electricals
/
Nucleo_key_read
mcp23s17 key read via spi
main.cpp@2:bf1a7c26ec7d, 2017-10-14 (annotated)
- Committer:
- viewdeep51
- Date:
- Sat Oct 14 13:07:56 2017 +0000
- Revision:
- 2:bf1a7c26ec7d
- Parent:
- 0:21b36798fd00
14/10/2017
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bcostm | 0:21b36798fd00 | 1 | #include "mbed.h" |
viewdeep51 | 2:bf1a7c26ec7d | 2 | #include "MCP23S17.h" |
viewdeep51 | 2:bf1a7c26ec7d | 3 | #include "pindefine.h" |
viewdeep51 | 2:bf1a7c26ec7d | 4 | |
viewdeep51 | 2:bf1a7c26ec7d | 5 | Serial pc(USBTX,USBRX); |
viewdeep51 | 2:bf1a7c26ec7d | 6 | |
viewdeep51 | 2:bf1a7c26ec7d | 7 | SPI _SPI3(SPI3_MOSI, SPI3_MISO, SPI3_SCK); //for keyscan mcp23s17 |
viewdeep51 | 2:bf1a7c26ec7d | 8 | |
viewdeep51 | 2:bf1a7c26ec7d | 9 | MCP23S17 mcp23s17_1(1,_SPI3, SPI3_CS1,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-1 key detection |
viewdeep51 | 2:bf1a7c26ec7d | 10 | MCP23S17 mcp23s17_2(2,_SPI3, SPI3_CS2,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-2 key detection |
viewdeep51 | 2:bf1a7c26ec7d | 11 | |
viewdeep51 | 2:bf1a7c26ec7d | 12 | //interrupts definations |
viewdeep51 | 2:bf1a7c26ec7d | 13 | InterruptIn int_A(INT_A); //8commands |
viewdeep51 | 2:bf1a7c26ec7d | 14 | InterruptIn int_B(INT_B); //4 3commands+1ack |
viewdeep51 | 2:bf1a7c26ec7d | 15 | InterruptIn int_C(INT_C); //4(3 controls(INC+,DEC-,TEST)+1 req) enbaled for all |
viewdeep51 | 2:bf1a7c26ec7d | 16 | |
viewdeep51 | 2:bf1a7c26ec7d | 17 | enum AddrID |
viewdeep51 | 2:bf1a7c26ec7d | 18 | { |
viewdeep51 | 2:bf1a7c26ec7d | 19 | eot_Master = 1, |
viewdeep51 | 2:bf1a7c26ec7d | 20 | eot_Submaster, |
viewdeep51 | 2:bf1a7c26ec7d | 21 | eot_Slave_MCR, |
viewdeep51 | 2:bf1a7c26ec7d | 22 | eot_Slave_ER, |
viewdeep51 | 2:bf1a7c26ec7d | 23 | eot_Listner_WP, |
viewdeep51 | 2:bf1a7c26ec7d | 24 | eot_Listner_WS, |
viewdeep51 | 2:bf1a7c26ec7d | 25 | eot_Listner_OPS, |
viewdeep51 | 2:bf1a7c26ec7d | 26 | eot_Listner_ASP = 8 |
viewdeep51 | 2:bf1a7c26ec7d | 27 | }; |
viewdeep51 | 2:bf1a7c26ec7d | 28 | |
viewdeep51 | 2:bf1a7c26ec7d | 29 | enum pin_STATUS |
viewdeep51 | 2:bf1a7c26ec7d | 30 | { |
viewdeep51 | 2:bf1a7c26ec7d | 31 | _OFF =0, |
viewdeep51 | 2:bf1a7c26ec7d | 32 | _ON =1 |
viewdeep51 | 2:bf1a7c26ec7d | 33 | }; |
viewdeep51 | 2:bf1a7c26ec7d | 34 | |
viewdeep51 | 2:bf1a7c26ec7d | 35 | enum KEY |
viewdeep51 | 2:bf1a7c26ec7d | 36 | { |
viewdeep51 | 2:bf1a7c26ec7d | 37 | FH=0, |
viewdeep51 | 2:bf1a7c26ec7d | 38 | HH, |
viewdeep51 | 2:bf1a7c26ec7d | 39 | SH, |
viewdeep51 | 2:bf1a7c26ec7d | 40 | DSH, |
viewdeep51 | 2:bf1a7c26ec7d | 41 | FS, |
viewdeep51 | 2:bf1a7c26ec7d | 42 | HS, |
viewdeep51 | 2:bf1a7c26ec7d | 43 | SS, |
viewdeep51 | 2:bf1a7c26ec7d | 44 | DSS, |
viewdeep51 | 2:bf1a7c26ec7d | 45 | STOP, |
viewdeep51 | 2:bf1a7c26ec7d | 46 | STBY, |
viewdeep51 | 2:bf1a7c26ec7d | 47 | FWE, |
viewdeep51 | 2:bf1a7c26ec7d | 48 | FALSE0 = 11 |
viewdeep51 | 2:bf1a7c26ec7d | 49 | }; |
viewdeep51 | 2:bf1a7c26ec7d | 50 | enum KEY key_ID; |
viewdeep51 | 2:bf1a7c26ec7d | 51 | |
viewdeep51 | 2:bf1a7c26ec7d | 52 | enum CTRL |
viewdeep51 | 2:bf1a7c26ec7d | 53 | { |
viewdeep51 | 2:bf1a7c26ec7d | 54 | REQ_ = 1, |
viewdeep51 | 2:bf1a7c26ec7d | 55 | ACK_, |
viewdeep51 | 2:bf1a7c26ec7d | 56 | FALSE1 = 3 |
viewdeep51 | 2:bf1a7c26ec7d | 57 | }; |
viewdeep51 | 2:bf1a7c26ec7d | 58 | enum CTRL ctrl_ID; |
viewdeep51 | 2:bf1a7c26ec7d | 59 | |
viewdeep51 | 2:bf1a7c26ec7d | 60 | enum CHANNEL |
viewdeep51 | 2:bf1a7c26ec7d | 61 | { |
viewdeep51 | 2:bf1a7c26ec7d | 62 | ch_A=1, |
viewdeep51 | 2:bf1a7c26ec7d | 63 | ch_B, |
viewdeep51 | 2:bf1a7c26ec7d | 64 | ch_C, |
viewdeep51 | 2:bf1a7c26ec7d | 65 | ch_D=4 |
viewdeep51 | 2:bf1a7c26ec7d | 66 | }; //keyscan channelA,B,C,Dof MCP23s17 1& 2 respectively |
viewdeep51 | 2:bf1a7c26ec7d | 67 | enum CHANNEL ch; |
viewdeep51 | 2:bf1a7c26ec7d | 68 | |
viewdeep51 | 2:bf1a7c26ec7d | 69 | int cmd,req,ack; |
viewdeep51 | 2:bf1a7c26ec7d | 70 | |
viewdeep51 | 2:bf1a7c26ec7d | 71 | class LED{ |
viewdeep51 | 2:bf1a7c26ec7d | 72 | public: |
viewdeep51 | 2:bf1a7c26ec7d | 73 | LED(PinName led); //constructor declaration |
viewdeep51 | 2:bf1a7c26ec7d | 74 | void set_Brightness(float bright); |
viewdeep51 | 2:bf1a7c26ec7d | 75 | void ON(); |
viewdeep51 | 2:bf1a7c26ec7d | 76 | void OFF(); |
viewdeep51 | 2:bf1a7c26ec7d | 77 | void FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 78 | private: |
viewdeep51 | 2:bf1a7c26ec7d | 79 | Ticker _flash; |
viewdeep51 | 2:bf1a7c26ec7d | 80 | bool on_off; |
viewdeep51 | 2:bf1a7c26ec7d | 81 | bool Fllash; |
viewdeep51 | 2:bf1a7c26ec7d | 82 | float brightness; |
viewdeep51 | 2:bf1a7c26ec7d | 83 | PwmOut _LED; |
viewdeep51 | 2:bf1a7c26ec7d | 84 | void __flash(); |
viewdeep51 | 2:bf1a7c26ec7d | 85 | }; |
viewdeep51 | 2:bf1a7c26ec7d | 86 | LED::LED(PinName led): _LED(led) //constructor defination |
viewdeep51 | 2:bf1a7c26ec7d | 87 | { |
viewdeep51 | 2:bf1a7c26ec7d | 88 | brightness = 0.000; |
viewdeep51 | 2:bf1a7c26ec7d | 89 | on_off = false; |
viewdeep51 | 2:bf1a7c26ec7d | 90 | Fllash = false; |
viewdeep51 | 2:bf1a7c26ec7d | 91 | _LED = brightness; |
viewdeep51 | 2:bf1a7c26ec7d | 92 | } |
viewdeep51 | 2:bf1a7c26ec7d | 93 | |
viewdeep51 | 2:bf1a7c26ec7d | 94 | void LED::set_Brightness(float bright) |
viewdeep51 | 2:bf1a7c26ec7d | 95 | { |
viewdeep51 | 2:bf1a7c26ec7d | 96 | brightness = bright; |
viewdeep51 | 2:bf1a7c26ec7d | 97 | if(!Fllash) |
viewdeep51 | 2:bf1a7c26ec7d | 98 | _LED = bright; |
viewdeep51 | 2:bf1a7c26ec7d | 99 | else |
viewdeep51 | 2:bf1a7c26ec7d | 100 | __nop(); |
viewdeep51 | 2:bf1a7c26ec7d | 101 | } |
viewdeep51 | 2:bf1a7c26ec7d | 102 | |
viewdeep51 | 2:bf1a7c26ec7d | 103 | void LED::ON() |
viewdeep51 | 2:bf1a7c26ec7d | 104 | { |
viewdeep51 | 2:bf1a7c26ec7d | 105 | _LED = brightness; |
viewdeep51 | 2:bf1a7c26ec7d | 106 | Fllash = false; |
viewdeep51 | 2:bf1a7c26ec7d | 107 | _flash.detach(); |
viewdeep51 | 2:bf1a7c26ec7d | 108 | } |
viewdeep51 | 2:bf1a7c26ec7d | 109 | |
viewdeep51 | 2:bf1a7c26ec7d | 110 | void LED::OFF() |
viewdeep51 | 2:bf1a7c26ec7d | 111 | { |
viewdeep51 | 2:bf1a7c26ec7d | 112 | _LED = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 113 | Fllash = false; |
viewdeep51 | 2:bf1a7c26ec7d | 114 | _flash.detach(); |
viewdeep51 | 2:bf1a7c26ec7d | 115 | } |
viewdeep51 | 2:bf1a7c26ec7d | 116 | |
viewdeep51 | 2:bf1a7c26ec7d | 117 | void LED::FLASHH() |
viewdeep51 | 2:bf1a7c26ec7d | 118 | { |
viewdeep51 | 2:bf1a7c26ec7d | 119 | Fllash = true; |
viewdeep51 | 2:bf1a7c26ec7d | 120 | _flash.attach(callback(this, &LED::__flash),0.5); |
viewdeep51 | 2:bf1a7c26ec7d | 121 | } |
viewdeep51 | 2:bf1a7c26ec7d | 122 | |
viewdeep51 | 2:bf1a7c26ec7d | 123 | void LED::__flash() |
viewdeep51 | 2:bf1a7c26ec7d | 124 | { |
viewdeep51 | 2:bf1a7c26ec7d | 125 | if(on_off) |
viewdeep51 | 2:bf1a7c26ec7d | 126 | _LED = brightness; |
viewdeep51 | 2:bf1a7c26ec7d | 127 | else |
viewdeep51 | 2:bf1a7c26ec7d | 128 | _LED = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 129 | |
viewdeep51 | 2:bf1a7c26ec7d | 130 | on_off = !on_off; |
viewdeep51 | 2:bf1a7c26ec7d | 131 | } |
viewdeep51 | 2:bf1a7c26ec7d | 132 | |
viewdeep51 | 2:bf1a7c26ec7d | 133 | LED LED_CMD[9] = {_FH,_HH,_DSH,_FS,_HS,_SS,_DSS,_STOP,_STBY}; //ack and req exchanged |
viewdeep51 | 2:bf1a7c26ec7d | 134 | |
viewdeep51 | 2:bf1a7c26ec7d | 135 | LED LED_CTRL[2] = {_REQ,_ACK}; |
viewdeep51 | 2:bf1a7c26ec7d | 136 | LED LED_ACH[8] = {_WH,_BRDG,_MCR,_ER,_WP,_WS,_OPS,_ASP}; |
viewdeep51 | 2:bf1a7c26ec7d | 137 | |
viewdeep51 | 2:bf1a7c26ec7d | 138 | void CMD_handler(uint8_t CMD_ID) //function sacnning all the 11 command keys |
viewdeep51 | 2:bf1a7c26ec7d | 139 | { |
viewdeep51 | 2:bf1a7c26ec7d | 140 | if(CMD_ID != FALSE0) |
viewdeep51 | 2:bf1a7c26ec7d | 141 | { |
viewdeep51 | 2:bf1a7c26ec7d | 142 | cmd = CMD_ID; //new cmd data updated any value between 1 to 11 |
viewdeep51 | 2:bf1a7c26ec7d | 143 | LED_CMD[cmd].FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 144 | wait_ms(10); |
viewdeep51 | 2:bf1a7c26ec7d | 145 | } |
viewdeep51 | 2:bf1a7c26ec7d | 146 | else |
viewdeep51 | 2:bf1a7c26ec7d | 147 | __nop(); |
viewdeep51 | 2:bf1a7c26ec7d | 148 | } |
viewdeep51 | 2:bf1a7c26ec7d | 149 | |
viewdeep51 | 2:bf1a7c26ec7d | 150 | void CTRL_handler(uint8_t CTRL_ID) //handle control transfer |
viewdeep51 | 2:bf1a7c26ec7d | 151 | { |
viewdeep51 | 2:bf1a7c26ec7d | 152 | if(CTRL_ID != FALSE1) |
viewdeep51 | 2:bf1a7c26ec7d | 153 | { |
viewdeep51 | 2:bf1a7c26ec7d | 154 | |
viewdeep51 | 2:bf1a7c26ec7d | 155 | if(CTRL_ID == REQ_) |
viewdeep51 | 2:bf1a7c26ec7d | 156 | { |
viewdeep51 | 2:bf1a7c26ec7d | 157 | req = REQ_; //req data updated 0 here, same int values as in enum |
viewdeep51 | 2:bf1a7c26ec7d | 158 | LED_CTRL[REQ_-1].FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 159 | } |
viewdeep51 | 2:bf1a7c26ec7d | 160 | else |
viewdeep51 | 2:bf1a7c26ec7d | 161 | __nop(); |
viewdeep51 | 2:bf1a7c26ec7d | 162 | if(CTRL_ID == ACK_) |
viewdeep51 | 2:bf1a7c26ec7d | 163 | { |
viewdeep51 | 2:bf1a7c26ec7d | 164 | ack = ACK_; //ack data updated 2 here |
viewdeep51 | 2:bf1a7c26ec7d | 165 | LED_CTRL[ACK_-1].FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 166 | } |
viewdeep51 | 2:bf1a7c26ec7d | 167 | else |
viewdeep51 | 2:bf1a7c26ec7d | 168 | __nop(); |
viewdeep51 | 2:bf1a7c26ec7d | 169 | } |
viewdeep51 | 2:bf1a7c26ec7d | 170 | else |
viewdeep51 | 2:bf1a7c26ec7d | 171 | __nop(); //then do nothing |
viewdeep51 | 2:bf1a7c26ec7d | 172 | } |
viewdeep51 | 2:bf1a7c26ec7d | 173 | |
viewdeep51 | 2:bf1a7c26ec7d | 174 | unsigned char read_KEY_SPI(int CH) |
viewdeep51 | 2:bf1a7c26ec7d | 175 | { |
viewdeep51 | 2:bf1a7c26ec7d | 176 | char _key; |
viewdeep51 | 2:bf1a7c26ec7d | 177 | uint8_t spi_err=0; |
viewdeep51 | 2:bf1a7c26ec7d | 178 | switch(CH) |
viewdeep51 | 2:bf1a7c26ec7d | 179 | { |
viewdeep51 | 2:bf1a7c26ec7d | 180 | case 1: |
viewdeep51 | 2:bf1a7c26ec7d | 181 | if(spi_err<3) |
viewdeep51 | 2:bf1a7c26ec7d | 182 | { |
viewdeep51 | 2:bf1a7c26ec7d | 183 | _key=mcp23s17_1.gpioa(); // read(INTCAPA_ADDR); |
viewdeep51 | 2:bf1a7c26ec7d | 184 | //if(mcp23s17_1.intcapa()) //read(INTCAPA_ADDR)) again if some non zero value obtained //if Interrupt pending |
viewdeep51 | 2:bf1a7c26ec7d | 185 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 186 | // spi_err++; |
viewdeep51 | 2:bf1a7c26ec7d | 187 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 188 | // else |
viewdeep51 | 2:bf1a7c26ec7d | 189 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 190 | // spi_err=0; |
viewdeep51 | 2:bf1a7c26ec7d | 191 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 192 | } |
viewdeep51 | 2:bf1a7c26ec7d | 193 | else |
viewdeep51 | 2:bf1a7c26ec7d | 194 | { |
viewdeep51 | 2:bf1a7c26ec7d | 195 | _key=0; |
viewdeep51 | 2:bf1a7c26ec7d | 196 | LED_ACH[1].FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 197 | } |
viewdeep51 | 2:bf1a7c26ec7d | 198 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 199 | |
viewdeep51 | 2:bf1a7c26ec7d | 200 | case 2: |
viewdeep51 | 2:bf1a7c26ec7d | 201 | if(spi_err<3) |
viewdeep51 | 2:bf1a7c26ec7d | 202 | { |
viewdeep51 | 2:bf1a7c26ec7d | 203 | _key=mcp23s17_1.gpiob(); |
viewdeep51 | 2:bf1a7c26ec7d | 204 | // if(mcp23s17_1.intcapb()) //if Interrupt pending |
viewdeep51 | 2:bf1a7c26ec7d | 205 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 206 | // spi_err++; |
viewdeep51 | 2:bf1a7c26ec7d | 207 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 208 | // else |
viewdeep51 | 2:bf1a7c26ec7d | 209 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 210 | // spi_err=0; |
viewdeep51 | 2:bf1a7c26ec7d | 211 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 212 | } |
viewdeep51 | 2:bf1a7c26ec7d | 213 | else |
viewdeep51 | 2:bf1a7c26ec7d | 214 | { |
viewdeep51 | 2:bf1a7c26ec7d | 215 | _key=0; |
viewdeep51 | 2:bf1a7c26ec7d | 216 | } |
viewdeep51 | 2:bf1a7c26ec7d | 217 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 218 | |
viewdeep51 | 2:bf1a7c26ec7d | 219 | case 3: |
viewdeep51 | 2:bf1a7c26ec7d | 220 | if(spi_err<3) |
viewdeep51 | 2:bf1a7c26ec7d | 221 | { |
viewdeep51 | 2:bf1a7c26ec7d | 222 | _key=mcp23s17_2.gpioa(); |
viewdeep51 | 2:bf1a7c26ec7d | 223 | // if(mcp23s17_2.intcapa()) //if Interrupt pending |
viewdeep51 | 2:bf1a7c26ec7d | 224 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 225 | // spi_err++; |
viewdeep51 | 2:bf1a7c26ec7d | 226 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 227 | // else |
viewdeep51 | 2:bf1a7c26ec7d | 228 | // { |
viewdeep51 | 2:bf1a7c26ec7d | 229 | // spi_err=0; |
viewdeep51 | 2:bf1a7c26ec7d | 230 | // } |
viewdeep51 | 2:bf1a7c26ec7d | 231 | } |
viewdeep51 | 2:bf1a7c26ec7d | 232 | else |
viewdeep51 | 2:bf1a7c26ec7d | 233 | { |
viewdeep51 | 2:bf1a7c26ec7d | 234 | _key=0; |
viewdeep51 | 2:bf1a7c26ec7d | 235 | } |
viewdeep51 | 2:bf1a7c26ec7d | 236 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 237 | |
viewdeep51 | 2:bf1a7c26ec7d | 238 | case 4: |
viewdeep51 | 2:bf1a7c26ec7d | 239 | _key = mcp23s17_2.gpiob(); //address read PORTB of chip2 |
viewdeep51 | 2:bf1a7c26ec7d | 240 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 241 | default: |
viewdeep51 | 2:bf1a7c26ec7d | 242 | _key = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 243 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 244 | } |
viewdeep51 | 2:bf1a7c26ec7d | 245 | return(_key); |
viewdeep51 | 2:bf1a7c26ec7d | 246 | } |
viewdeep51 | 2:bf1a7c26ec7d | 247 | void read_KEY_A() //PORTA of MCP23s17(1) for FH to DSS |
viewdeep51 | 2:bf1a7c26ec7d | 248 | { |
viewdeep51 | 2:bf1a7c26ec7d | 249 | char key_status = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 250 | key_status = read_KEY_SPI(ch_A); //to read portA of mcp23s17(1) |
viewdeep51 | 2:bf1a7c26ec7d | 251 | pc.printf("PORTA button pressed == %d\n",key_status); |
viewdeep51 | 2:bf1a7c26ec7d | 252 | wait_ms(2); |
viewdeep51 | 2:bf1a7c26ec7d | 253 | switch(key_status) |
viewdeep51 | 2:bf1a7c26ec7d | 254 | { |
viewdeep51 | 2:bf1a7c26ec7d | 255 | case 0xfe: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 256 | key_ID = FH; |
viewdeep51 | 2:bf1a7c26ec7d | 257 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 258 | case 0xfd: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 259 | key_ID = HH; |
viewdeep51 | 2:bf1a7c26ec7d | 260 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 261 | case 0xfb: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 262 | key_ID = SH; |
viewdeep51 | 2:bf1a7c26ec7d | 263 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 264 | case 0xf7: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 265 | key_ID = DSH; |
viewdeep51 | 2:bf1a7c26ec7d | 266 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 267 | case 0xef: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 268 | key_ID = FS; |
viewdeep51 | 2:bf1a7c26ec7d | 269 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 270 | case 0xdf: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 271 | key_ID = HS; |
viewdeep51 | 2:bf1a7c26ec7d | 272 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 273 | case 0xbf: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 274 | key_ID = SS; |
viewdeep51 | 2:bf1a7c26ec7d | 275 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 276 | case 0x7f: //0xfe GPA0 |
viewdeep51 | 2:bf1a7c26ec7d | 277 | key_ID = DSS; |
viewdeep51 | 2:bf1a7c26ec7d | 278 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 279 | default: |
viewdeep51 | 2:bf1a7c26ec7d | 280 | key_ID = FALSE0; |
viewdeep51 | 2:bf1a7c26ec7d | 281 | break; |
viewdeep51 | 2:bf1a7c26ec7d | 282 | } |
viewdeep51 | 2:bf1a7c26ec7d | 283 | CMD_handler(key_ID); |
viewdeep51 | 2:bf1a7c26ec7d | 284 | } |
viewdeep51 | 2:bf1a7c26ec7d | 285 | |
viewdeep51 | 2:bf1a7c26ec7d | 286 | void read_KEY_B() //PORTB of MCP23s17(1) to read STOP,STBY,FWE and ACK keys |
viewdeep51 | 2:bf1a7c26ec7d | 287 | { |
viewdeep51 | 2:bf1a7c26ec7d | 288 | char key_status = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 289 | key_status = read_KEY_SPI(ch_B); //to read portBof mcp23s17(1) |
viewdeep51 | 2:bf1a7c26ec7d | 290 | pc.printf("PORTB button pressed == %d\n",key_status); |
viewdeep51 | 2:bf1a7c26ec7d | 291 | wait_ms(2); |
viewdeep51 | 2:bf1a7c26ec7d | 292 | if(key_status != 0xff) |
viewdeep51 | 2:bf1a7c26ec7d | 293 | { |
viewdeep51 | 2:bf1a7c26ec7d | 294 | if(key_status==0xf7) |
viewdeep51 | 2:bf1a7c26ec7d | 295 | { |
viewdeep51 | 2:bf1a7c26ec7d | 296 | ctrl_ID = ACK_; //control ACK button pressed |
viewdeep51 | 2:bf1a7c26ec7d | 297 | CTRL_handler(ctrl_ID); |
viewdeep51 | 2:bf1a7c26ec7d | 298 | } |
viewdeep51 | 2:bf1a7c26ec7d | 299 | else |
viewdeep51 | 2:bf1a7c26ec7d | 300 | { |
viewdeep51 | 2:bf1a7c26ec7d | 301 | if(key_status == 0xfe) |
viewdeep51 | 2:bf1a7c26ec7d | 302 | key_ID = STOP; |
viewdeep51 | 2:bf1a7c26ec7d | 303 | else if(key_status == 0xfd) |
viewdeep51 | 2:bf1a7c26ec7d | 304 | key_ID = STBY; |
viewdeep51 | 2:bf1a7c26ec7d | 305 | else if(key_status == 0xfb) |
viewdeep51 | 2:bf1a7c26ec7d | 306 | key_ID = FWE; |
viewdeep51 | 2:bf1a7c26ec7d | 307 | else |
viewdeep51 | 2:bf1a7c26ec7d | 308 | { |
viewdeep51 | 2:bf1a7c26ec7d | 309 | key_ID = FALSE0; |
viewdeep51 | 2:bf1a7c26ec7d | 310 | ctrl_ID = FALSE1; |
viewdeep51 | 2:bf1a7c26ec7d | 311 | } |
viewdeep51 | 2:bf1a7c26ec7d | 312 | CMD_handler(key_ID); |
viewdeep51 | 2:bf1a7c26ec7d | 313 | } |
bcostm | 0:21b36798fd00 | 314 | } |
bcostm | 0:21b36798fd00 | 315 | } |
viewdeep51 | 2:bf1a7c26ec7d | 316 | void read_KEY_C() // PORTA of MCP23s17(2) to read REQ,INC,DEC and TEST keys |
viewdeep51 | 2:bf1a7c26ec7d | 317 | { |
viewdeep51 | 2:bf1a7c26ec7d | 318 | char key_status = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 319 | key_status = read_KEY_SPI(ch_C); //to read portA of mcp23s17(2) |
viewdeep51 | 2:bf1a7c26ec7d | 320 | pc.printf("PORTC button pressed == %d\n",key_status); |
viewdeep51 | 2:bf1a7c26ec7d | 321 | if(key_status != 0xff) |
viewdeep51 | 2:bf1a7c26ec7d | 322 | { |
viewdeep51 | 2:bf1a7c26ec7d | 323 | if(key_status==0xfe) |
viewdeep51 | 2:bf1a7c26ec7d | 324 | { |
viewdeep51 | 2:bf1a7c26ec7d | 325 | ctrl_ID = REQ_; //control transfer REQ button pressed |
viewdeep51 | 2:bf1a7c26ec7d | 326 | CTRL_handler(ctrl_ID); |
viewdeep51 | 2:bf1a7c26ec7d | 327 | } |
viewdeep51 | 2:bf1a7c26ec7d | 328 | else |
viewdeep51 | 2:bf1a7c26ec7d | 329 | { |
viewdeep51 | 2:bf1a7c26ec7d | 330 | __nop(); |
viewdeep51 | 2:bf1a7c26ec7d | 331 | /* |
viewdeep51 | 2:bf1a7c26ec7d | 332 | if(key_status==0xfd) |
viewdeep51 | 2:bf1a7c26ec7d | 333 | set_ID = INC; //setting key INC |
viewdeep51 | 2:bf1a7c26ec7d | 334 | else if(key_status==0xfb) |
viewdeep51 | 2:bf1a7c26ec7d | 335 | set_ID = DEC; //setting key DEC |
viewdeep51 | 2:bf1a7c26ec7d | 336 | else if(key_status==0xf7) |
viewdeep51 | 2:bf1a7c26ec7d | 337 | set_ID = TEST; //setting key TEST |
viewdeep51 | 2:bf1a7c26ec7d | 338 | else |
viewdeep51 | 2:bf1a7c26ec7d | 339 | { |
viewdeep51 | 2:bf1a7c26ec7d | 340 | set_ID = FALSE2; //setting key TEST |
viewdeep51 | 2:bf1a7c26ec7d | 341 | ctrl_ID = FALSE1; |
viewdeep51 | 2:bf1a7c26ec7d | 342 | } |
viewdeep51 | 2:bf1a7c26ec7d | 343 | |
viewdeep51 | 2:bf1a7c26ec7d | 344 | SET_handler(set_ID); |
viewdeep51 | 2:bf1a7c26ec7d | 345 | */ |
viewdeep51 | 2:bf1a7c26ec7d | 346 | } |
viewdeep51 | 2:bf1a7c26ec7d | 347 | } |
viewdeep51 | 2:bf1a7c26ec7d | 348 | } |
viewdeep51 | 2:bf1a7c26ec7d | 349 | void mcp23s17_init() |
viewdeep51 | 2:bf1a7c26ec7d | 350 | { |
viewdeep51 | 2:bf1a7c26ec7d | 351 | //device1 configuration |
viewdeep51 | 2:bf1a7c26ec7d | 352 | mcp23s17_1.reset(); //reset on power-up |
viewdeep51 | 2:bf1a7c26ec7d | 353 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 354 | mcp23s17_1.iodira(0xff); //set 8-bits PORTA as inputs |
viewdeep51 | 2:bf1a7c26ec7d | 355 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 356 | mcp23s17_1.iodirb(0xff); //set 8-bits PORTb as inputs |
viewdeep51 | 2:bf1a7c26ec7d | 357 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 358 | mcp23s17_1.ipola(0x00); |
viewdeep51 | 2:bf1a7c26ec7d | 359 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 360 | mcp23s17_1.ipolb(0x00); |
viewdeep51 | 2:bf1a7c26ec7d | 361 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 362 | mcp23s17_1.gpintena(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 363 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 364 | mcp23s17_1.gpintenb(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 365 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 366 | mcp23s17_1.defvala(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 367 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 368 | mcp23s17_1.defvalb(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 369 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 370 | mcp23s17_1.intcona(0xff); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed |
viewdeep51 | 2:bf1a7c26ec7d | 371 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 372 | mcp23s17_1.intconb(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 373 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 374 | mcp23s17_1.gppua(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 375 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 376 | mcp23s17_1.gppub(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 377 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 378 | |
viewdeep51 | 2:bf1a7c26ec7d | 379 | |
viewdeep51 | 2:bf1a7c26ec7d | 380 | |
viewdeep51 | 2:bf1a7c26ec7d | 381 | //device2 configuration |
viewdeep51 | 2:bf1a7c26ec7d | 382 | mcp23s17_2.reset(); //reset on power-up |
viewdeep51 | 2:bf1a7c26ec7d | 383 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 384 | mcp23s17_2.iodira(0xff); //set 8-bits PORTA as inputs |
viewdeep51 | 2:bf1a7c26ec7d | 385 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 386 | mcp23s17_2.iodirb(0xff); //set 8-bits PORTb as inputs |
viewdeep51 | 2:bf1a7c26ec7d | 387 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 388 | mcp23s17_2.ipola(0x00); |
viewdeep51 | 2:bf1a7c26ec7d | 389 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 390 | mcp23s17_2.ipolb(0x00); |
viewdeep51 | 2:bf1a7c26ec7d | 391 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 392 | mcp23s17_2.gpintena(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 393 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 394 | mcp23s17_2.gpintenb(0x00); //interrupts disabled for address PORT |
viewdeep51 | 2:bf1a7c26ec7d | 395 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 396 | mcp23s17_2.defvala(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 397 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 398 | mcp23s17_2.defvalb(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 399 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 400 | mcp23s17_2.intcona(0xff); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed |
viewdeep51 | 2:bf1a7c26ec7d | 401 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 402 | mcp23s17_2.intconb(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 403 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 404 | mcp23s17_2.gppua(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 405 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 406 | mcp23s17_2.gppub(0xff); |
viewdeep51 | 2:bf1a7c26ec7d | 407 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 408 | } |
viewdeep51 | 2:bf1a7c26ec7d | 409 | |
viewdeep51 | 2:bf1a7c26ec7d | 410 | void Spi3_Init() //for mcp23s17 |
viewdeep51 | 2:bf1a7c26ec7d | 411 | { |
viewdeep51 | 2:bf1a7c26ec7d | 412 | _SPI3.format(8,0); //8bit,mode 0 |
viewdeep51 | 2:bf1a7c26ec7d | 413 | _SPI3.frequency(1000000); //1mhz |
viewdeep51 | 2:bf1a7c26ec7d | 414 | } |
viewdeep51 | 2:bf1a7c26ec7d | 415 | |
viewdeep51 | 2:bf1a7c26ec7d | 416 | void Led_Init() |
viewdeep51 | 2:bf1a7c26ec7d | 417 | { |
viewdeep51 | 2:bf1a7c26ec7d | 418 | |
viewdeep51 | 2:bf1a7c26ec7d | 419 | for(uint8_t i=0;i<=8;i++) //cmd led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 420 | { |
viewdeep51 | 2:bf1a7c26ec7d | 421 | LED_CMD[i].set_Brightness(1); //setting period 100 ms |
viewdeep51 | 2:bf1a7c26ec7d | 422 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 423 | } |
viewdeep51 | 2:bf1a7c26ec7d | 424 | for(uint8_t i=0;i<=1;i++) //ctrl led intialisation |
viewdeep51 | 2:bf1a7c26ec7d | 425 | { |
viewdeep51 | 2:bf1a7c26ec7d | 426 | LED_CTRL[i].set_Brightness(1); |
viewdeep51 | 2:bf1a7c26ec7d | 427 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 428 | } |
viewdeep51 | 2:bf1a7c26ec7d | 429 | for(uint8_t i=0; i<=7;i++) //ach led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 430 | { |
viewdeep51 | 2:bf1a7c26ec7d | 431 | LED_ACH[i].set_Brightness(1); |
viewdeep51 | 2:bf1a7c26ec7d | 432 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 433 | } |
viewdeep51 | 2:bf1a7c26ec7d | 434 | |
viewdeep51 | 2:bf1a7c26ec7d | 435 | for(uint8_t i=0;i<=8;i++) //cmd led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 436 | { |
viewdeep51 | 2:bf1a7c26ec7d | 437 | LED_CMD[i].ON(); //duty cycle 10% |
viewdeep51 | 2:bf1a7c26ec7d | 438 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 439 | } |
viewdeep51 | 2:bf1a7c26ec7d | 440 | for(uint8_t i=0;i<=1;i++) //ctrl led intialisation |
viewdeep51 | 2:bf1a7c26ec7d | 441 | { |
viewdeep51 | 2:bf1a7c26ec7d | 442 | LED_CTRL[i].ON(); |
viewdeep51 | 2:bf1a7c26ec7d | 443 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 444 | } |
viewdeep51 | 2:bf1a7c26ec7d | 445 | for(uint8_t i=0; i<=7;i++) //ach led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 446 | { |
viewdeep51 | 2:bf1a7c26ec7d | 447 | LED_ACH[i].ON(); |
viewdeep51 | 2:bf1a7c26ec7d | 448 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 449 | } |
viewdeep51 | 2:bf1a7c26ec7d | 450 | |
viewdeep51 | 2:bf1a7c26ec7d | 451 | wait(1); |
viewdeep51 | 2:bf1a7c26ec7d | 452 | |
viewdeep51 | 2:bf1a7c26ec7d | 453 | |
viewdeep51 | 2:bf1a7c26ec7d | 454 | /* turning all leds OFF*/ |
viewdeep51 | 2:bf1a7c26ec7d | 455 | |
viewdeep51 | 2:bf1a7c26ec7d | 456 | |
viewdeep51 | 2:bf1a7c26ec7d | 457 | for(uint8_t i=0;i<=8;i++) //cmd led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 458 | { |
viewdeep51 | 2:bf1a7c26ec7d | 459 | LED_CMD[i].OFF(); //duty cycle 10% |
viewdeep51 | 2:bf1a7c26ec7d | 460 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 461 | } |
viewdeep51 | 2:bf1a7c26ec7d | 462 | for(uint8_t i=0;i<=1;i++) //ctrl led intialisation |
viewdeep51 | 2:bf1a7c26ec7d | 463 | { |
viewdeep51 | 2:bf1a7c26ec7d | 464 | LED_CTRL[i].OFF(); |
viewdeep51 | 2:bf1a7c26ec7d | 465 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 466 | } |
viewdeep51 | 2:bf1a7c26ec7d | 467 | for(uint8_t i=0; i<=7;i++) //ach led initialisation |
viewdeep51 | 2:bf1a7c26ec7d | 468 | { |
viewdeep51 | 2:bf1a7c26ec7d | 469 | LED_ACH[i].OFF(); |
viewdeep51 | 2:bf1a7c26ec7d | 470 | wait_ms(1); |
viewdeep51 | 2:bf1a7c26ec7d | 471 | } |
viewdeep51 | 2:bf1a7c26ec7d | 472 | } |
viewdeep51 | 2:bf1a7c26ec7d | 473 | |
viewdeep51 | 2:bf1a7c26ec7d | 474 | int main() |
viewdeep51 | 2:bf1a7c26ec7d | 475 | { |
viewdeep51 | 2:bf1a7c26ec7d | 476 | char key_status = 0; |
viewdeep51 | 2:bf1a7c26ec7d | 477 | Led_Init(); |
viewdeep51 | 2:bf1a7c26ec7d | 478 | wait_ms(10); |
viewdeep51 | 2:bf1a7c26ec7d | 479 | Spi3_Init(); |
viewdeep51 | 2:bf1a7c26ec7d | 480 | wait_ms(10); |
viewdeep51 | 2:bf1a7c26ec7d | 481 | mcp23s17_init(); |
viewdeep51 | 2:bf1a7c26ec7d | 482 | wait(1); |
viewdeep51 | 2:bf1a7c26ec7d | 483 | |
viewdeep51 | 2:bf1a7c26ec7d | 484 | int_A.fall(&read_KEY_A); //all key functions enabled for PORTA,B,C |
viewdeep51 | 2:bf1a7c26ec7d | 485 | wait_ms(2); |
viewdeep51 | 2:bf1a7c26ec7d | 486 | int_B.rise(&read_KEY_B); |
viewdeep51 | 2:bf1a7c26ec7d | 487 | wait_ms(2); |
viewdeep51 | 2:bf1a7c26ec7d | 488 | int_C.rise(&read_KEY_C); |
viewdeep51 | 2:bf1a7c26ec7d | 489 | wait_ms(2); |
viewdeep51 | 2:bf1a7c26ec7d | 490 | pc.printf("hello deep\n"); |
viewdeep51 | 2:bf1a7c26ec7d | 491 | wait_ms(10); //this delay is important |
viewdeep51 | 2:bf1a7c26ec7d | 492 | // LED_CMD[1].FLASHH(); //duty cycle 10% |
viewdeep51 | 2:bf1a7c26ec7d | 493 | //LED_ACH[1].FLASHH(); //test led |
viewdeep51 | 2:bf1a7c26ec7d | 494 | key_status = read_KEY_SPI(ch_D); //to read portA of mcp23s17(1) |
viewdeep51 | 2:bf1a7c26ec7d | 495 | if(key_status == 0xfe) |
viewdeep51 | 2:bf1a7c26ec7d | 496 | pc.printf("master eot\n"); |
viewdeep51 | 2:bf1a7c26ec7d | 497 | wait_ms(10); |
viewdeep51 | 2:bf1a7c26ec7d | 498 | LED_ACH[1].FLASHH(); |
viewdeep51 | 2:bf1a7c26ec7d | 499 | wait_ms(10); |
viewdeep51 | 2:bf1a7c26ec7d | 500 | while(1){ |
viewdeep51 | 2:bf1a7c26ec7d | 501 | |
viewdeep51 | 2:bf1a7c26ec7d | 502 | } |
viewdeep51 | 2:bf1a7c26ec7d | 503 | } |