V1

Dependencies:   mbed 25LCxxx_SPI MCP23S17

Committer:
gr66
Date:
Wed Feb 17 20:53:53 2021 +0000
Revision:
1:ab2526b30b34
V1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gr66 1:ab2526b30b34 1 #include "mbed.h"
gr66 1:ab2526b30b34 2 #include "MCP23S17.h"
gr66 1:ab2526b30b34 3 #define TOGGLE_BIT(REG,BIT) ((REG)^=(BIT))
gr66 1:ab2526b30b34 4 //
gr66 1:ab2526b30b34 5 // macro
gr66 1:ab2526b30b34 6
gr66 1:ab2526b30b34 7
gr66 1:ab2526b30b34 8 //
gr66 1:ab2526b30b34 9 Serial pc(PA_2, PA_3); // I/O terminal PC
gr66 1:ab2526b30b34 10 Serial bt(PA_9, PA_10); // I/O terminal PC
gr66 1:ab2526b30b34 11 DigitalOut led(PA_15); // led
gr66 1:ab2526b30b34 12
gr66 1:ab2526b30b34 13 SPI spi(PA_7, PA_6, PA_5); // mosi miso clk
gr66 1:ab2526b30b34 14 Ticker automate;
gr66 1:ab2526b30b34 15 Ticker telemesure;
gr66 1:ab2526b30b34 16 Timer voyant0;
gr66 1:ab2526b30b34 17 Timer voyant1;
gr66 1:ab2526b30b34 18 Timer voyant2;
gr66 1:ab2526b30b34 19 Timer voyant3;
gr66 1:ab2526b30b34 20 CAN can(PA_11,PA_12 ); //canRX canTX
gr66 1:ab2526b30b34 21 //expander
gr66 1:ab2526b30b34 22 char Opcode = 0x40;
gr66 1:ab2526b30b34 23 MCP23S17 chip = MCP23S17(spi, PF_1, Opcode);
gr66 1:ab2526b30b34 24 DigitalOut reset(PA_4); // reset expander
gr66 1:ab2526b30b34 25
gr66 1:ab2526b30b34 26 //CAN
gr66 1:ab2526b30b34 27 CANMessage msg; // message recu can
gr66 1:ab2526b30b34 28 char tab[5]= {0x00,0xcc,0,0,0}; //
gr66 1:ab2526b30b34 29 void send(void);
gr66 1:ab2526b30b34 30 //
gr66 1:ab2526b30b34 31 unsigned char leds=0xFF,flag_t=0;
gr66 1:ab2526b30b34 32 //
gr66 1:ab2526b30b34 33 void autom(void)
gr66 1:ab2526b30b34 34 {
gr66 1:ab2526b30b34 35 //led=!led;
gr66 1:ab2526b30b34 36 send();
gr66 1:ab2526b30b34 37 }
gr66 1:ab2526b30b34 38 // fonction can en reception sur ISR
gr66 1:ab2526b30b34 39 void rxcan()
gr66 1:ab2526b30b34 40 {
gr66 1:ab2526b30b34 41 //pc.printf("receive\n");
gr66 1:ab2526b30b34 42 can.read(msg);
gr66 1:ab2526b30b34 43 if(msg.id==0x11) {
gr66 1:ab2526b30b34 44 led=!led;
gr66 1:ab2526b30b34 45
gr66 1:ab2526b30b34 46
gr66 1:ab2526b30b34 47
gr66 1:ab2526b30b34 48 //CLEAR_BIT(leds,1);
gr66 1:ab2526b30b34 49 //leds=2;
gr66 1:ab2526b30b34 50 //chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 51 switch (msg.data[0]) {
gr66 1:ab2526b30b34 52 case 0 :
gr66 1:ab2526b30b34 53 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 54 CLEAR_BIT(leds,1);
gr66 1:ab2526b30b34 55 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 56 break;
gr66 1:ab2526b30b34 57 case 1 :
gr66 1:ab2526b30b34 58 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 59 SET_BIT(leds,1);
gr66 1:ab2526b30b34 60 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 61 break;
gr66 1:ab2526b30b34 62 case 2 :
gr66 1:ab2526b30b34 63 voyant0.start();
gr66 1:ab2526b30b34 64 if(voyant0.read_ms()>100) {
gr66 1:ab2526b30b34 65 voyant0.reset();
gr66 1:ab2526b30b34 66 TOGGLE_BIT(leds,1);
gr66 1:ab2526b30b34 67 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 68 }
gr66 1:ab2526b30b34 69 break;
gr66 1:ab2526b30b34 70 case 3 :
gr66 1:ab2526b30b34 71 voyant0.start();
gr66 1:ab2526b30b34 72 if(voyant0.read_ms()>1000) {
gr66 1:ab2526b30b34 73 voyant0.reset();
gr66 1:ab2526b30b34 74 TOGGLE_BIT(leds,1);
gr66 1:ab2526b30b34 75 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 76 }
gr66 1:ab2526b30b34 77 break;
gr66 1:ab2526b30b34 78 }
gr66 1:ab2526b30b34 79 switch (msg.data[1]) {
gr66 1:ab2526b30b34 80 case 0 :
gr66 1:ab2526b30b34 81 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 82 CLEAR_BIT(leds,2);
gr66 1:ab2526b30b34 83 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 84 break;
gr66 1:ab2526b30b34 85 case 1 :
gr66 1:ab2526b30b34 86 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 87 SET_BIT(leds,2);
gr66 1:ab2526b30b34 88 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 89 break;
gr66 1:ab2526b30b34 90 case 2 :
gr66 1:ab2526b30b34 91 voyant1.start();
gr66 1:ab2526b30b34 92 if(voyant1.read_ms()>100) {
gr66 1:ab2526b30b34 93 voyant1.reset();
gr66 1:ab2526b30b34 94 TOGGLE_BIT(leds,2);
gr66 1:ab2526b30b34 95 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 96 }
gr66 1:ab2526b30b34 97 break;
gr66 1:ab2526b30b34 98 case 3 :
gr66 1:ab2526b30b34 99 voyant1.start();
gr66 1:ab2526b30b34 100 if(voyant1.read_ms()>1000) {
gr66 1:ab2526b30b34 101 voyant1.reset();
gr66 1:ab2526b30b34 102 TOGGLE_BIT(leds,2);
gr66 1:ab2526b30b34 103 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 104 }
gr66 1:ab2526b30b34 105 break;
gr66 1:ab2526b30b34 106 }
gr66 1:ab2526b30b34 107 switch (msg.data[2]) {
gr66 1:ab2526b30b34 108 case 0 :
gr66 1:ab2526b30b34 109 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 110 CLEAR_BIT(leds,4);
gr66 1:ab2526b30b34 111 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 112 break;
gr66 1:ab2526b30b34 113 case 1 :
gr66 1:ab2526b30b34 114 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 115 SET_BIT(leds,4);
gr66 1:ab2526b30b34 116 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 117 break;
gr66 1:ab2526b30b34 118 case 2 :
gr66 1:ab2526b30b34 119 voyant2.start();
gr66 1:ab2526b30b34 120 if(voyant2.read_ms()>100) {
gr66 1:ab2526b30b34 121 voyant2.reset();
gr66 1:ab2526b30b34 122 TOGGLE_BIT(leds,4);
gr66 1:ab2526b30b34 123 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 124 }
gr66 1:ab2526b30b34 125 break;
gr66 1:ab2526b30b34 126 case 3 :
gr66 1:ab2526b30b34 127 voyant2.start();
gr66 1:ab2526b30b34 128 if(voyant2.read_ms()>1000) {
gr66 1:ab2526b30b34 129 voyant2.reset();
gr66 1:ab2526b30b34 130 TOGGLE_BIT(leds,4);
gr66 1:ab2526b30b34 131 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 132 }
gr66 1:ab2526b30b34 133 break;
gr66 1:ab2526b30b34 134 }
gr66 1:ab2526b30b34 135 switch (msg.data[3]) {
gr66 1:ab2526b30b34 136 case 0 :
gr66 1:ab2526b30b34 137 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 138 CLEAR_BIT(leds,8);
gr66 1:ab2526b30b34 139 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 140 break;
gr66 1:ab2526b30b34 141 case 1 :
gr66 1:ab2526b30b34 142 leds=chip.read(PORT_A);
gr66 1:ab2526b30b34 143 SET_BIT(leds,8);
gr66 1:ab2526b30b34 144 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 145 break;
gr66 1:ab2526b30b34 146 case 2 :
gr66 1:ab2526b30b34 147 voyant3.start();
gr66 1:ab2526b30b34 148 if(voyant3.read_ms()>100) {
gr66 1:ab2526b30b34 149 voyant3.reset();
gr66 1:ab2526b30b34 150 TOGGLE_BIT(leds,8);
gr66 1:ab2526b30b34 151 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 152 }
gr66 1:ab2526b30b34 153 break;
gr66 1:ab2526b30b34 154 case 3 :
gr66 1:ab2526b30b34 155 voyant3.start();
gr66 1:ab2526b30b34 156 if(voyant3.read_ms()>1000) {
gr66 1:ab2526b30b34 157 voyant3.reset();
gr66 1:ab2526b30b34 158 TOGGLE_BIT(leds,8);
gr66 1:ab2526b30b34 159 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 160 }
gr66 1:ab2526b30b34 161 break;
gr66 1:ab2526b30b34 162 }
gr66 1:ab2526b30b34 163 //leds=msg.data[1]+;
gr66 1:ab2526b30b34 164 //chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 165 //bt.printf("%0X\r",msg.data[0]);
gr66 1:ab2526b30b34 166 //bt.printf("%0X\r",chip.read(PORT_B));
gr66 1:ab2526b30b34 167 }
gr66 1:ab2526b30b34 168 }
gr66 1:ab2526b30b34 169 // fonction d'envoi trame de test can
gr66 1:ab2526b30b34 170 void send()
gr66 1:ab2526b30b34 171 {
gr66 1:ab2526b30b34 172 //pc.printf("send()\n");
gr66 1:ab2526b30b34 173 tab[1]=~chip.read(PORT_B); // lecture des boutons et inversion
gr66 1:ab2526b30b34 174 while(!can.write(CANMessage(0x22, tab, 3)));
gr66 1:ab2526b30b34 175 // if(can.write(CANMessage(0x11, tab, 2))) {
gr66 1:ab2526b30b34 176 tab[0]++;
gr66 1:ab2526b30b34 177 }
gr66 1:ab2526b30b34 178 void telem()
gr66 1:ab2526b30b34 179 {
gr66 1:ab2526b30b34 180 flag_t=1;
gr66 1:ab2526b30b34 181 }
gr66 1:ab2526b30b34 182 int main()
gr66 1:ab2526b30b34 183 {
gr66 1:ab2526b30b34 184 automate.attach(&autom,1./10);
gr66 1:ab2526b30b34 185 telemesure.attach(&telem,1.0);
gr66 1:ab2526b30b34 186 can.frequency(1000000);
gr66 1:ab2526b30b34 187 can.attach(&rxcan);
gr66 1:ab2526b30b34 188 bt.baud(115200); // vitesse bluetooth
gr66 1:ab2526b30b34 189 // RAZ expandeur de bus
gr66 1:ab2526b30b34 190 reset = 0;
gr66 1:ab2526b30b34 191 wait_us(1);
gr66 1:ab2526b30b34 192 reset = 1;
gr66 1:ab2526b30b34 193 //
gr66 1:ab2526b30b34 194 // Set all 8 Port A bits to output direction
gr66 1:ab2526b30b34 195 chip.direction(PORT_A, 0x00);
gr66 1:ab2526b30b34 196 // Set all 8 Port B bits to input direction
gr66 1:ab2526b30b34 197 chip.direction(PORT_B, 0xFF);
gr66 1:ab2526b30b34 198 chip.configurePullUps(PORT_B, 0xFF);
gr66 1:ab2526b30b34 199 //pc.printf("Hello Viti2 \r\n");
gr66 1:ab2526b30b34 200 chip.write(PORT_A, leds);
gr66 1:ab2526b30b34 201 while(1) {
gr66 1:ab2526b30b34 202 if(flag_t) {
gr66 1:ab2526b30b34 203 bt.printf("led %02X, boutons %02X \n\r",leds, (unsigned char)(~chip.read(PORT_B)));
gr66 1:ab2526b30b34 204 flag_t=0;
gr66 1:ab2526b30b34 205 }
gr66 1:ab2526b30b34 206 }
gr66 1:ab2526b30b34 207 }