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)30 void 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()40 void 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()50 void 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()62 uint8_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()73 uint8_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()88 void 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