161010_bug fix multi byte read
Dependencies: mbed
Fork of 161006_BDK_EEPROM by
main.cpp
- Committer:
- gandol2
- Date:
- 2016-10-06
- Branch:
- KSS
- Revision:
- 6:21b3128fbaef
- Parent:
- 5:1ccdbfe5e4bb
- Child:
- 7:45b16ef560a9
File content as of revision 6:21b3128fbaef:
#include "mbed.h" #define DEBUG_SPI #ifdef DEBUG_SPI #define PRINTD(arg1,arg2...) printf(arg1,##arg2) #endif #define SPI_MOSI PA_7 #define SPI_MISO PA_6 #define SPI_SCLK PA_5 #define SPI_SSEL PA_4 #define EEPROM_WREN 0x06 // Write Enable #define EEPROM_WRDI 0x04 // Write Disable #define EEPROM_RDSR 0x05 // Read Status Register #define EEPROM_WRSR 0x01 // Write Status Register #define EEPROM_READ 0x03 // Read EEPROM Memory #define EEPROM_WRITE 0x02 // Write EEPROM Memory SPISlave spi_slave(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_SSEL); // MOSI, MISO, SCLK(CLK), SSEL(CS)=NC Serial pc_serial(USBTX, USBRX); void SPI_SlaveInit() { PRINTD("Set the SPI SLAVE format\n"); spi_slave.format(8,0); // setup 8bit 0 mode PRINTD("Set the SPI SLAVE frequency\n"); spi_slave.frequency(1000000); // default 1MHz } void SPI_SlaveWrite() { char tx_buffer[255]={0}; char reply; char i; char temp; char tx_cnt = 0; int value; PRINTD("Input Strging="); while(1) { temp=getchar(); tx_buffer[tx_cnt++]=temp; if(temp==0x0d) { tx_buffer[tx_cnt]=0; PRINTD("\nData send Finish...\n"); for(i=0;i<=tx_cnt;++i) { PRINTD("%c[%02x]",tx_buffer[i],tx_buffer[i]); } PRINTD("\n\n"); for(i=0;i<=tx_cnt;++i) { value=tx_buffer[i]; PRINTD("write[%d]=%c[%02x]\n",i,value,value); spi_slave.reply(value); } for(i=0;i<tx_cnt;++i) { tx_buffer[i]=0; PRINTD("init_tx_buf[%d]=%c\n",i,tx_buffer[i]); } tx_cnt=0; PRINTD("break\n"); break; } else { PRINTD("%c[%02x]",tx_buffer[tx_cnt],tx_buffer[tx_cnt]); } } return; } void spi_dummy_reply(void) { spi_slave.reply( 0xA0 ); } #define EEPROM_SIZE 256 char statusReg; char eepBuf[EEPROM_SIZE]; void printBuf(char * buf, int length) { pc_serial.printf("=======================[EEPROM]========================\n"); pc_serial.printf(" |"); for(int iCnt = 0 ; iCnt < 16 ; ++iCnt) { pc_serial.printf("%02X|", iCnt); } pc_serial.printf("\n"); for(int iCnt = 0 ; iCnt < length ; ++iCnt) { if(0 == ((iCnt) % 16)) { pc_serial.printf("[0x%02X] ", iCnt); } pc_serial.printf("%02X ", *(buf + iCnt)); if(0 == ((iCnt+1) % 16)) { pc_serial.printf("\n"); } } pc_serial.printf("=======================================================\n"); } int main() { char eepAddr = 0; char eepData = 0; char serialTxReadyFlag = 0; int spiRxTempBuf = 0; char spiRxBuf[255]; int spiRxTempCnt = 0; int spiRxLen = 0; int spiTxCnt = 0; char spiTxReadyFlag = 0; char serialRxBuf[255]; int serialRxLen = 0; SPI_SlaveInit(); // test code start NVIC_SetVector( SPI_IRQn , ( uint32_t ) executa_spi_slave_hw ) ; NVIC_SetPriority( SPI_IRQn , 2 ) ; NVIC_EnableIRQ( SPI_IRQn ) ; // test code end pc_serial.printf("\n\n========== KSS SPI Slave2 [Start] ==========\n"); while(1) { if(spi_slave.receive()) // wait SPI data input... { spiRxTempBuf = spi_slave.read(); //spi_slave.reply( statusReg++ ); //continue; switch(spiRxTempBuf) { case EEPROM_WREN: //spi_dummy_reply(); pc_serial.printf("[INFO] SPI_MOSI(RX) : WREN\n"); statusReg = statusReg | (1<<1) ; pc_serial.printf("[INFO] WREN sucess [0x%02X]\n", statusReg); break; case EEPROM_WRDI: //spi_dummy_reply(); pc_serial.printf("[INFO] SPI_MOSI(RX) : WRDI\n"); statusReg = statusReg & (~(1 << 1)) ; pc_serial.printf("[INFO] WRDI sucess [0x%02X]\n", statusReg); break; case EEPROM_RDSR: spi_slave.reply( statusReg ); pc_serial.printf("[INFO] SPI_MOSI(RX) : RDSR\n"); pc_serial.printf("[INFO] SPI_MISO(TX) : RDSR[0x%02X] \n", statusReg); break; case EEPROM_WRITE: // EEPROM Address read.. while(!spi_slave.receive()); eepAddr = spi_slave.read(); // EEPROM Data read.. while(!spi_slave.receive()); eepData = spi_slave.read(); pc_serial.printf("\n[DEBUG] Addr[0x%02X] Data[0x%02X] \n", eepAddr, eepData); if(statusReg & 0x02) { statusReg |= 0x01; eepBuf[eepAddr] = eepData; printBuf(eepBuf, EEPROM_SIZE); statusReg &= (~0x01); } else { pc_serial.printf("\nwrite command is disabled\n"); } break; case EEPROM_READ: // EEPROM Address read.. while(!spi_slave.receive()); eepAddr = spi_slave.read(); spi_slave.reply( eepBuf[eepAddr] ); pc_serial.printf("\n[DEBUG] Addr[0x%02X]\n", eepAddr); break; default: //spi_dummy_reply(); } //pc_serial.printf("------------------------ end SPI Communication\n"); } } /* spiRxBuf[spiRxTempCnt++] = spiRxTempBuf; if(0x00 == spiRxTempBuf) { serialTxReadyFlag = 1; //pc_serial.printf("SPI Recive Byte [%d]\n", spiRxTempCnt-1); spiRxLen = strlen(spiRxBuf); spiRxTempCnt = 0; } } if(1 == serialTxReadyFlag) { serialTxReadyFlag = 0; pc_serial.printf("SPI_RX Data : len=[%d] %s\n", spiRxLen, spiRxBuf); } */ #if 0 /* TODO "serial -> slave ----(SPI)-----> " */ if(0 != pc_serial.readable()) // wait serial input.. { pc_serial.scanf("%s", serialRxBuf); serialRxLen = strlen(serialRxBuf); pc_serial.printf("len=[%d] %s\n", serialRxLen, serialRxBuf); spiTxReadyFlag = 1; } if(1 == spiTxReadyFlag) { PRINTD("spiTxReadyFlag=%d\n",spiTxReadyFlag); // SPI Send Start for(spiTxCnt = 0 ; spiTxCnt < serialRxLen + 1 ; ++spiTxCnt) { //printf("send Cnt[%d] [0x%02X]\n", spiTxCnt, serialRxBuf[spiTxCnt]); spi_slave.reply(serialRxBuf[spiTxCnt]); } for(spiTxCnt = 0 ; spiTxCnt < 1 ; ++spiTxCnt) { //printf("send Cnt[%d] [0x%02X]\n", spiTxCnt, serialRxBuf[spiTxCnt]); spi_slave.reply(serialRxBuf[spiTxCnt]); PRINTD("reply=%c\n",serialRxBuf[spiTxCnt]); } spiTxReadyFlag = 0; PRINTD("spiTxReadyFlag =0\n"); } #endif #if 0 // 161005_BDK_slave backup start int i; char valueFromMaster; char rx_buffer[255]={0}; char rx_cnt = -1; PRINTD("\n=========SLAVE=========\n"); SPI_SlaveInit(); while(1) { if(spi_slave.receive()) { PRINTD("----1\n"); if(pc.readable()) { SPI_SlaveWrite(); } PRINTD("----2\n"); valueFromMaster = spi_slave.read(); PRINTD("----3\n"); //PRINTD("valueFromMaster="); //PRINTD("[%c]%x\n",valueFromMaster,valueFromMaster); rx_buffer[++rx_cnt]=valueFromMaster; if(valueFromMaster==0) { PRINTD("rx_string="); for(i=0;i<rx_cnt;i++) { PRINTD("%c",rx_buffer[i]); } PRINTD("\n"); for(i=0;i<=rx_cnt;i++) { rx_buffer[i]=0; PRINTD("Init_rx_buf[%d]=%c\n",i,rx_buffer[i]); } rx_cnt=-1; }//valueFromMaster if }// spi_slave.receive() if /* */ }//end of while #endif // 161005_BDK_slave backup end }//end of main