Toets structs
Dependencies: mbed
main.cpp@0:9959d360b987, 2019-04-05 (annotated)
- Committer:
- RobGrimmer
- Date:
- Fri Apr 05 12:19:37 2019 +0000
- Revision:
- 0:9959d360b987
Vir Mertin
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobGrimmer | 0:9959d360b987 | 1 | /* |
RobGrimmer | 0:9959d360b987 | 2 | Author: Jan Conradie |
RobGrimmer | 0:9959d360b987 | 3 | Date: 09-04-2019 |
RobGrimmer | 0:9959d360b987 | 4 | |
RobGrimmer | 0:9959d360b987 | 5 | The following software is written specifically for the Lochtron Local Oscillator using the LMX2954 chip. |
RobGrimmer | 0:9959d360b987 | 6 | The PCB in question is documented as LLO_20G_100u. |
RobGrimmer | 0:9959d360b987 | 7 | |
RobGrimmer | 0:9959d360b987 | 8 | The following libraries are PCB specific: |
RobGrimmer | 0:9959d360b987 | 9 | Attenuator library |
RobGrimmer | 0:9959d360b987 | 10 | AM2005_ATTEN.h |
RobGrimmer | 0:9959d360b987 | 11 | AM2005_ATTEN.c |
RobGrimmer | 0:9959d360b987 | 12 | |
RobGrimmer | 0:9959d360b987 | 13 | LED, RF switches and power line control library |
RobGrimmer | 0:9959d360b987 | 14 | DIGITAL_CTRL.h |
RobGrimmer | 0:9959d360b987 | 15 | DIGITAL_CTRL.c |
RobGrimmer | 0:9959d360b987 | 16 | |
RobGrimmer | 0:9959d360b987 | 17 | The following libraries are meant to be portable to other projects: |
RobGrimmer | 0:9959d360b987 | 18 | Synthesiser library |
RobGrimmer | 0:9959d360b987 | 19 | LMX2594_PLL.h |
RobGrimmer | 0:9959d360b987 | 20 | LMX2594_PLL.c |
RobGrimmer | 0:9959d360b987 | 21 | |
RobGrimmer | 0:9959d360b987 | 22 | EEPROM library |
RobGrimmer | 0:9959d360b987 | 23 | 25LC1024_EEP.h |
RobGrimmer | 0:9959d360b987 | 24 | 25LC1024_EEP.c |
RobGrimmer | 0:9959d360b987 | 25 | |
RobGrimmer | 0:9959d360b987 | 26 | */ |
RobGrimmer | 0:9959d360b987 | 27 | |
RobGrimmer | 0:9959d360b987 | 28 | //Include libraries |
RobGrimmer | 0:9959d360b987 | 29 | #include "mbed.h" |
RobGrimmer | 0:9959d360b987 | 30 | #include "main.h" |
RobGrimmer | 0:9959d360b987 | 31 | #include "math.h" |
RobGrimmer | 0:9959d360b987 | 32 | #include "stdlib.h" |
RobGrimmer | 0:9959d360b987 | 33 | #include "LMX2594_PLL.h" |
RobGrimmer | 0:9959d360b987 | 34 | //#include "AM2005_ATTEN.h" |
RobGrimmer | 0:9959d360b987 | 35 | //#include "DIGITAL_CTRL.h" |
RobGrimmer | 0:9959d360b987 | 36 | |
RobGrimmer | 0:9959d360b987 | 37 | |
RobGrimmer | 0:9959d360b987 | 38 | //#include "25LC1024_EEP.h" |
RobGrimmer | 0:9959d360b987 | 39 | |
RobGrimmer | 0:9959d360b987 | 40 | //Initialise serial port. |
RobGrimmer | 0:9959d360b987 | 41 | Serial sbus(MBED_SBUS_TX,MBED_SBUS_RX); //SBUS conneciton |
RobGrimmer | 0:9959d360b987 | 42 | Serial USB(USBTX , USBRX); // USB to serial connection from the PC to the Mbed |
RobGrimmer | 0:9959d360b987 | 43 | //Serial uart(MBED_REG_TX,MBED_SBUS_RX); //Regular UART |
RobGrimmer | 0:9959d360b987 | 44 | |
RobGrimmer | 0:9959d360b987 | 45 | |
RobGrimmer | 0:9959d360b987 | 46 | //Initialise IOs: |
RobGrimmer | 0:9959d360b987 | 47 | |
RobGrimmer | 0:9959d360b987 | 48 | //Digital Out |
RobGrimmer | 0:9959d360b987 | 49 | DigitalOut DOUBLER_EN(MBED_DD_EN); |
RobGrimmer | 0:9959d360b987 | 50 | DigitalOut OSC_EN(MBED_OSC_EN); |
RobGrimmer | 0:9959d360b987 | 51 | DigitalOut AMP1_EN(MBED_AMP1_EN); |
RobGrimmer | 0:9959d360b987 | 52 | DigitalOut AMP2_EN(MBED_AMP2_EN); |
RobGrimmer | 0:9959d360b987 | 53 | |
RobGrimmer | 0:9959d360b987 | 54 | DigitalOut ATT_PIN_A(MBED_ATT_A); |
RobGrimmer | 0:9959d360b987 | 55 | DigitalOut ATT_PIN_B(MBED_ATT_B); |
RobGrimmer | 0:9959d360b987 | 56 | DigitalOut ATT_PIN_C(MBED_ATT_C); |
RobGrimmer | 0:9959d360b987 | 57 | DigitalOut ATT_PIN_D(MBED_ATT_D); |
RobGrimmer | 0:9959d360b987 | 58 | DigitalOut ATT_PIN_E(MBED_ATT_E); |
RobGrimmer | 0:9959d360b987 | 59 | |
RobGrimmer | 0:9959d360b987 | 60 | DigitalOut LED_PCB(MBED_LED1); |
RobGrimmer | 0:9959d360b987 | 61 | DigitalOut LED_STATUS_GREEN(MBED_LED2); |
RobGrimmer | 0:9959d360b987 | 62 | DigitalOut LED_STATUS_RED(MBED_LED3); |
RobGrimmer | 0:9959d360b987 | 63 | |
RobGrimmer | 0:9959d360b987 | 64 | DigitalOut SW1(MBED_SW1); |
RobGrimmer | 0:9959d360b987 | 65 | DigitalOut MSW1(MBED_MSW1); |
RobGrimmer | 0:9959d360b987 | 66 | DigitalOut MSW2(MBED_MSW2); |
RobGrimmer | 0:9959d360b987 | 67 | |
RobGrimmer | 0:9959d360b987 | 68 | //LMX Debug IO (Digital Inputs) |
RobGrimmer | 0:9959d360b987 | 69 | DigitalIn RDIR_LMX(MBED_RDIR_SYNTH); |
RobGrimmer | 0:9959d360b987 | 70 | DigitalIn RCLK_LMX(MBED_RCLK_SYNTH); |
RobGrimmer | 0:9959d360b987 | 71 | |
RobGrimmer | 0:9959d360b987 | 72 | //Analogue Inputs |
RobGrimmer | 0:9959d360b987 | 73 | AnalogIn ADC_TEMP_LMX(MBED_TEMP_LMX); |
RobGrimmer | 0:9959d360b987 | 74 | AnalogIn ADC_PEAK_DET(MBED_PEAK_DET_IN); |
RobGrimmer | 0:9959d360b987 | 75 | |
RobGrimmer | 0:9959d360b987 | 76 | //DAC Output |
RobGrimmer | 0:9959d360b987 | 77 | AnalogOut DAC_OSC(MBED_DAC); |
RobGrimmer | 0:9959d360b987 | 78 | |
RobGrimmer | 0:9959d360b987 | 79 | //SPI PIN initialise for LMX2594 |
RobGrimmer | 0:9959d360b987 | 80 | DigitalOut CS_LMX(MBED_CSB_LMX); |
RobGrimmer | 0:9959d360b987 | 81 | DigitalOut CLK_LMX(MBED_CLK_LMX); |
RobGrimmer | 0:9959d360b987 | 82 | DigitalOut MOSI_LMX(MBED_MOSI_LMX); |
RobGrimmer | 0:9959d360b987 | 83 | DigitalIn MUX_LMX(MBED_MUX_SYNTH); //MISO |
RobGrimmer | 0:9959d360b987 | 84 | |
RobGrimmer | 0:9959d360b987 | 85 | |
RobGrimmer | 0:9959d360b987 | 86 | |
RobGrimmer | 0:9959d360b987 | 87 | int main() |
RobGrimmer | 0:9959d360b987 | 88 | { |
RobGrimmer | 0:9959d360b987 | 89 | |
RobGrimmer | 0:9959d360b987 | 90 | // Variables |
RobGrimmer | 0:9959d360b987 | 91 | |
RobGrimmer | 0:9959d360b987 | 92 | //unsigned short PLL_REG[113] = {0}; //Create main SPI register |
RobGrimmer | 0:9959d360b987 | 93 | |
RobGrimmer | 0:9959d360b987 | 94 | //Setup serial ports |
RobGrimmer | 0:9959d360b987 | 95 | USB.baud(115200); |
RobGrimmer | 0:9959d360b987 | 96 | sbus.baud(115200); |
RobGrimmer | 0:9959d360b987 | 97 | //uart.baud(115200); |
RobGrimmer | 0:9959d360b987 | 98 | |
RobGrimmer | 0:9959d360b987 | 99 | // Wait for board startup |
RobGrimmer | 0:9959d360b987 | 100 | wait(1); |
RobGrimmer | 0:9959d360b987 | 101 | LMX2594_Load_Defaults(LM2594_PLL_reg); //Load LMX2594 default register values |
RobGrimmer | 0:9959d360b987 | 102 | |
RobGrimmer | 0:9959d360b987 | 103 | Startup_Splash(); |
RobGrimmer | 0:9959d360b987 | 104 | |
RobGrimmer | 0:9959d360b987 | 105 | //Device ready to use |
RobGrimmer | 0:9959d360b987 | 106 | while(1) |
RobGrimmer | 0:9959d360b987 | 107 | { |
RobGrimmer | 0:9959d360b987 | 108 | //Set_FrequencyA(7000.10); //Euraka when possible |
RobGrimmer | 0:9959d360b987 | 109 | |
RobGrimmer | 0:9959d360b987 | 110 | } |
RobGrimmer | 0:9959d360b987 | 111 | |
RobGrimmer | 0:9959d360b987 | 112 | } |
RobGrimmer | 0:9959d360b987 | 113 | |
RobGrimmer | 0:9959d360b987 | 114 | void Startup_Splash(void) |
RobGrimmer | 0:9959d360b987 | 115 | { |
RobGrimmer | 0:9959d360b987 | 116 | if(DEBUG) |
RobGrimmer | 0:9959d360b987 | 117 | { |
RobGrimmer | 0:9959d360b987 | 118 | USB.printf("LLO_20G_100u Starting up\r\n"); |
RobGrimmer | 0:9959d360b987 | 119 | USB.printf("Software version 1.0\r\n"); |
RobGrimmer | 0:9959d360b987 | 120 | } |
RobGrimmer | 0:9959d360b987 | 121 | |
RobGrimmer | 0:9959d360b987 | 122 | } |
RobGrimmer | 0:9959d360b987 | 123 | |
RobGrimmer | 0:9959d360b987 | 124 | void LMX2594_Spi_Write(char address, unsigned short data) |
RobGrimmer | 0:9959d360b987 | 125 | { |
RobGrimmer | 0:9959d360b987 | 126 | CS_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 127 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 128 | MOSI_LMX.write(0); //Set R/W bit to 0 for write |
RobGrimmer | 0:9959d360b987 | 129 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 130 | |
RobGrimmer | 0:9959d360b987 | 131 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 132 | CLK_LMX.write(1); //Complete first bit transmission |
RobGrimmer | 0:9959d360b987 | 133 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 134 | |
RobGrimmer | 0:9959d360b987 | 135 | char address_length = 7; // Adapt data type to be the correct bit length |
RobGrimmer | 0:9959d360b987 | 136 | unsigned short data_length = 16; |
RobGrimmer | 0:9959d360b987 | 137 | |
RobGrimmer | 0:9959d360b987 | 138 | for(int l = address_length-1; l >= 0; l--) //Start at the second MSB |
RobGrimmer | 0:9959d360b987 | 139 | { |
RobGrimmer | 0:9959d360b987 | 140 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 141 | MOSI_LMX = (address>> l) & 0x01; //Shift bits through from MSB |
RobGrimmer | 0:9959d360b987 | 142 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 143 | CLK_LMX.write(1); |
RobGrimmer | 0:9959d360b987 | 144 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 145 | } |
RobGrimmer | 0:9959d360b987 | 146 | |
RobGrimmer | 0:9959d360b987 | 147 | for(int l = data_length-1; l >= 0; l--) |
RobGrimmer | 0:9959d360b987 | 148 | { |
RobGrimmer | 0:9959d360b987 | 149 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 150 | MOSI_LMX = (data>> l) & 0x01; //Shift bits through from MSB |
RobGrimmer | 0:9959d360b987 | 151 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 152 | CLK_LMX.write(1); |
RobGrimmer | 0:9959d360b987 | 153 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 154 | } |
RobGrimmer | 0:9959d360b987 | 155 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 156 | CS_LMX.write(1); //End transaction |
RobGrimmer | 0:9959d360b987 | 157 | } |
RobGrimmer | 0:9959d360b987 | 158 | |
RobGrimmer | 0:9959d360b987 | 159 | |
RobGrimmer | 0:9959d360b987 | 160 | int LMX2594_Spi_Read(char address) |
RobGrimmer | 0:9959d360b987 | 161 | { |
RobGrimmer | 0:9959d360b987 | 162 | CS_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 163 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 164 | |
RobGrimmer | 0:9959d360b987 | 165 | MOSI_LMX.write(1); //Set R/W bit to 1 for read. |
RobGrimmer | 0:9959d360b987 | 166 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 167 | |
RobGrimmer | 0:9959d360b987 | 168 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 169 | CLK_LMX.write(1); //Complete first bit transmission |
RobGrimmer | 0:9959d360b987 | 170 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 171 | char address_length = 7; // Adapt data type to be the correct bit length |
RobGrimmer | 0:9959d360b987 | 172 | unsigned short data_length = 16; |
RobGrimmer | 0:9959d360b987 | 173 | int spi_data_value = 0; // Adapt data type to be the correct bit length |
RobGrimmer | 0:9959d360b987 | 174 | |
RobGrimmer | 0:9959d360b987 | 175 | |
RobGrimmer | 0:9959d360b987 | 176 | for(int l = address_length-1; l >= 0; l--) //Start at the second MSB |
RobGrimmer | 0:9959d360b987 | 177 | { |
RobGrimmer | 0:9959d360b987 | 178 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 179 | MOSI_LMX = (address>> l) & 0x01; //Shift bits through from MSB |
RobGrimmer | 0:9959d360b987 | 180 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 181 | CLK_LMX.write(1); |
RobGrimmer | 0:9959d360b987 | 182 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 183 | } |
RobGrimmer | 0:9959d360b987 | 184 | |
RobGrimmer | 0:9959d360b987 | 185 | for(int l = data_length-1; l >= 0; l--) |
RobGrimmer | 0:9959d360b987 | 186 | { |
RobGrimmer | 0:9959d360b987 | 187 | CLK_LMX.write(0); |
RobGrimmer | 0:9959d360b987 | 188 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 189 | spi_data_value = spi_data_value + (MUX_LMX.read() << l); |
RobGrimmer | 0:9959d360b987 | 190 | CLK_LMX.write(1); |
RobGrimmer | 0:9959d360b987 | 191 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 192 | } |
RobGrimmer | 0:9959d360b987 | 193 | |
RobGrimmer | 0:9959d360b987 | 194 | CS_LMX.write(1); //End transaction |
RobGrimmer | 0:9959d360b987 | 195 | wait_us(SPI_CLK_SPEED); //delay is determined by slave device |
RobGrimmer | 0:9959d360b987 | 196 | |
RobGrimmer | 0:9959d360b987 | 197 | return spi_data_value; |
RobGrimmer | 0:9959d360b987 | 198 | } |
RobGrimmer | 0:9959d360b987 | 199 | |
RobGrimmer | 0:9959d360b987 | 200 | void LMX2594_Read_All_Registers(void) |
RobGrimmer | 0:9959d360b987 | 201 | { |
RobGrimmer | 0:9959d360b987 | 202 | //Ensure that LMX2594 MUX pin is in read mode |
RobGrimmer | 0:9959d360b987 | 203 | char spi_address = 0x00; |
RobGrimmer | 0:9959d360b987 | 204 | unsigned short spi_data = 0x2518; |
RobGrimmer | 0:9959d360b987 | 205 | LMX2594_Spi_Write(spi_address, spi_data); |
RobGrimmer | 0:9959d360b987 | 206 | |
RobGrimmer | 0:9959d360b987 | 207 | char read_address = 0x70; //112 |
RobGrimmer | 0:9959d360b987 | 208 | //Read all registers |
RobGrimmer | 0:9959d360b987 | 209 | for(int c=112; c>=0; c--) |
RobGrimmer | 0:9959d360b987 | 210 | { |
RobGrimmer | 0:9959d360b987 | 211 | USB.printf("Register[%d] = %x\r\n",c,LMX2594_Spi_Read(read_address)); |
RobGrimmer | 0:9959d360b987 | 212 | read_address--; |
RobGrimmer | 0:9959d360b987 | 213 | } |
RobGrimmer | 0:9959d360b987 | 214 | } |