Marine Electricals
/
Nucleo_key_read
mcp23s17 key read via spi
Diff: main.cpp
- Revision:
- 2:bf1a7c26ec7d
- Parent:
- 0:21b36798fd00
--- a/main.cpp Wed Jun 07 14:08:05 2017 +0000 +++ b/main.cpp Sat Oct 14 13:07:56 2017 +0000 @@ -1,14 +1,503 @@ #include "mbed.h" - -SPI device(SPI_MOSI, SPI_MISO, SPI_SCK); - -int main() { - int i = 0; - while(1) { - device.write(0x55); - device.write(i++); - device.write(0xE0); - wait_us(50); +#include "MCP23S17.h" +#include "pindefine.h" + +Serial pc(USBTX,USBRX); + +SPI _SPI3(SPI3_MOSI, SPI3_MISO, SPI3_SCK); //for keyscan mcp23s17 + +MCP23S17 mcp23s17_1(1,_SPI3, SPI3_CS1,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-1 key detection +MCP23S17 mcp23s17_2(2,_SPI3, SPI3_CS2,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-2 key detection + +//interrupts definations +InterruptIn int_A(INT_A); //8commands +InterruptIn int_B(INT_B); //4 3commands+1ack +InterruptIn int_C(INT_C); //4(3 controls(INC+,DEC-,TEST)+1 req) enbaled for all + +enum AddrID +{ + eot_Master = 1, + eot_Submaster, + eot_Slave_MCR, + eot_Slave_ER, + eot_Listner_WP, + eot_Listner_WS, + eot_Listner_OPS, + eot_Listner_ASP = 8 +}; + +enum pin_STATUS +{ + _OFF =0, + _ON =1 +}; + +enum KEY +{ + FH=0, + HH, + SH, + DSH, + FS, + HS, + SS, + DSS, + STOP, + STBY, + FWE, + FALSE0 = 11 +}; +enum KEY key_ID; + +enum CTRL +{ + REQ_ = 1, + ACK_, + FALSE1 = 3 +}; +enum CTRL ctrl_ID; + +enum CHANNEL +{ + ch_A=1, + ch_B, + ch_C, + ch_D=4 +}; //keyscan channelA,B,C,Dof MCP23s17 1& 2 respectively +enum CHANNEL ch; + +int cmd,req,ack; + +class LED{ +public: + LED(PinName led); //constructor declaration + void set_Brightness(float bright); + void ON(); + void OFF(); + void FLASHH(); +private: + Ticker _flash; + bool on_off; + bool Fllash; + float brightness; + PwmOut _LED; + void __flash(); +}; +LED::LED(PinName led): _LED(led) //constructor defination +{ + brightness = 0.000; + on_off = false; + Fllash = false; + _LED = brightness; +} + +void LED::set_Brightness(float bright) +{ + brightness = bright; + if(!Fllash) + _LED = bright; + else + __nop(); +} + +void LED::ON() +{ + _LED = brightness; + Fllash = false; + _flash.detach(); +} + +void LED::OFF() +{ + _LED = 0; + Fllash = false; + _flash.detach(); +} + +void LED::FLASHH() +{ + Fllash = true; + _flash.attach(callback(this, &LED::__flash),0.5); +} + +void LED::__flash() +{ + if(on_off) + _LED = brightness; + else + _LED = 0; + + on_off = !on_off; +} + +LED LED_CMD[9] = {_FH,_HH,_DSH,_FS,_HS,_SS,_DSS,_STOP,_STBY}; //ack and req exchanged + +LED LED_CTRL[2] = {_REQ,_ACK}; +LED LED_ACH[8] = {_WH,_BRDG,_MCR,_ER,_WP,_WS,_OPS,_ASP}; + +void CMD_handler(uint8_t CMD_ID) //function sacnning all the 11 command keys +{ + if(CMD_ID != FALSE0) + { + cmd = CMD_ID; //new cmd data updated any value between 1 to 11 + LED_CMD[cmd].FLASHH(); + wait_ms(10); + } + else + __nop(); +} + +void CTRL_handler(uint8_t CTRL_ID) //handle control transfer +{ + if(CTRL_ID != FALSE1) + { + + if(CTRL_ID == REQ_) + { + req = REQ_; //req data updated 0 here, same int values as in enum + LED_CTRL[REQ_-1].FLASHH(); + } + else + __nop(); + if(CTRL_ID == ACK_) + { + ack = ACK_; //ack data updated 2 here + LED_CTRL[ACK_-1].FLASHH(); + } + else + __nop(); + } + else + __nop(); //then do nothing +} + +unsigned char read_KEY_SPI(int CH) +{ + char _key; + uint8_t spi_err=0; + switch(CH) + { + case 1: + if(spi_err<3) + { + _key=mcp23s17_1.gpioa(); // read(INTCAPA_ADDR); + //if(mcp23s17_1.intcapa()) //read(INTCAPA_ADDR)) again if some non zero value obtained //if Interrupt pending + // { + // spi_err++; + // } + // else + // { + // spi_err=0; + // } + } + else + { + _key=0; + LED_ACH[1].FLASHH(); + } + break; + + case 2: + if(spi_err<3) + { + _key=mcp23s17_1.gpiob(); + // if(mcp23s17_1.intcapb()) //if Interrupt pending + // { + // spi_err++; + // } + // else + // { + // spi_err=0; + // } + } + else + { + _key=0; + } + break; + + case 3: + if(spi_err<3) + { + _key=mcp23s17_2.gpioa(); + // if(mcp23s17_2.intcapa()) //if Interrupt pending + // { + // spi_err++; + // } + // else + // { + // spi_err=0; + // } + } + else + { + _key=0; + } + break; + + case 4: + _key = mcp23s17_2.gpiob(); //address read PORTB of chip2 + break; + default: + _key = 0; + break; + } + return(_key); +} +void read_KEY_A() //PORTA of MCP23s17(1) for FH to DSS +{ + char key_status = 0; + key_status = read_KEY_SPI(ch_A); //to read portA of mcp23s17(1) + pc.printf("PORTA button pressed == %d\n",key_status); + wait_ms(2); + switch(key_status) + { + case 0xfe: //0xfe GPA0 + key_ID = FH; + break; + case 0xfd: //0xfe GPA0 + key_ID = HH; + break; + case 0xfb: //0xfe GPA0 + key_ID = SH; + break; + case 0xf7: //0xfe GPA0 + key_ID = DSH; + break; + case 0xef: //0xfe GPA0 + key_ID = FS; + break; + case 0xdf: //0xfe GPA0 + key_ID = HS; + break; + case 0xbf: //0xfe GPA0 + key_ID = SS; + break; + case 0x7f: //0xfe GPA0 + key_ID = DSS; + break; + default: + key_ID = FALSE0; + break; + } + CMD_handler(key_ID); +} + +void read_KEY_B() //PORTB of MCP23s17(1) to read STOP,STBY,FWE and ACK keys +{ + char key_status = 0; + key_status = read_KEY_SPI(ch_B); //to read portBof mcp23s17(1) + pc.printf("PORTB button pressed == %d\n",key_status); + wait_ms(2); + if(key_status != 0xff) + { + if(key_status==0xf7) + { + ctrl_ID = ACK_; //control ACK button pressed + CTRL_handler(ctrl_ID); + } + else + { + if(key_status == 0xfe) + key_ID = STOP; + else if(key_status == 0xfd) + key_ID = STBY; + else if(key_status == 0xfb) + key_ID = FWE; + else + { + key_ID = FALSE0; + ctrl_ID = FALSE1; + } + CMD_handler(key_ID); + } } } - \ No newline at end of file +void read_KEY_C() // PORTA of MCP23s17(2) to read REQ,INC,DEC and TEST keys +{ + char key_status = 0; + key_status = read_KEY_SPI(ch_C); //to read portA of mcp23s17(2) + pc.printf("PORTC button pressed == %d\n",key_status); + if(key_status != 0xff) + { + if(key_status==0xfe) + { + ctrl_ID = REQ_; //control transfer REQ button pressed + CTRL_handler(ctrl_ID); + } + else + { + __nop(); + /* + if(key_status==0xfd) + set_ID = INC; //setting key INC + else if(key_status==0xfb) + set_ID = DEC; //setting key DEC + else if(key_status==0xf7) + set_ID = TEST; //setting key TEST + else + { + set_ID = FALSE2; //setting key TEST + ctrl_ID = FALSE1; + } + + SET_handler(set_ID); + */ + } + } +} +void mcp23s17_init() +{ + //device1 configuration + mcp23s17_1.reset(); //reset on power-up + wait_ms(1); + mcp23s17_1.iodira(0xff); //set 8-bits PORTA as inputs + wait_ms(1); + mcp23s17_1.iodirb(0xff); //set 8-bits PORTb as inputs + wait_ms(1); + mcp23s17_1.ipola(0x00); + wait_ms(1); + mcp23s17_1.ipolb(0x00); + wait_ms(1); + mcp23s17_1.gpintena(0xff); + wait_ms(1); + mcp23s17_1.gpintenb(0xff); + wait_ms(1); + mcp23s17_1.defvala(0xff); + wait_ms(1); + mcp23s17_1.defvalb(0xff); + wait_ms(1); + mcp23s17_1.intcona(0xff); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed + wait_ms(1); + mcp23s17_1.intconb(0xff); + wait_ms(1); + mcp23s17_1.gppua(0xff); + wait_ms(1); + mcp23s17_1.gppub(0xff); + wait_ms(1); + + + + //device2 configuration + mcp23s17_2.reset(); //reset on power-up + wait_ms(1); + mcp23s17_2.iodira(0xff); //set 8-bits PORTA as inputs + wait_ms(1); + mcp23s17_2.iodirb(0xff); //set 8-bits PORTb as inputs + wait_ms(1); + mcp23s17_2.ipola(0x00); + wait_ms(1); + mcp23s17_2.ipolb(0x00); + wait_ms(1); + mcp23s17_2.gpintena(0xff); + wait_ms(1); + mcp23s17_2.gpintenb(0x00); //interrupts disabled for address PORT + wait_ms(1); + mcp23s17_2.defvala(0xff); + wait_ms(1); + mcp23s17_2.defvalb(0xff); + wait_ms(1); + mcp23s17_2.intcona(0xff); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed + wait_ms(1); + mcp23s17_2.intconb(0xff); + wait_ms(1); + mcp23s17_2.gppua(0xff); + wait_ms(1); + mcp23s17_2.gppub(0xff); + wait_ms(1); +} + +void Spi3_Init() //for mcp23s17 +{ + _SPI3.format(8,0); //8bit,mode 0 + _SPI3.frequency(1000000); //1mhz +} + +void Led_Init() +{ + + for(uint8_t i=0;i<=8;i++) //cmd led initialisation + { + LED_CMD[i].set_Brightness(1); //setting period 100 ms + wait_ms(1); + } + for(uint8_t i=0;i<=1;i++) //ctrl led intialisation + { + LED_CTRL[i].set_Brightness(1); + wait_ms(1); + } + for(uint8_t i=0; i<=7;i++) //ach led initialisation + { + LED_ACH[i].set_Brightness(1); + wait_ms(1); + } + + for(uint8_t i=0;i<=8;i++) //cmd led initialisation + { + LED_CMD[i].ON(); //duty cycle 10% + wait_ms(1); + } + for(uint8_t i=0;i<=1;i++) //ctrl led intialisation + { + LED_CTRL[i].ON(); + wait_ms(1); + } + for(uint8_t i=0; i<=7;i++) //ach led initialisation + { + LED_ACH[i].ON(); + wait_ms(1); + } + + wait(1); + + + /* turning all leds OFF*/ + + + for(uint8_t i=0;i<=8;i++) //cmd led initialisation + { + LED_CMD[i].OFF(); //duty cycle 10% + wait_ms(1); + } + for(uint8_t i=0;i<=1;i++) //ctrl led intialisation + { + LED_CTRL[i].OFF(); + wait_ms(1); + } + for(uint8_t i=0; i<=7;i++) //ach led initialisation + { + LED_ACH[i].OFF(); + wait_ms(1); + } +} + +int main() +{ + char key_status = 0; + Led_Init(); + wait_ms(10); + Spi3_Init(); + wait_ms(10); + mcp23s17_init(); + wait(1); + + int_A.fall(&read_KEY_A); //all key functions enabled for PORTA,B,C + wait_ms(2); + int_B.rise(&read_KEY_B); + wait_ms(2); + int_C.rise(&read_KEY_C); + wait_ms(2); + pc.printf("hello deep\n"); + wait_ms(10); //this delay is important + // LED_CMD[1].FLASHH(); //duty cycle 10% + //LED_ACH[1].FLASHH(); //test led + key_status = read_KEY_SPI(ch_D); //to read portA of mcp23s17(1) + if(key_status == 0xfe) + pc.printf("master eot\n"); + wait_ms(10); + LED_ACH[1].FLASHH(); + wait_ms(10); + while(1){ + + } +} \ No newline at end of file