mille feuille
/
milmod_slaveRevF
mille-feuille module MCU program
main.cpp
- Committer:
- Info
- Date:
- 21 months ago
- Revision:
- 0:98ed24be8501
File content as of revision 0:98ed24be8501:
#include "mbed.h" #include "EEPROM24LC01.h" //#define def_myAddress 0x8001 //Bus switch //TC7MBL3125 nOE //#define GateClose 1 //#define GateOpen 0 //TC7MBL3126 OE #define GateClose 0 #define GateOpen 1 #define OffFET 0 #define OnFET 1 #define HOLD 0xff #define ALL_HOLD 0xff #define NOTHOLD 0 //#define test 1 //#define ROMtest 1 //#define debug 1 //#define SPIfreq 2000000 #define SPIfreq 17000000 I2C i2c(I2C_SDA,I2C_SCL); // sda, scl EEPROM24LC01 eeprom(&i2c, 0x50); //DigitalOut myGate(P0_21,0); DigitalOut Gate1_1(P0_14,1); DigitalOut Gate1_2(P0_23,1); DigitalOut Gate1_3(P0_21,1); DigitalOut Gate1_4(P0_22,1); DigitalOut Gate2_MISO(P0_20,1); DigitalOut Gate2_MOSI(P0_19,1); DigitalOut Gate2_SCK(P0_17,1); DigitalOut Gate2_4(P0_13,1); DigitalInOut myIO1(P0_1);//ng DigitalInOut myIO2(P0_28); DigitalInOut myIO3(P0_27); DigitalInOut myIO4(P0_26); DigitalOut myFET(P0_6,0); DigitalIn iAddress1(P0_8); DigitalIn iAddress2(P0_9); DigitalOut myled(LED2,0); #ifdef debug Serial pc(USBTX, USBRX); // tx, rx #endif //SPISlave device(P0_26, P0_25, P0_24, P0_15); // mosi, miso, sclk, ssel //SPISlave device(P0_25, P0_26, P0_24, P0_15); // mosi, miso, sclk, ssel SPISlave device(P0_25, P0_18, P0_24, P0_15); // mosi, miso, sclk, ssel uint8_t address[4]; uint8_t exData[3]; uint8_t gateData; uint32_t def_myAddress; uint32_t def_searchAddress; void closeAllGate(void); #ifdef test void spiTest(void){ device.reply(0x00); // Prime SPI with first reply printf("SPI slave test\r\n"); while(1) { if(device.receive()) { int v = device.read(); // Read byte from master printf("Recieve = %d\r\n",v); //v = (v + 1) % 0x100; // Add one to it, modulo 256 device.reply(v+1); // Make this the next reply printf("reply = %d\r\n",v); } } } void IoTest(void){ int inData[4]; int inAddr1,inAddr2; myIO1.input(); myIO2.input(); myIO3.input(); myIO4.input(); printf("IoTest\r\n"); while(1){ inAddr1 = iAddress1; inAddr2 = iAddress2; if(inAddr1 == 0){ myIO1.input(); myIO2.input(); myIO3.input(); myIO4.input(); myIO1.mode(PullNone); myIO2.mode(PullNone); myIO3.mode(PullNone); myIO4.mode(PullNone); inData[0] = myIO1; inData[1] = myIO2; inData[2] = myIO3; inData[3] = myIO4; printf("inData[0] = %d\r\n",inData[0]); printf("inData[1] = %d\r\n",inData[1]); printf("inData[2] = %d\r\n",inData[2]); printf("inData[3] = %d\r\n\r\n",inData[3]); }else{ printf("myIOs output\r\n"); myIO1.output(); myIO2.output(); myIO3.output(); myIO4.output(); myIO1.mode(PullUp); myIO2.mode(PullUp); myIO3.mode(PullUp); myIO4.mode(PullUp); myIO1 = 1; myIO2 = 1; myIO3 = 1; myIO4 = 1; } printf("inAddr1 = %d\r\n",inAddr1); printf("inAddr2 = %d\r\n",inAddr2); Gate1_1 = 1; Gate1_2 = 1; Gate1_3 = 1; Gate1_4 = 1; Gate2_MISO = 1; Gate2_MOSI = 1; Gate2_SCK = 1; //Gate2_4 = 1; myFET = 1; myled = 1; wait(1); if(inAddr1==1){ myIO1 = 0; myIO2 = 0; myIO3 = 0; myIO4 = 0; } Gate1_1 = 0; Gate1_2 = 0; Gate1_3 = 0; Gate1_4 = 0; Gate2_MISO = 0; Gate2_MOSI = 0; Gate2_SCK = 0; //Gate2_4 = 0; myFET = 0; myled = 0; wait(1); } } #endif #ifdef ROMtest void EEPROMtest(void){ char bufData[10]; printf("write test\n\r"); bufData[0]=0x80;//address1 bufData[1]=0x00;//address2 bufData[2]=0x00;//address3 bufData[3]=0x0D;//address4 bufData[4]=0x04;//extra data bufData[5]=0x05;//extra data bufData[6]=0x06;//extra data bufData[7]=0x07;//gate open pattern number eeprom.byte8_write( bufData); bufData[0]=0xAA; printf("end\n\r"); bufData[0]=0; bufData[1]=0; bufData[2]=0; bufData[3]=0; bufData[4]=0; bufData[5]=0; bufData[6]=0; bufData[7]=0; eeprom.readAll( bufData, 8 ); printf("0:%02x\n\r",bufData[0]); printf("1:%02x\n\r",bufData[1]); printf("2:%02x\n\r",bufData[2]); printf("3:%02x\n\r",bufData[3]); printf("4:%02x\n\r",bufData[4]); printf("5:%02x\n\r",bufData[5]); printf("6:%02x\n\r",bufData[6]); printf("7:%02x\n\r",bufData[7]); printf("\n\r Read again! \n\r\n\r"); eeprom.readAll( bufData, 8 ); printf("0:%02x\n\r",bufData[0]); printf("1:%02x\n\r",bufData[1]); printf("2:%02x\n\r",bufData[2]); printf("3:%02x\n\r",bufData[3]); printf("4:%02x\n\r",bufData[4]); printf("5:%02x\n\r",bufData[5]); printf("6:%02x\n\r",bufData[6]); printf("7:%02x\n\r",bufData[7]); printf("\nend\n\r"); while(1); } #endif void ReadDataFromEEPROM(void){ int i; char bufData[8]; char buf; char buf1,buf2; eeprom.readAll( bufData, 8 ); #ifdef debug printf("0:%02x\n\r",bufData[0]); printf("1:%02x\n\r",bufData[1]); printf("2:%02x\n\r",bufData[2]); printf("3:%02x\n\r",bufData[3]); printf("4:%02x\n\r",bufData[4]); printf("5:%02x\n\r",bufData[5]); printf("6:%02x\n\r",bufData[6]); printf("7:%02x\n\r",bufData[7]); #endif for(i=0;i<4;++i){ address[i] = bufData[i]; def_myAddress = (def_myAddress<<8) + bufData[i]; #ifdef debug printf("address%d : %02x\n\r",i,address[i]); #endif } #ifdef debug printf("def_myAddress %08x\n\r",def_myAddress); #endif buf = 0; buf1 = iAddress1.read(); if(buf1==0){ buf1 = 1; }else if(buf1==1){ buf1 = 0; } buf = buf1; // buf = iAddress1.read(); buf2 = iAddress2.read(); if(buf2==0){ buf2 = 1; }else if(buf2==1){ buf2 = 0; } buf = (buf<<1) + buf2; // buf = (buf<<1) + iAddress2.read(); def_myAddress += buf; #ifdef debug printf("def_myAddress %08x\n\r",def_myAddress); #endif for(i=4;i<7;++i){ exData[i-4] = bufData[i]; #ifdef debug printf("exData%d : %02x\n\r",i-4,exData[i-4]); #endif } gateData = bufData[7]; #ifdef debug printf("gateData : %02x\n\r",gateData); #endif def_searchAddress = (def_myAddress & 0x3FFFFFFF) + 0x40000000; } /* void holdMode(int data){ int inData[4]; myIO1.input(); myIO2.input(); myIO3.input(); myIO4.input(); if(data == NOTHOLD){ myIO1.mode(PullNone); myIO2.mode(PullNone); myIO3.mode(PullNone); myIO4.mode(PullNone); myled = 0; }else if(data == HOLD){ myIO1.mode(PullDown); myIO2.mode(PullDown); myIO3.mode(PullDown); myIO4.mode(PullDown); //read inData[0] = myIO1; inData[1] = myIO2; inData[2] = myIO3; inData[3] = myIO4; //printf("inData[1]=%d\r\n",inData[1]); //closeAllGate(); //hold myIO1.output(); myIO2.output(); myIO3.output(); myIO4.output(); myIO1.mode(PullUp); myIO2.mode(PullUp); myIO3.mode(PullUp); myIO4.mode(PullUp); myIO1 = inData[0]; myIO2 = inData[1]; myIO3 = inData[2]; myIO4 = inData[3]; myled = 1; } } */ void holdIOs(int select, int readData){ if(select == 1){ myIO1.mode(PullDown); //hold myIO1.output(); myIO1.mode(PullUp); myIO1 = readData; }else if(select == 2){ myIO2.mode(PullDown); //hold myIO2.output(); myIO2.mode(PullUp); myIO2 = readData; }else if(select == 3){ myIO3.mode(PullDown); //hold myIO3.output(); myIO3.mode(PullUp); myIO3 = readData; }else if(select == 4){ myIO4.mode(PullDown); //hold myIO4.output(); myIO4.mode(PullUp); myIO4 = readData; } } void holdMode(uint16_t data){ int inData[4]; uint8_t data8,dataBuf; data8 = data; //printf("data = %d, data8 = %d\r\n",data,data8); myIO1.input(); myIO2.input(); myIO3.input(); myIO4.input(); //read inData[0] = myIO1; inData[1] = myIO2; inData[2] = myIO3; inData[3] = myIO4; //printf("inData[0]=%d\r\n",inData[0]); //printf("inData[1]=%d\r\n",inData[1]); if(data == NOTHOLD){ //printf("NOTHOLD\r\n"); myIO1.mode(PullNone); myIO2.mode(PullNone); myIO3.mode(PullNone); myIO4.mode(PullNone); myled = 0; }else if(data == ALL_HOLD){ //printf("ALL_HOLD\r\n"); holdIOs(1,inData[0]); holdIOs(2,inData[1]); holdIOs(3,inData[2]); holdIOs(4,inData[3]); myled = 1; }else{ dataBuf = data8 & 0b00000001; if(dataBuf == 1){ //printf("data 1\r\n"); holdIOs(1,inData[0]); } dataBuf = (data8>>1) & 0b00000001; if(dataBuf == 1){ //printf("data 2\r\n"); holdIOs(2,inData[1]); } dataBuf = (data8>>2) & 0b00000001; if(dataBuf == 1){ //printf("data 3\r\n"); holdIOs(3,inData[2]); } dataBuf = (data8>>3) & 0b00000001; if(dataBuf == 1){ //printf("data 4\r\n"); holdIOs(4,inData[3]); } } } void closeAllGate(void){ Gate1_1 = GateClose; Gate1_2 = GateClose; Gate1_3 = GateClose; Gate1_4 = GateClose; Gate2_MISO = GateClose; Gate2_MOSI = GateClose; Gate2_SCK = GateClose; Gate2_4 = GateClose; myFET = OffFET; } void writeMode1(uint16_t mode1, uint16_t mode2){ switch(mode1){ case 0x01: holdMode(NOTHOLD); //close all gate myFET = OffFET; //myGate = GateClose; closeAllGate(); myled = 0; #ifdef debug printf("close gate\r\n"); #endif break; case 0x02: //open gate normal IOs closeAllGate(); myFET = OffFET; //myGate = GateOpen; Gate1_1 = GateOpen; Gate1_2 = GateOpen; Gate1_3 = GateOpen; Gate1_4 = GateOpen; holdMode(NOTHOLD); myled = 1; #ifdef debug printf("open gate\r\n"); #endif break; case 0x03: //Detect mode ON //myGate = GateClose; closeAllGate(); wait_ms(0.01); myFET = OnFET; myled = 1; #ifdef debug printf("Detect mode ON\r\n"); #endif break; case 0x04: //Detect mode OFF //myGate = GateClose; closeAllGate(); wait_ms(0.01); myFET = OffFET; myled = 0; #ifdef debug printf("Detect mode OFF\r\n"); #endif break; case 0x05://LED on myled = 1; #ifdef debug printf("LED ON\r\n"); #endif break; case 0x06://LED off myled = 0; #ifdef debug printf("LED OFF\r\n"); #endif break; case 0x07://SPI gate : MOSI MISO SCK CS closeAllGate(); Gate2_MOSI = GateOpen; Gate2_MISO = GateOpen; Gate2_SCK = GateOpen; Gate1_4 = GateOpen; holdMode(NOTHOLD); myled = 1; break; case 0x08://One way SPI gate : MOSI SCK CS EXtra IO closeAllGate(); Gate2_MOSI = GateOpen; Gate1_2 = GateOpen; Gate2_SCK = GateOpen; Gate1_4 = GateOpen; holdMode(NOTHOLD); myled = 1; break; case 0x09://SCK as a clock : SCK Extra IOs closeAllGate(); Gate1_1 = GateOpen; Gate1_2 = GateOpen; Gate2_SCK = GateOpen; Gate1_4 = GateOpen; holdMode(NOTHOLD); myled = 1; break; case 0x0A://SPI gate : MISO SCK CS closeAllGate(); Gate1_1 = GateOpen; Gate2_MISO = GateOpen; Gate2_SCK = GateOpen; Gate1_4 = GateOpen; holdMode(NOTHOLD); myled = 1; break; case 0x0B://hold mode ON //holdMode(HOLD); holdMode(mode2); closeAllGate(); break; case 0x0C://hold mode OFF holdMode(NOTHOLD); //closeAllGate(); break; default: myFET = OffFET; //myGate = GateClose; closeAllGate(); holdMode(NOTHOLD); #ifdef debug printf("default\r\n"); #endif myled = 0; break; } } void writeMode2(uint16_t mode2){ //not yet } void resetAll(void){ myFET = OffFET; //myGate = GateClose; closeAllGate(); myled = 0; } int main() { uint8_t flg_mode = 0; uint16_t SpiRdata = 0; //uint16_t SpiAddr = 0; uint32_t SpiAddr = 0; uint16_t SpiIoNo = 0; uint16_t SpiWrite = 0; uint8_t resetCounter = 0; uint8_t flg_ResetMode = 0; #ifdef ROMtest EEPROMtest(); while(1){ ; } #endif #ifdef test while(1){ holdMode(0b00001001); wait(1); holdMode(0b00000110); wait(1); holdMode(0b00000101); wait(1); holdMode(0b00001010); wait(1); } spiTest(); IoTest(); #endif myIO1.input(); myIO2.input(); myIO3.input(); myIO4.input(); myIO1.mode(PullNone); myIO2.mode(PullNone); myIO3.mode(PullNone); myIO4.mode(PullNone); myled = 1; wait(0.1); myled = 0; wait(0.1); myled = 1; wait(0.1); myled = 0; wait(0.1); //myUart.printf("test OK /r/n"); //EEPROMtest(); ReadDataFromEEPROM(); //def_myAddress=0x80000001; //while(1); myFET = OffFET; //myGate = GateClose; closeAllGate(); myled = 0; device.format(8,0); device.frequency(SPIfreq); device.reply(0x00); // Prime SPI with first reply /* holdMode(HOLD); while(1){ ; } */ while(1) { flg_ResetMode = 0; if(device.receive()) { SpiRdata = device.read(); #ifdef debug printf("device.receive() SpiRdata = %d\r\n",SpiRdata); printf("flg_mode = %d\r\n",flg_mode); #endif //myled = 1; if(SpiRdata == 0x00){ ++resetCounter; if(resetCounter >= 6){ //if((SpiRdata == 0x00)&&(flg_mode != 1)){//reset flg_mode = 0; SpiAddr = 0; SpiIoNo = 0; SpiWrite = 0; resetCounter = 0; flg_ResetMode = 1; //resetAll(); myled = 1; wait(0.1); myled = 0; wait(0.1); myled = 1; wait(0.1); myled = 0; wait(0.1); #ifdef debug printf("reset\r\n"); #endif } }else{ resetCounter = 0; } //}else{//select mode if((flg_mode == 0) && (flg_ResetMode == 0)) {//read address data SpiAddr = SpiRdata; flg_mode = 1; #ifdef debug printf("0 flg_mode = %d\r\n",flg_mode); #endif }else if(flg_mode == 1) {//read address data SpiAddr = (SpiAddr<<8) + SpiRdata; flg_mode = 11; #ifdef debug printf("1 flg_mode = %d\r\n",flg_mode); #endif }else if(flg_mode == 11) {//read address data SpiAddr = (SpiAddr<<8) + SpiRdata; flg_mode = 12; #ifdef debug printf("11 flg_mode = %d\r\n",flg_mode); #endif }else if(flg_mode == 12) {//read address data SpiAddr = (SpiAddr<<8) + SpiRdata; flg_mode = 2; #ifdef debug printf("12 flg_mode = %d\r\n",flg_mode); #endif }else if(flg_mode == 2) {//read address data SpiIoNo = SpiRdata; flg_mode = 3; #ifdef debug printf("2 flg_mode = %d\r\n",flg_mode); #endif }else if(flg_mode == 3) {//read fpga write data SpiWrite = SpiRdata; flg_mode = 0; #ifdef debug printf("3 flg_mode = %d\r\n",flg_mode); printf("SpiAddr = %d\r\n",SpiAddr); printf("SpiAddr = %08x\r\n",SpiAddr); printf("SpiIoNo = %d\r\n",SpiIoNo); printf("SpiWrite = %d\r\n",SpiWrite); #endif //Select mode if(SpiAddr == def_myAddress){ #ifdef debug printf("Select mode\r\n"); #endif writeMode1(SpiIoNo,SpiWrite); //writeMode2(SpiWrite); //myled = 1; /*while(1) { for(int i=0;i<SpiIoNo;++i){ myled = 1; wait(0.2); myled = 0; wait(0.2); } myled = 1; wait(1); myled = 0; wait(1); }*/ flg_mode = 0; SpiAddr = 0; SpiIoNo = 0; SpiWrite = 0; }else if((SpiAddr < 0x80000000)&&(SpiAddr <= def_searchAddress)){ writeMode1(SpiIoNo,SpiWrite); //writeMode2(SpiWrite); }else{//not this address //flug reset flg_mode = 0; SpiAddr = 0; SpiIoNo = 0; SpiWrite = 0; myled = 0; #ifdef debug printf("Not me\r\n"); #endif } } } } }