Takehisa Oneta / Mbed 2 deprecated FunctionGenerator-DAC

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <I2CSlave.h>
00003 #include "FunctionGenCommands.h"
00004 
00005 
00006 extern "C" void mbed_reset();
00007 
00008 #define     PI      3.141592
00009 
00010 #define     WAVE_MASTER_BUFFER_SIZE     360
00011 
00012 #define     WAVE_READ_BUFFER_SIZE             (1024 * 8)
00013 //#define     WAVE_READ_BUFFER_SIZE_FORCE       (1024 * 16 - 1)
00014 
00015 #define     I2C_PACKET_LENGTH   36
00016 
00017 #define     ONE_CLOCK_TIME      ((1.0 / 3.0) / (1000.0 * 1000.0))
00018 //-----------------------------------------------------------------------
00019 
00020 void initMasterWaveBuffer();
00021 void masterToReadBufferByFreq(uint32_t paramFreq);
00022 void clickedUpButton();
00023 void clickedDownButton();
00024 //void lookForYou();
00025 void doCommand(char *readBuffer, int length);
00026 void commandPrint(FGPacket *fgPacket);
00027 
00028 //-----------------------------------------------------------------------
00029 //-----------------------------------------------------------------------
00030 //BusOut myleds(LED1, LED2, LED3, LED4);
00031 //BusOut ladderDacBusOut(p21, p22, p23, p24, p25, p26, p5, p6, p7, p8);
00032 
00033 DigitalOut  led1(LED1);     // I2C I/O
00034 DigitalOut  led2(LED2);
00035 DigitalOut  led3(LED3);     // ERROR
00036 DigitalOut  led4(LED4);     // watch dog 
00037 
00038 PortOut ladderDacPortOut(Port0, 0x00000001);
00039     // P0_0のみ有効 = p9
00040 
00041 AnalogOut aout(p18);
00042 InterruptIn upButton(p11);
00043 InterruptIn downButton(p12);
00044 
00045 //InterruptIn i2cStart(p13);
00046 InterruptIn i2cStart(p29);
00047 I2CSlave i2cSlave(p28, p27);
00048 int gLookI2C = false;
00049 
00050 Serial pc(USBTX, USBRX);
00051 
00052 //-----------------------------------------------------------------------
00053 uint32_t    gMasterFrequency = 366;
00054 uint32_t    gLastFrequency = 366;
00055 
00056 uint16_t gMasterBuffer[WAVE_MASTER_BUFFER_SIZE];
00057 //uint16_t gReadBuffer[WAVE_READ_BUFFER_SIZE];
00058 uint16_t gReadBuffer[WAVE_READ_BUFFER_SIZE] __attribute__((section("AHBSRAM0")));
00059 uint16_t gReadBuffer_tmp[WAVE_READ_BUFFER_SIZE] __attribute__((section("AHBSRAM1")));
00060 volatile int gReadBufferLength = 0;
00061 
00062 char  gI2cReadBuffer[I2C_PACKET_LENGTH];   
00063 
00064 WaveformInfo    gWaveformInfo;
00065 
00066 
00067 
00068 //-----------------------------------------------------------------------
00069 //-----------------------------------------------------------------------
00070 
00071 void initMasterWaveBuffer()
00072 {
00073     // sin-wave
00074     for (int i = 0; i < WAVE_MASTER_BUFFER_SIZE; i++) {
00075         double rad = ((double)i / WAVE_MASTER_BUFFER_SIZE) * (PI * 2);   // = 0...2*PI
00076         double sinA = sin(rad); // answer: -1.0 〜 1.0
00077         gMasterBuffer[i] = (unsigned short)((sinA + 1.0) / 2.0 * 0xffff);
00078     }
00079     
00080     gMasterFrequency = 1.0 / (ONE_CLOCK_TIME * WAVE_MASTER_BUFFER_SIZE);
00081 }
00082 
00083 void masterToReadBufferByFreq(uint32_t paramFreq)
00084 {
00085     gMasterFrequency = paramFreq;
00086     gLastFrequency = gMasterFrequency;
00087     
00088     gReadBufferLength = (1.0 / (paramFreq * ONE_CLOCK_TIME));
00089         // 2 <= gReadBufferLength <= WAVE_READ_BUFFER_SIZE
00090 
00091     double x = (double)WAVE_MASTER_BUFFER_SIZE / (double)gReadBufferLength;
00092     //double x = (double)WAVE_READ_BUFFER_SIZE_FORCE / (double)gReadBufferLength;
00093 
00094     pc.printf("gReadBufferLength: %d\n", gReadBufferLength);
00095     pc.printf("x: %f\n", x);
00096 
00097     for (int i = 0; i < gReadBufferLength; i++) {
00098         int pt = (int)((double)i * x);
00099         gReadBuffer[i] = gMasterBuffer[pt] & 0xffc0;
00100         //gReadBuffer[i] = (i & 0x01) ? 0xffff : 0x0000;
00101     }
00102 }
00103 
00104 void clearReadBuffer()
00105 {
00106     for (int i = 0; i < WAVE_READ_BUFFER_SIZE; i++) {
00107     //for (int i = 0; i < WAVE_READ_BUFFER_SIZE_FORCE; i++) {
00108         gReadBuffer[i] = 0x0000;
00109     }
00110 }
00111 
00112 //-----------------------------------------------------------------------
00113 #if 0
00114 void clickedUpButton()
00115 {
00116     upButton.disable_irq();
00117     downButton.disable_irq();
00118     wait(0.01);
00119     if (upButton == 1) {
00120         gInterruptCount++;
00121         if (gInterruptCount >= WAVE_READ_BUFFER_SIZE) {
00122             gInterruptCount = WAVE_READ_BUFFER_SIZE - 1;
00123         }
00124         masterToReadBuffer();
00125         //myleds = gInterruptCount;
00126     }
00127     upButton.enable_irq();
00128     downButton.enable_irq();
00129     
00130     //pc.printf("Interrupt Count: %d \n", gInterruptCount);
00131 }
00132 
00133 void clickedDownButton()
00134 {
00135     upButton.disable_irq();
00136     downButton.disable_irq();
00137     wait(0.01);
00138     if (downButton == 1) {
00139         gInterruptCount--;
00140         if (gInterruptCount < 0) {
00141             gInterruptCount = 0;
00142         }
00143         masterToReadBuffer();
00144         //myleds = gInterruptCount;
00145     }
00146     upButton.enable_irq();
00147     downButton.enable_irq();
00148 
00149     //pc.printf("Interrupt Count: %d \n", gInterruptCount);
00150 }
00151 #endif
00152 //-----------------------------------------------------------------------
00153 /**
00154  *
00155  */
00156 void i2cSlaveAction()
00157 {
00158     pc.printf("--------\n");
00159     pc.printf("i2cSlaveAction()\n");
00160 
00161     static int cnt = 0;
00162 
00163     for (int i = 0; i < I2C_PACKET_LENGTH; i++) {
00164         gI2cReadBuffer[i] = 0x00;
00165     }
00166 
00167     int loopCount = 0;
00168     int result = i2cSlave.receive();
00169     while (result == I2CSlave::NoData) {
00170         wait_ms(10);
00171         result = i2cSlave.receive();
00172         if (loopCount > 100) {
00173             return;
00174         }
00175     }
00176 
00177     switch (result) {
00178         case I2CSlave::NoData:
00179             break;
00180 
00181         case I2CSlave::WriteGeneral:        //  the master is writing to all slave -- broadcast
00182             break;
00183 
00184         case I2CSlave::WriteAddressed:      // the master is writing to this slave
00185             int ret = i2cSlave.read(gI2cReadBuffer, I2C_PACKET_LENGTH);
00186             FGPacket *fgPacket = (FGPacket *)gI2cReadBuffer;
00187 
00188             pc.printf("Read : ret=%d  [ ", ret);
00189             for (int i = 0; i < fgPacket->header.length; i++) {
00190                 pc.printf("%02x ", gI2cReadBuffer[i]);
00191             }
00192             pc.printf("]\n");
00193 
00194             doCommand(gI2cReadBuffer, I2C_PACKET_LENGTH);
00195             break;
00196 
00197         case I2CSlave::ReadAddressed:       //  the master has requested a read from this slave
00198             char buf[32];
00199             sprintf(buf, "Ooops:%d", cnt);
00200             i2cSlave.write(buf, strlen(buf));
00201             cnt++;
00202             break;
00203 
00204         default:
00205             break;
00206     }
00207 }
00208 
00209 void doCommand(char *readBuffer, int length)
00210 {
00211     FGPacket *fgPacket = (FGPacket *)gI2cReadBuffer;
00212     commandPrint(fgPacket);
00213 
00214     switch (fgPacket->header.command) {
00215         // for Command
00216         case FGCommand_Non:
00217             break;
00218 
00219         case FGCommand_Device:
00220             // reserved for future.
00221             // fgPacket->body.commandDevice.device
00222             break;
00223 
00224         case FGCommand_Output:
00225             if (fgPacket->body.commandOutput.on == 0) {
00226                 aout.write_u16(0x0000);
00227                 clearReadBuffer();
00228             } else {
00229                 masterToReadBufferByFreq(gMasterFrequency);
00230             }
00231             break;
00232 
00233         case FGCommand_Frequency:
00234             // TODO: 正確な周波数計算をすること!
00235             masterToReadBufferByFreq(fgPacket->body.commandFrequency.frequency);
00236             break;
00237 
00238         case FGCommand_WaveformInfo:
00239             // TODO: パラメタの内容をチェックすること!
00240             gWaveformInfo = fgPacket->body.commandWaveformInfo;
00241 
00242             break;
00243         case FGCommand_WaveformBlock:
00244             // TODO: パラメタの内容をチェックすること!
00245             uint32_t waveformOffset = fgPacket->body.commandWaveformBlock.blockNo * gWaveformInfo.blockSize;
00246             memcpy((uint8_t *)gMasterBuffer + waveformOffset, fgPacket->body.commandWaveformBlock.buffer, fgPacket->body.commandWaveformBlock.length);
00247             break;
00248 
00249         case FGCommand_WaveformToBuffer:
00250             masterToReadBufferByFreq(gMasterFrequency);
00251             break;
00252  
00253         // for Status
00254         case FGStatus_Output:
00255             break;
00256         case FGStatus_Frequency:
00257             break;
00258         case FGStatus_Device:
00259             break;
00260 
00261         // Special command
00262         case FGCommand_Reset:
00263             mbed_reset();
00264             break;
00265     }
00266 }
00267 
00268 void commandPrint(FGPacket *fgPacket)
00269 {
00270     pc.printf("command: %d\n", fgPacket->header.command);
00271     pc.printf("length: %d\n", fgPacket->header.length);
00272     {
00273         switch (fgPacket->header.command) {
00274             case FGCommand_Non:
00275                 pc.printf("FGCommand_Non \n");
00276                 pc.printf("Param:\n");
00277                 pc.printf("  NON\n");
00278                 break;
00279            case FGCommand_Device:
00280                 pc.printf("FGCommand_Device \n");
00281                 pc.printf("Param:\n");
00282                 pc.printf("  device: %d\n", fgPacket->body.commandDevice.device);
00283                 break;
00284             case FGCommand_Output:
00285                 pc.printf("FGCommand_Output \n");
00286                 pc.printf("Param:\n");
00287                 pc.printf("  on: %d\n", fgPacket->body.commandOutput.on);
00288                 break;
00289             case FGCommand_Frequency:
00290                 pc.printf("FGCommand_Frequency \n");
00291                 pc.printf("Param:\n");
00292                 pc.printf(" freq: %d\n", fgPacket->body.commandFrequency.frequency);
00293                 break;
00294 
00295             case FGCommand_WaveformInfo:
00296                 pc.printf("FGCommand_WaveformInfo \n");
00297                 pc.printf("Param:\n");
00298                 pc.printf("  waveSize: %d\n", fgPacket->body.commandWaveformInfo.waveSize);
00299                 pc.printf("  bitPerData: %d\n", fgPacket->body.commandWaveformInfo.bitPerData);
00300                 pc.printf("  blockSize: %d\n", fgPacket->body.commandWaveformInfo.blockSize);
00301                 pc.printf("  blockMaxNum: %d\n", fgPacket->body.commandWaveformInfo.blockMaxNum);
00302                 break;
00303 
00304             case FGCommand_WaveformBlock:
00305 #if 0
00306                 pc.printf("FGCommand_WaveformBlock \n");
00307                 pc.printf("Param:\n");
00308                 pc.printf("  blockNo: %d\n", fgPacket->body.commandWaveformBlock.blockNo);
00309                 pc.printf("  length: %d\n", fgPacket->body.commandWaveformBlock.length);
00310                 pc.printf("  buffer:\n");
00311                 for (int i = 0; i < fgPacket->body.commandWaveformBlock.length; i++) {
00312                     pc.printf("%02x ", fgPacket->body.commandWaveformBlock.buffer[i]);
00313                 }
00314                 pc.printf("\n");
00315 #endif
00316                 break;
00317 
00318             case FGCommand_WaveformToBuffer:
00319                 pc.printf("FGCommand_WaveformToBuffer \n");
00320                 pc.printf("Param:\n");
00321                 pc.printf("  NON\n");
00322                 break;
00323 
00324             case FGStatus_Output:
00325                 pc.printf("FGStatus_Output \n");
00326                 pc.printf("Param:\n");
00327                 pc.printf("  NON\n");
00328                 break;
00329             case FGStatus_Frequency:
00330                 pc.printf("FGStatus_Frequency \n");
00331                 pc.printf("Param:\n");
00332                 pc.printf("  NON\n");
00333                 break;
00334             case FGStatus_Device:
00335                 pc.printf("FGStatus_Device \n");
00336                 pc.printf("Param:\n");
00337                 pc.printf("  NON\n");
00338                 break;
00339         }
00340     }
00341 }
00342 
00343 //-----------------------------------------------------------------------
00344 //-----------------------------------------------------------------------
00345 
00346 int main() {
00347     pc.baud(115200);
00348     pc.printf("\n");
00349     pc.printf("mbed function generator\n");
00350     pc.printf("--\n");
00351 
00352     {
00353         gWaveformInfo.waveSize    = WAVE_MASTER_BUFFER_SIZE;
00354         gWaveformInfo.bitPerData  = 12;
00355         gWaveformInfo.blockSize   = 16;    // byte
00356         gWaveformInfo.blockMaxNum = gWaveformInfo.waveSize / gWaveformInfo.blockSize * ((gWaveformInfo.bitPerData + 7) / 8);
00357     }
00358 
00359     initMasterWaveBuffer();
00360     masterToReadBufferByFreq(gMasterFrequency);
00361 
00362     i2cSlave.frequency(100000);
00363     i2cSlave.address(0x62);
00364     i2cStart.rise(&i2cSlaveAction);
00365 
00366     //upButton.rise(&clickedUpButton);
00367     //downButton.rise(&clickedDownButton);
00368 
00369 
00370     while (1) {
00371         for (int i = 0; i < gReadBufferLength; i++) {
00372             //aout.write_u16(gReadBuffer[i]);
00373             LPC_DAC->DACR = gReadBuffer[i];     // 1data output : MAX 3MHz = 333nS
00374         }
00375     }
00376     
00377     
00378     int waitus = 0;
00379     while (1) {
00380         for (int i = 0; i < gReadBufferLength; i++) {
00381             LPC_DAC->DACR = gReadBuffer[i];     // 1data output : MAX 3MHz = 333nS
00382             wait_us(waitus);
00383         }
00384     }
00385 
00386 }
00387 
00388 //-----------------------------------------------------------------------
00389 //-----------------------------------------------------------------------