Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 //-----------------------------------------------------------------------
Generated on Wed Jul 13 2022 21:58:43 by
1.7.2