mcp23s17 key read via spi

Dependencies:   MCP23S17 mbed

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?

UserRevisionLine numberNew 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 }