1 #include "LMS7002_REGx51.h" 2 #include "spi.h" 3 #include "lms7002m_calibrations.h" 4 #include "lms7002m_filters.h" 5 #include "LMS7002M_parameters_compact.h" 6 #include "lms7002m_controls.h" 7 8 #include "typedefs.h" 9 10 bool stopProcedure = false; 11 bool hasStopped = true; 12 bool runProcedure = false; 13 uint8_t currentInstruction; 14 extern float_type RefClk; 15 extern float_type bandwidthRF; 16 extern uint8_t extLoopbackPair; 17 #define MCU_PARAMETER_ADDRESS 0x002D //register used to pass parameter values to MCU 18 19 #define INPUT_COUNT 3 20 uint8_t inputRegs[INPUT_COUNT]; 21 22 enum 23 { 24 MCU_WORKING = 0xFF, 25 MCU_IDLE = 0x00, 26 }; 27 28 /** @brief Reads reference clock from LMS register 29 */ UpdateFreq(bool refClk)30void UpdateFreq(bool refClk) 31 { 32 const float freq = 1e6*(inputRegs[0] + ((((uint16_t)inputRegs[1] << 8) | inputRegs[2]) / 1000.0)); //integer part MHz 33 if(refClk) 34 RefClk = freq; 35 else 36 bandwidthRF = freq; 37 P1 = MCU_IDLE; 38 } 39 ext2_int()40void ext2_int() interrupt 7 41 { 42 uint8_t i; 43 P1 = MCU_WORKING; 44 for(i=INPUT_COUNT-1; i>0; --i) 45 inputRegs[i] = inputRegs[i-1]; 46 inputRegs[0] = P0; 47 P1 = MCU_IDLE; 48 } 49 ext3_int()50void ext3_int() interrupt 8 51 { 52 P1 = MCU_WORKING; 53 currentInstruction = P0; 54 stopProcedure = true; 55 runProcedure = true; 56 } 57 58 const uint16_t proxyRegAddr = 0x002D; 59 const uint16_t proxyWrValue = 0x020C; 60 const uint16_t proxyRdValue = 0x040B; 61 ProxyWrite()62uint8_t ProxyWrite() 63 { 64 uint16_t addr; 65 uint16_t wrValue; 66 P1 = MCU_WORKING; 67 addr = SPI_read(proxyRegAddr); 68 wrValue = SPI_read(proxyWrValue); 69 SPI_write_slow(addr, wrValue); 70 return MCU_IDLE; 71 } 72 ProxyRead()73uint8_t ProxyRead() 74 { 75 uint16_t addr; 76 uint16_t rdValue; 77 P1 = MCU_WORKING; 78 addr = SPI_read(proxyRegAddr); 79 rdValue = SPI_read_slow(addr); 80 SPI_write(proxyRdValue, rdValue); 81 return MCU_IDLE; 82 } 83 84 /* 85 P1[7] : 0-MCU idle, 1-MCU_working 86 P1[6:0] : return status (while working = 0x3F) 87 */ main()88void main() //main routine 89 { 90 SP=0xD0; // Set stack pointer 91 DIR0=0x00; // ;DIR0 - Configure P0 as all inputs 92 DIR1=0xFF; // ;DIR1 - Configure P1 as all outputs 93 P1 = MCU_IDLE; 94 DIR2=0x07; // ;DIR2 - Configure P2_3 is input 95 IEN1=0xFF;//0x04; //EX2=1 enable external interrupt 2 96 IEN0=0x80; 97 TMOD = 0x01; // timer0 16-bit 98 99 ucSCLK=0; //repairs external SPI 100 ucSEN=1;// 101 102 //P1 returns MCU status 103 while(1) 104 { 105 if(runProcedure) 106 { 107 switch(currentInstruction) 108 { 109 case 0: 110 runProcedure = false; 111 while(!hasStopped); 112 113 P1 = MCU_IDLE; 114 break; 115 case 1: //CalibrateTx 116 P1 = MCU_IDLE | CalibrateTx(false); 117 break; 118 case 2: //CalibrateRx 119 P1 = MCU_IDLE | CalibrateRx(false, false); 120 break; 121 case 3: 122 UpdateFreq(0); 123 //UpdateBW(); 124 break; 125 case 4: //update ref clk 126 //UpdateReferenceClock(); 127 UpdateFreq(1); 128 break; 129 case 5: 130 P1 = TuneRxFilter(bandwidthRF); 131 break; 132 case 6: 133 P1 = TuneTxFilter(bandwidthRF); 134 break; 135 case 7: 136 P1 = ProxyWrite(); 137 break; 138 case 8: 139 P1 = ProxyRead(); 140 break; 141 case 9: 142 extLoopbackPair = inputRegs[0]; 143 P1 = MCU_IDLE; 144 break; 145 case 10: 146 P1 = MCU_IDLE; 147 stopProcedure = false; 148 P1 = RunAGC(((uint32_t)SPI_read(MCU_PARAMETER_ADDRESS))<<2); 149 break; 150 case 17: //CalibrateTx 151 P1 = MCU_IDLE | CalibrateTx(true); 152 break; 153 case 18: //CalibrateRx 154 P1 = MCU_IDLE | CalibrateRx(true, false); 155 break; 156 case 255: //return program ID 157 P1 = 0x05; 158 break; 159 160 } 161 runProcedure = false; 162 } 163 } 164 } 165 166