#include #include #include #include #include "uvna.h" extern xdata BYTE devSerialNumber []; extern xdata BYTE devCapabilities []; extern xdata BYTE devIdentifier []; extern bool fx2_i2c_read( BYTE addr, BYTE length, BYTE xdata *dat); extern bool fx2_i2c_write( BYTE addr, BYTE length, BYTE xdata *dat); xdata BYTE volatile vna_buffer[4]; extern void proto_main(void); extern void proto_conf(void); void dump(void); // ================================================================================================ // main // ================================================================================================ void uvna_main(void) { // ------------------------------------------------------------------------ // call "inherited" main() // ------------------------------------------------------------------------ proto_main(); // ------------------------------------------------------------------------ // "uVNA" specific main() // ------------------------------------------------------------------------ lcd_gotoxy(0,0); lcd_puts("uVNA",4); } // ================================================================================================ // configure // ================================================================================================ void uvna_conf() { char rc; // ------------------------------------------------------------------------ // call "inherited" config() // ------------------------------------------------------------------------ proto_conf(); // ------------------------------------------------------------------------ // temp serial number // ------------------------------------------------------------------------ devSerialNumber[0] = 'U'; devSerialNumber[1] = '5'; // ------------------------------------------------------------------------ // Board specific initialization // // TRINITY_1: // // - 2 layers board // - 56 pin mcu // - 16 kB flash EEPROM // // J1 J2 // -------------------------- -------------------------- // GND - 1 2 - 5.0V SLWR - 1 2 - SLRD // GND - 3 4 - 5.0V CLKOUT - 3 4 - GND // PB.2 - 5 6 - PB.3 PD.5 - 5 6 - GND // PB.1 - 7 8 - PB.0 PD.6 - 7 8 - PD.7 // SCL - 9 10 - SDA 3.3V - 9 10 - 3.3V // PB.6 - 11 12 - PB.7 3.3V - 11 12 - 3.3V // PB.5 - 13 14 - PB.4 PD.4 - 13 14 - GND // FLAG.B - 15 16 - FLAG.A PD.3 - 15 16 - PD.2 // PA.2 - 17 18 - FLAG.C PD.1 - 17 18 - PD.0 // PA.1 - 19 20 - PA.0 GND - 19 20 - GND // PA.7 - 21 22 - PA.3 GND - 21 22 - GND // PA.4 - 23 24 - GND GND - 23 24 - GND // PA.5 - 25 26 - PA.5 RESET - 25 26 - WU // // // JTAG TOP // ---------------- // T T G G P // D C N N W // I K D D R // // 9 7 5 3 1 // 10 8 6 4 2 // // T T G G T // R M N N D // S S D D O // T // // If JTAG is used, the following pins are used for JTAG interface: // (implemented in JTAG) // // TCK - PA.0 out // TMS - PA.1 out // TDI - PA.7 out // TDO - PA.3 in // ena - PA.4 out // // // If DOG LCD is used, the following pins are used for LCD interface. // (implemented in PROTO) // // RST - PD.6 out // CS - PD.5 out // A0 - PD.4 out // SCL - PD.3 out // SI - PD.1 out // // uVNA specific: // // - I2C for programming the AD5933 (at address of 0x0D) // - SPI for programming Xilinx CPLD clock divider // // SDI - PB.2 // SCK - PB.1 // SS - PB.0 // ------------------------------------------------------------------------ IOB &= 0xF8; // clear SPI bits OEB |= 0x07; // enable SPI bits (out) rc = fx2_i2c_read( 0x08, 4, vna_buffer); switch(rc) { case I2C_BERROR: lcd_gotoxy(0,6); lcd_putc('B'); break; case I2C_NACK: lcd_gotoxy(0,6); lcd_putc('N'); break; } //fx2_i2c_read( 0x10, 2, vna_buffer); return; // ------------------------------------------------------------------- // initialize uVNA // ------------------------------------------------------------------- uvna_xclock(12); lcd_gotoxy(0,6); // return; // start freq vna_buffer[0] = 0x82; vna_buffer[1] = 0x0F; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x83; vna_buffer[1] = 0x5C; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x84; vna_buffer[1] = 0x28; // freq increments vna_buffer[0] = 0x85; vna_buffer[1] = 0x00; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x86; vna_buffer[1] = 0x20; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x87; vna_buffer[1] = 0x4F; fx2_i2c_write( 0x0D, 2, vna_buffer); // number steps vna_buffer[0] = 0x88; vna_buffer[1] = 0x00; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x89; vna_buffer[1] = 99; fx2_i2c_write( 0x0D, 2, vna_buffer); // settling cycles vna_buffer[0] = 0x8A; vna_buffer[1] = 0x00; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x8B; vna_buffer[1] = 0x0A; fx2_i2c_write( 0x0D, 2, vna_buffer); // standby // ----------------------------------------- vna_buffer[0] = 0x80; vna_buffer[1] = 0xB0; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0x81; vna_buffer[1] = 0x00; fx2_i2c_write( 0x0D, 2, vna_buffer); // ini with start freq vna_buffer[0] = 0x80; vna_buffer[1] = 0x10; fx2_i2c_write( 0x0D, 2, vna_buffer); // return; // dump(); // start sweep vna_buffer[0] = 0x80; vna_buffer[1] = 0x20; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x8F; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); while(1) { while( (vna_buffer[0] & 0x02) == 0) { vna_buffer[0] = 0xB0; vna_buffer[1] = 0x8F; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); // lcd_gotoxy(19,1); // lcd_putx2(vna_buffer[0] & 0x0F | 0x80); } if( vna_buffer[0] & 0x04) break; // read values // step sweep vna_buffer[0] = 0x80; vna_buffer[1] = 0x30; fx2_i2c_write( 0x0D, 2, vna_buffer); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x8F; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); // lcd_gotoxy(19,2); // lcd_putx2(vna_buffer[0] & 0x0F | 0x40); } dump(); return; /* vna_buffer[0] = 0xAA; FX2_Delay(150); i2c_write( 0x0D, 1, vna_buffer); FX2_Delay(150); i2c_write( 0x0D, 1, vna_buffer); FX2_Delay(150); i2c_write( 0x0D, 1, vna_buffer); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x80; FX2_Delay(50); i2c_write( 0x0D, 2, vna_buffer); FX2_Delay(50); i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); FX2_Delay(50); i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); FX2_Delay(50); i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); return; vna_buffer[0] = 0x82; // adr = 0x82 (start frequency high byte) vna_buffer[1] = 0x01; // val = 0x01 (high byte) if (i2c_write( 0x0D, 2, vna_buffer)) lcd_putc('2'); else lcd_putc('x'); FX2_Delay(50); vna_buffer[0] = 0x83; // adr = 0x82 (start frequency mid byte) vna_buffer[1] = 0x02; // val = 0x02 // i2c_write( 0x0D, 2, vna_buffer); if (i2c_write( 0x0D, 2, vna_buffer)) lcd_putc('3'); else lcd_putc('x'); // vna_buffer[0] = 0xB0; // cmd: pointer command vna_buffer[1] = 0x82; // cmd: pointer command // i2c_write( 0x0D, 2, vna_buffer); // if (i2c_write( 0x0D, 2, vna_buffer)) lcd_putc('4'); else lcd_putc('x'); vna_buffer[0] = 0x01; FX2_Delay(50); i2c_write( 0x0D, 1, vna_buffer); FX2_Delay(50); i2c_write( 0x0D, 1, vna_buffer); FX2_Delay(50); i2c_write( 0x0D, 1, vna_buffer); FX2_Delay(50); vna_buffer[0] = 0xB0; // cmd: pointer command vna_buffer[1] = 0x82; // cmd: pointer command if (i2c_write( 0x0D, 2, vna_buffer)) lcd_putc('5'); else lcd_putc('x'); FX2_Delay(50); i2c_read(0x0D, 1, vna_buffer); lcd_gotoxy(0,7); lcd_putx2(vna_buffer[0]); */ } // ================================================================================================ // dump uvna registers // ================================================================================================ void dump(void) { // command lcd_gotoxy(0,1); lcd_puts("0x80: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x80; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); // status lcd_gotoxy(13,1); lcd_puts("0x8F: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x8F; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); // start freq lcd_gotoxy(0,2); lcd_puts("0x82: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x82; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); // increment lcd_gotoxy(0,3); lcd_puts("0x85: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x85; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); // steps lcd_gotoxy(0,4); lcd_puts("0x88: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x88; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); // settling lcd_gotoxy(0,5); lcd_puts("0x8A: ",6); vna_buffer[0] = 0xB0; vna_buffer[1] = 0x8A; fx2_i2c_write( 0x0D, 2, vna_buffer); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); fx2_i2c_read( 0x0D, 1, vna_buffer); lcd_putx2(vna_buffer[0]); }