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

Dependencies:   cube_CEBF746 cube_crc_16 mbed

main.cpp

Committer:
gandol2
Date:
2016-10-20
Revision:
7:efe7a78d7724
Parent:
6:a98f9d63f8a2

File content as of revision 7:efe7a78d7724:

// firmware for NUCLEO-F746ZG
// ======== SPI Master Pin
// PA5  - SCK
// PA6  - MISO
// PA7  - MOSI
// PA14 - SEL

#include "mbed.h"
#include "lib_CEBF746.h"
#include "lib_crc.h"

#define DEBUG_SPI
#ifdef DEBUG_SPI
#define PRINTD(arg1,arg2...)    printf(arg1,##arg2)
#endif

// ======== SPI Func define
#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

#define SPI_CONFIG_BIT          8
#define SPI_CONFIG_FREQUENCY    1000000         // 1Mhz
//#define SPI_CONFIG_FREQUENCY    50000000      // 50Mhz



Serial pc_serial(USBTX, USBRX);

typedef enum
{
    MENU_READ_STATUS_REG = 1,
    MENU_SPI_SELF_TEST_WRITE = 2,
    MENU_SPI_SELF_TEST_READ = 3,
    MENU_SPI_WRITE_ENC_DATA = 4,
    MENU_SPI_READ_ENC_DATA = 5,
    
    MENU_EXIT_Program = 9
}cebf746_command;

/** @brief print menu
 *
 */
void print_menu(void)
{
    pc_serial.printf("\n\n\n");
    pc_serial.printf("-----------[CEBF746 Test MENU]----------\n");
// CEBF746 func ###
    
    
    pc_serial.printf("%d) Read Status Reg\n", MENU_READ_STATUS_REG);
    pc_serial.printf("%d) Self Test(Write)\n", MENU_SPI_SELF_TEST_WRITE);
    pc_serial.printf("%d) Self Test(Read)\n", MENU_SPI_SELF_TEST_READ);
    pc_serial.printf("%d) Encrypt Data Write(16Byte)\n", MENU_SPI_WRITE_ENC_DATA);
    pc_serial.printf("%d) Encrypted Data Read(16Byte)\n", MENU_SPI_READ_ENC_DATA);
// cubebite test func ###


// exit func ###
    pc_serial.printf("%d) Exit program\n", MENU_EXIT_Program);
    pc_serial.printf("----------------------------------------\n");
    pc_serial.printf("input menu : ");
}


/** @brief convert ASCII to hex
 *
 *  @param convertedData converted Data
 *  @param sourceBuf ASCII data array
 *  @param 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;
}







/** @brief main function ###################################################################
 *
 */
int main()
{
    uint16_t tempCrc;
    char ret = 0;
    char retCode;
    char inputMenuNum = 0;
    spiDataStr sendData;
    spiDataStr reciveData;
    
    uint8_t encTempBuf[CEB_BUF_SIZE] = {0, };            
    
    uint8_t spiMOSIBuf[255];
    uint8_t spiMISOBuf[255];
    

    
    cebf746_use_init();

    pc_serial.printf("\n\n========== SPI Master for CEBF746 [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;
        }





        memset(spiMISOBuf, 0, 255);
        memset(spiMOSIBuf, 0, 255);
        retCode = 0xFF;
        switch (inputMenuNum)
        {
        
        case MENU_READ_STATUS_REG:        // Write Enable =================================[OK]
            pc_serial.printf("[DEBUG] Read Status Reg..\n");
            ret = 0;
            ret = cebf746_packet_read(FUNC_READ_STATUS, 0);
            printf("[INFO] status reg [%02X]\n", ret);
            break;
            
            
        case MENU_SPI_SELF_TEST_WRITE:         // 161017_KSS_Test OK
            char spiSelfTestBuf[CEB_BUF_SIZE] = WRITE_SELF_TEST_DATA;
                       
            sendData.size = sizeof(spiSelfTestBuf);
            sendData.buf = (uint8_t*)spiSelfTestBuf;
            sendData.crc16 = 0;

            ret = cebf746_packet_write(FUNC_WRITE_SELF_TEST, &sendData);
/*
            cebf746_print_packet(&sendData);
            
            pc_serial.printf("FUNC_WRITE_SELF_TEST..");
            if(0 == ret)
            {
                pc_serial.printf("[SUCESS] ret = %02X\n", ret);
            }
            else
            {
                pc_serial.printf("[FAIL] ******** ret = %02X ******** \n", ret);
            }            
*/
            break;
            
        case MENU_SPI_SELF_TEST_READ:         // 161017_KSS_Test OK            
            char selfTempRxBuf[CEB_BUF_SIZE]={0,};
            
            reciveData.size = CEB_BUF_SIZE;
            reciveData.buf = (uint8_t*)selfTempRxBuf;
            reciveData.crc16 = 0;
            
            ret = cebf746_packet_read(FUNC_READ_SELF_TEST, &reciveData);
            
            break;
        
        
        case MENU_SPI_WRITE_ENC_DATA:               //  Master >>>>>(encrypt data)>>>>> Slave
            
            
            pc_serial.printf("input Encrypt String (16 character) : ");
            for(int iCnt = 0 ; iCnt < 16 ; ++iCnt)                
            {   
                encTempBuf[iCnt] = pc_serial.getc();    
                pc_serial.printf("%c", encTempBuf[iCnt]); 
            }
                    
            sendData.size = sizeof(encTempBuf);
            sendData.buf = (uint8_t*)encTempBuf;
            sendData.crc16 = 0;
            
            ret = cebf746_packet_write(FUNC_WRITE_ENC_DATA, &sendData);
            
            break;
            
            
        case MENU_SPI_READ_ENC_DATA:                //  Master <<<<<(encrypted data)<<<<< Slave  
            int encryptWaitCnt = 10;
            
            // ★★★★ status reg 읽어오는 부분이 문제가 있는듯함 여기를 먼저 고쳐야함 
            while(1)
            {
                ret = cebf746_packet_read(FUNC_READ_STATUS, 0);
                if(ret == 0x02)       // Encrypting..                
                {
                    --encryptWaitCnt;       
                    if(0 >= encryptWaitCnt)
                        break;
                }
                else
                {
                    break;
                }
            }
            
            
            if(0 == encryptWaitCnt)
            {                
                printf("[INFO] The CEBF746 is running, STATUS[%02X]\n", ret);
                continue;
            }
            else
            {
                /* 161019_암호화된 데이터 읽어와야함. 슬레이브도 구현 해야함 */
                reciveData.size = sizeof(encTempBuf)+2;
                reciveData.buf = (uint8_t*)encTempBuf;
                reciveData.crc16 = 0;
              
                ret = cebf746_packet_read(FUNC_READ_ENC_DATA, &reciveData);
                
                printf("[DEBUF]MENU_SPI_READ_ENC_DATA return [%02X]\n", ret);
            }
            
            
            
        /*       
            uint8_t encTempBuf[CEB_BUF_SIZE] = {0, };            
            
            pc_serial.printf("input Encrypt String (16 character) : ");
            for(int iCnt = 0 ; iCnt < 16 ; ++iCnt)                
            {   
                encTempBuf[iCnt] = pc_serial.getc();    
                pc_serial.printf("%c", encTempBuf[iCnt]); 
            }
                    
            sendData.size = sizeof(encTempBuf);
            sendData.buf = (uint8_t*)encTempBuf;
            sendData.crc16 = 0;
            
            ret = cebf746_packet_write(FUNC_WRITE_ENC_DATA, &sendData);
          */  
            break;


        case MENU_EXIT_Program:
            
            pc_serial.printf("exit program... thank you\n");
            //return 0;

        }
        

    }

    return 0;
}