CEBF746 Module.. PC <--> This Module (SPI Master) <-->

Dependencies:   cube_CEBF746 cube_crc_16 mbed

Revision:
0:9a61123385e9
Child:
1:37d21610ce62
Child:
5:589ab465ed00
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 12 00:48:11 2016 +0000
@@ -0,0 +1,590 @@
+// firmware for NUCLEO-F746ZG
+// ======== SPI Master Pin
+// PA5  - SCK
+// PA6  - MISO
+// PA7  - MOSI
+// PA14 - SEL
+
+
+#include "mbed.h"
+#include <SPI.h>
+
+#define DEBUG_SPI
+
+#ifdef DEBUG_SPI
+#define PRINTD(arg1,arg2...)    printf(arg1,##arg2)
+#endif
+
+// ======== SPI Master Pin define
+#define SPI_SCLK    PA_5
+#define SPI_MISO    PA_6
+#define SPI_MOSI    PA_7
+#define SPI_SSEL    PA_4
+
+#define MASTER
+
+SPI spi_master(SPI_MOSI,SPI_MISO,SPI_SCLK); // MOSI, MISO, SCLK(CLK,SCK)
+DigitalOut cs(SPI_SSEL);
+
+Serial pc_serial(USBTX, USBRX);
+
+
+void SPI_INIT()
+{
+    pc_serial.printf("Set SPI init..\n");
+    pc_serial.printf("Set SPI format..\n");
+    spi_master.format(8,0);
+    pc_serial.printf("Set frequency to default..\n");
+    //spi_master.frequency(50000000); // default 1MHz
+    spi_master.frequency(1000000);
+}
+/*
+void SPI_Write()
+{
+    char temp;
+    int i,value;
+    char response;
+    char tx_cnt = -1;
+    char rx_cnt = -1;
+    char tx_buffer[255]={0};
+    char rx_buffer[255]={0};
+    PRINTD("\n==========MASTER==========\n");
+    PRINTD("DATA SEND START...\n");
+    PRINTD("Lock SPI BUS..\n");
+
+    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");
+            spi_master.lock();
+            for(i=0;i<=tx_cnt;++i)
+            {
+                value=tx_buffer[i];
+                PRINTD("[M]write[%d]=%c[%02x]\n",i,value,value);
+                cs=0;
+                response=spi_master.write(value);
+                cs=-1;
+                PRINTD("[M]receive=%c[%x]\n",response,response);
+                rx_buffer[++rx_cnt]=response;
+            }
+            spi_master.unlock();
+            for(i=0;i<255;++i)
+            {
+                tx_buffer[i]=0;
+            }
+            for(i=0;i<=tx_cnt;i++)
+            {
+                PRINTD("init_tx_buffer[%d]=%c\n",i,tx_buffer[i]);
+            }
+            tx_cnt=-1;
+        }
+        else
+        {
+            PRINTD("%c[%02x]",tx_buffer[tx_cnt],tx_buffer[tx_cnt]);
+        }
+    }
+}
+*/
+
+#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
+#define EEPROM_MULTIREAD    0x07        // Write EEPROM Memory
+
+
+enum cubeMenu { EEPROM_Write_Enable = 1 , 
+                EEPROM_Write_Disable,
+                EEPROM_Read_Status,
+                EEPROM_Write_Status,
+                EEPROM_Write_Memory,
+                EEPROM_Read_Memory,
+                TEST_Multi_Byte_Read,
+                EXIT_Program = 9
+                };
+
+void print_menu(void)
+{
+    pc_serial.printf("\n\n\n\n\n\n\n"); 
+     pc_serial.printf("-----------[MENU]----------\n");
+     pc_serial.printf("1) Write Enable\n");//, cubeMenu.EEPROM_Write_Enable);
+     pc_serial.printf("2) Write Disable\n");//, cubeMenu.EEPROM_Write_Disable);
+     pc_serial.printf("3) Read Status Register\n");//, cubeMenu.EEPROM_Read_Status);
+     pc_serial.printf("4) Write Status Register\n");//,cubeMenu.EEPROM_Write_Status);
+     pc_serial.printf("5) Write Memory\n");//, cubeMenu.EEPROM_Write_Memory);
+     pc_serial.printf("6) Read Memory\n");//, cubeMenu.EEPROM_Read_Memory);
+     pc_serial.printf("7) multi byte read\n");//, cubeMenu.TEST_Multi_Byte_Read);
+     pc_serial.printf("9) Exit program\n");//, cubeMenu.EXIT_Program);
+     pc_serial.printf("---------------------------\n");
+     pc_serial.printf("input menu : ");
+}
+
+void spi_start(void)
+{
+    spi_master.lock();            
+    cs = 0; 
+    wait_us(0);
+}
+void spi_end(void)
+{
+    wait_us(10);
+    cs = 1;         
+    spi_master.unlock();
+}
+void spi_dummy_write(void)
+{
+    char dummy_read;
+    spi_start();
+    dummy_read = spi_master.write( 0x00 );
+    spi_end();
+}
+
+/*
+    @convertedData : converted Data
+    @sourceBuf : ASCII data array
+    @lenght : sourceBuf length
+    
+    @return : 0 is valid hex format, other is error
+*/
+int converHex(char * convertedData, char * sourceBuf, int length)
+{
+    int ret = 0;
+    char tempBuf[length];
+    *convertedData = 0;
+    
+    
+    for(int iCnt = 0 ; iCnt < length ; iCnt++)
+    {
+        if( ('0' <= *(sourceBuf+iCnt)) && ('9' >= *(sourceBuf+iCnt)) )
+        {
+            tempBuf[iCnt] = (*(sourceBuf+iCnt) - 48); 
+        }
+        else if( ('A' <= *(sourceBuf+iCnt)) && ('F' >= *(sourceBuf+iCnt)) )
+        {
+            tempBuf[iCnt] = (*(sourceBuf+iCnt) - 55); 
+        }
+        else if( ('a' <= *(sourceBuf+iCnt)) && ('f' >= *(sourceBuf+iCnt)) )
+        {          
+            tempBuf[iCnt] = (*(sourceBuf+iCnt) - 87); 
+        }
+        else    // error
+        {
+            ret = -1;
+            return ret;                    
+        }  
+    }
+    
+    //pc_serial.printf("[TEST] tempBuf[0] = 0x%02X\n", tempBuf[0]);
+    //pc_serial.printf("[TEST] tempBuf[1] = 0x%02X\n", tempBuf[1]);
+    *convertedData = ((tempBuf[0] & 0x0F) << 4) | (tempBuf[1] & 0x0F);
+    //pc_serial.printf("[TEST] convertedData = 0x%02X\n", *convertedData);
+    return ret;
+}
+
+// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ main();
+int main()
+{
+     char dummyRead;
+     char inputMenuNum = 0;
+     char statusReg = 0x00;
+     char test_data[10]={0};
+     
+     int spiTxCnt = 0;
+     int spiRxCnt = 0; 
+     char spiTxReadyFlag = 0;
+     
+     
+     int res;
+     
+     
+     int spiRxTempBuf = 0;
+     char serialRxBuf[255];
+     char spiRxBuf[255];
+     int serialRxLen = 0;
+     
+     char eepAddrBuf[2] = {0};
+     char eepAddr = 0;
+     
+     char eepDataBuf[2] = {0};
+     char eepData = 0;
+     int eepReadData = 0;   
+     int maxInputCnt = 0;
+     
+     
+     
+     int ret;
+     
+     SPI_INIT();
+     spi_dummy_write();
+     
+     
+     
+     
+     pc_serial.printf("\n\n========== SPI Master for EEPROM [Start] ==========\n");
+     
+     
+     while(1)
+     {
+         print_menu();
+         inputMenuNum = pc_serial.getc();
+         
+         pc_serial.printf("[DEBUG] input menu number = %c\n", inputMenuNum);
+         
+         if( ('0' < inputMenuNum) && ('9' >= inputMenuNum) )
+         {
+            inputMenuNum = inputMenuNum - 48;
+         }
+         else
+         {
+             pc_serial.printf("[INFO] correct input menu number.. please retry..\n");
+             wait(1);
+             continue;
+         }
+         
+                  
+         
+         spi_start();
+         switch(inputMenuNum)
+         {
+             case 1:        // Write Enable =================================[OK]
+                pc_serial.printf("[DEBUG] Write Enable progress..\n");
+                dummyRead = spi_master.write(EEPROM_WREN);            
+             break;
+             
+             
+             
+             case 2:        // Write Disable =================================[OK]             
+                pc_serial.printf("[DEBUG] Write Disable progress..\n");
+                dummyRead = spi_master.write(EEPROM_WRDI);                
+             break;
+             
+             
+             
+             case 3:        // Read Status Register =================================[OK]
+                pc_serial.printf("[DEBUG] Read Status Register progress..\n");
+                spi_master.write(EEPROM_RDSR);  
+                statusReg = spi_master.write(EEPROM_RDSR);     
+                
+                // TODO : print statusReg data to serial
+                pc_serial.printf("[INFO] Status Register Data : 0x%02X\n", statusReg);
+                                
+             break;
+             
+             
+             
+             
+             
+             case 4:        // Write Status Register =================================
+                pc_serial.printf("[DEBUG] Write Status Register progress..\n");
+                // TODO : input data for serial
+                
+                    spi_master.write(EEPROM_WRSR);
+                    spi_master.write(statusReg);
+             break;
+             
+             
+             
+             
+             
+             case 5:        // Write Memory =================================
+                pc_serial.printf("[DEBUG] Write Memory progress..\n");
+                
+                
+                
+                
+                // EEPROM Address input
+                
+                maxInputCnt = 3;
+                while(maxInputCnt--)
+                {
+                    pc_serial.printf("input Address (hex format : 00~FF) : ");
+                    for(int iCnt = 0 ; iCnt < 2 ; ++iCnt)                
+                    {   
+                        eepAddrBuf[iCnt] = pc_serial.getc();    
+                        pc_serial.printf("%c", eepAddrBuf[iCnt]); 
+                    }
+                    
+                    ret = converHex(&eepAddr , eepAddrBuf, 2);
+                    
+                    if(0 == ret)
+                    {
+                        //pc_serial.printf("\n[DEBUG] before convert hex [0x%02x] \n", eepAddr);
+                        break;
+                    }
+                    else        // error
+                    {
+                        pc_serial.printf("\n[INFO] hex formet error!\n");
+                        continue;
+                    }                     
+                }
+                
+                
+                if(0 == ret)
+                {
+                    // EEPROM data input
+                    maxInputCnt = 3;
+                    while(maxInputCnt--)
+                    {
+                        pc_serial.printf("\ninput Data (hex format : 00~FF) : ");
+                        for(int iCnt = 0 ; iCnt < 2 ; ++iCnt)                
+                        {   
+                            eepDataBuf[iCnt] = pc_serial.getc();    
+                            pc_serial.printf("%c", eepDataBuf[iCnt]); 
+                        }
+                        
+                        int ret = converHex(&eepData , eepDataBuf, 2);
+                        if(0 == ret)
+                        {
+                            
+                            pc_serial.printf("\n[INFO] SPI Write Memory.... Start! \n");
+                            //pc_serial.printf("\n[DEBUG] Addr[0x%02X] Data[0x%02X] \n", eepAddr, eepData);
+                            
+                            spi_master.write(EEPROM_RDSR);  
+                            if(! (spi_master.write(EEPROM_RDSR) & 0x01) )
+                            {                           
+                                spi_master.write(EEPROM_WRITE);
+                                spi_master.write(eepAddr);
+                                spi_master.write(eepData);
+                                pc_serial.printf("\n[INFO] SPI Write success \n");
+                            }
+                            else
+                            {
+                                pc_serial.printf("\n[INFO] SPI Write fail.. device is busy! \n");
+                            }
+                            
+                            
+                            break;
+                        }
+                        else        // error
+                        {
+                            pc_serial.printf("\n[INFO] hex formet error!\n");
+                            continue;
+                        }            
+                    }
+                }
+                
+                
+             break;
+             
+             
+             
+             
+             
+             case 6:        // Read Memory =================================
+                pc_serial.printf("[DEBUG] Read Memory progress..\n");
+                
+                // EEPROM Address input
+                
+                maxInputCnt = 3;
+                while(maxInputCnt--)
+                {
+                    pc_serial.printf("input Address (hex format : 00~FF) : ");
+                    for(int iCnt = 0 ; iCnt < 2 ; ++iCnt)                
+                    {   
+                        eepAddrBuf[iCnt] = pc_serial.getc();    
+                        pc_serial.printf("%c", eepAddrBuf[iCnt]); 
+                    }
+                    
+                    ret = converHex(&eepAddr , eepAddrBuf, 2);
+                    
+                    if(0 == ret)
+                    {
+                        //pc_serial.printf("\n[DEBUG] before convert hex [0x%02x] \n", eepAddr);
+                        spi_master.write(EEPROM_READ);
+                        spi_master.write(eepAddr);
+                        
+                        
+                        eepReadData = spi_master.write(0);
+                        
+                        
+                        pc_serial.printf("\n[DEBUG] Read EEPROM Addr[0x%02X] Data[0x%02X] \n", eepAddr, eepReadData);
+                        break;
+                    }
+                    else        // error
+                    {
+                        pc_serial.printf("\n[INFO] hex formet error!\n");
+                        continue;
+                    }                     
+                }
+                
+                
+                
+             break;
+             
+             
+             case 7:
+                pc_serial.printf("\n[DEBUG] TEST_Multi_Byte_Read\n");
+                
+                maxInputCnt = 3;
+                while(maxInputCnt--)
+                {
+                    pc_serial.printf("input Address (hex format : 00~FF) : ");
+                    for(int iCnt = 0 ; iCnt < 2 ; ++iCnt)                
+                    {   
+                        eepAddrBuf[iCnt] = pc_serial.getc();    
+                        pc_serial.printf("%c", eepAddrBuf[iCnt]); 
+                    }
+                    
+                    ret = converHex(&eepAddr , eepAddrBuf, 2);
+                    
+                    if(0 == ret)
+                    {
+                        spi_master.write(EEPROM_MULTIREAD);
+                        spi_master.write(eepAddr); 
+                        
+                        
+                        for(int i=0;i<5;i++)
+                        {   
+                            wait_ms(10);
+                            //test_data[i] = spi_master.write(0);
+                            //spi_master.write(++eepAddr); 
+                            test_data[i] = spi_master.write(0);     // dummy write
+                            
+                        }
+                        
+                        for(int i=0;i<5;i++)
+                        {   
+                            printf("\n[DEBUG] Read EEPROM Data[0x%02X]\n",test_data[i]);
+                        }
+                        
+                        //pc_serial.printf("\n[DEBUG] Read EEPROM Addr[0x%02X]\n", eepAddr);
+                        break;
+                    }
+                    else        // error
+                    {
+                        pc_serial.printf("\n[INFO] hex formet error!\n");
+                        continue;
+                    }                     
+                }
+                
+                
+             break;
+             
+             
+             
+             
+             
+             case 9:
+                spi_end();
+                pc_serial.printf("exit program... thank you\n");
+                //return 0;   
+             default:             
+         }
+         spi_end();
+        
+     }
+     
+
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     while(1)
+     {        
+        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)
+        {
+            // SPI Send Start
+            spi_master.lock();            
+            cs = 0;   
+            for(spiTxCnt = 0 ; spiTxCnt < serialRxLen + 1 ; ++spiTxCnt)
+            {
+                //printf("send Cnt[%d] [0x%02X]\n", spiTxCnt, serialRxBuf[spiTxCnt]);                         
+                spi_master.write(serialRxBuf[spiTxCnt]);
+                //res=spi_master.write(serialRxBuf[spiTxCnt]);
+                //PRINTD("res=%c 0x[%02x]\n",res,res);
+                //spiRxBuf[spiRxCnt++]=res;
+            }   
+            cs = 1;         
+            spi_master.unlock();
+            spiTxReadyFlag = 0;
+        }
+        
+        
+        
+        /* TODO " ----(SPI)-----> master --> serial " */
+        
+        
+#if 0        
+        if(res!=0)
+        {
+            PRINTD("res=%d\n",res);
+            PRINTD("res=%s\n",spiRxBuf);
+        }
+#endif
+        
+        
+     }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+#if 0   // 161005_BDK_backup2 start
+    int send_data;
+    SPI_INIT();   
+    while(1)
+    {
+        SPI_Write();   
+    }
+#endif  // 161005_BDK_backup2 end
+    return 0;
+}