This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

LMX2571: FSK modulation

Part Number: LMX2571
Other Parts Discussed in Thread: MSP430F5659

Hi there!

I'm currently struggling with LMX2571 in my project. (using msp430f5659 and CCS)

What I want to do is make a 2 level FSK modulation with LMX2571 with 20mhz span. (Center freq : 30mhz, delta frequency : 10mhz).

So I set several variables to get 30mhz carrier frequency. The followings are the parameters I set.

(I'm gonna call the parameter names according to LMX2571 datasheet 'Figure 63.') 

OSCin : 20Mhz

Pre-Div : 1

MULT : 5

PDF (Phase detector freq.) : 100Mhz

VCO : 4800Mhz

Prescaler : 2

N : 24

CHDIV1 : 32

CHDIV2 : 5

OUTPUT : 30Mhz

Therefore, according to 'Equation 4' in LMX2571 datasheet, the FSK step value can be calculated as follow.

Positive Swing = (f_DEV * DEN/f_PD)*(CHDIV1*CHDIV2/Prescaler)  (Where f_DEV = 10Mhz)

= (10*10^6*2^24/100*10^6)*(32*5/2) = 134217728=2^27   (Assume synthesizer mode)

Thus, FSK_DEV0 should be 2^27 but the resolution is only 2^16 according to the size of the register.

Alternatively, I have considered to use F1, F2 as 20mhz, 40mhz respectively and switch them as FSK modulation. (For example, bit 1 = F1(20mhz), bit 0 = F2(40mhz))

However, the switching time takes too long to use it as FSK modulation.

Is there any way to use this product to do 2-level 20mhz, 40mhz FSK modulation with high data rate?

Thanks

Jongchan Woo

  • Hi Jongchan,
    FSK mode would not work as your total output divider value is too big. Total divider value = 3x32 = 160. A 20MHz change at output means a 3.2GHz change at VCO, which is not possible.
    However, I think F1F2 switching is the right approach. What is your FSK bit rate? You can use the TrCtl pin to do switching, the switching time should be very short.
  • Thanks a lot Noel

    I need at least 10k FSK bit rate. Is it possible to achieve this rate?

    Plus, I have another question. I have been trying to switch from F1 to F2 by toggling TrCtl pin as you mentioned, What register should I write and how?

    What I'm trying to do now is writing 0x0002 + FCAL_EN_ENABLE + F1F2_SEL_F1 + F1F2_MODE_ENABLE + F1F2_CTRL_EXT + F1F2_INIT_RECAL + RXTX_POL_AH + RXTX_CTRL_EXT ( 0b0000110110000011) in R0 register. Also set OUTBUF_TX_EN_F2 to 0, OUTBUF_RX_EN_F2 to 1 in R23 register and OUTBUF_TX_EN_F1 to 1 and OUTBUF_RX_EN_F1 to 0.

    Thus when I set TrCtl value to 1, I want to send F1 through TX and if TrCtl value is 0, send F2 through RX. However, it does not work. Can you tell me what is the problem?

    Thanks

    Jongchan

  • Hi Jongchan,

    I just realize that the only difference in register setting between 20MHz and 40MHz output is CHDIV2. So maybe the simplest way to toggle between these frequencies is keep refreshing the CHDIV2 register bit. You don't need F1, F2 switching or FSK mode.
    When VCO = 5120MHz, CHDIV = 4 x 64 will output 20MHz while CHDIV = 4 x 32 will output 40MHz. The change will be effective immediately after SPI programming, so the switching speed between frequencies is very fast. This method can support very high FSK rate.

    If you want F1F2 switching, here is the configuration.
    Set R0[8] F1F2_CTRL to 1, this means use TrCtl pin to toggle F1 and F2.
    Set R0[7] F1F2_MODE to 1, this will enable F1F1 mode.
    Set R0[11] RXTX_CTRL to 1, this means use TrCtl pin to toggle TX and RX port.
    Set R0[10] RXTX_POL to 1, this means when TrCtl pin is HIGH, TX port is active.
    Set R7[7] OUTBUF_TX_EN_F1 to 1, this will assign F1 register set to use TX port.
    Set R23[6] OUTBUF_RX_EN_F2 to 1, this will assign F2 register set to use RX port.
    Please note whenever we do F1F2 switching, the VCO will be calibrated. So it takes some time to settle to the final frequency. I guess this settling time is around 20us.
  • Thanks Noel

    I'm sorry for asking more questions but I realized that the FSK bit rate should be around 100k. Is it still possible to achieve it?

    Also you suggested two methods for FSK modulation. Which one do you think is faster among these two? What I think is the second F1F2 switching method is faster than just writing register value again as the first one.

    Another problem is that I'm currently using msp430f5659 to make use of lmx2571, connecting pin 4.2 to TrCtl. I just set all the register value of R0, R7, R23 as you mentioned and tried to change the pin 4.2 value from 1 to 0 (as setting P4OUT &= ~BIT2 in ccs) and found nothing. What do you think is the problem here?

    Plus)

    I wonder how TI got the graph of data such as figure 66 and 67 in lmx2571 datasheet. I want to check how long does it take to change the frequency between F1 and F2 or change it by writing register. Is there any specific tool or machine for it?

  • Is it possible to use Only TX using both F1 and F2? The current setting you suggested me is that F1 is transmitted through TX and F2 is transmitted through RX (Which does not work in my system...). However, I wonder if it is possible to transmit both F1 and F2 through TX.
  • Hi Jongchan,

    100kHz FSK rate is too fast for F1F2 mode. I just checked, with your application configuration, the switching time using F1F2 mode is 1X us, which is even longer than the FSK rate. However, the switching time for CHDIV2 is super fast, I can't measure it very accurately.
    So programming CHDIV2 gets you the shortest switching (response) time. However, SPI programming speed needs to be high enough as well. For 10MHz SPI rate, the write time is 2.4us already.
    We use Agilent E5052B to measure the switching time.
  • Thanks Noel,

    I really appreciate your help. I'm gonna re-write register as you suggested. What I wonder is how to write register again with a certain amount of time. For example, you mentioned that for 

    10Mhz SPI rate the write time is 2.4us. If I want to make 100K bps FSK so that the transient time should be 5us. How can I control this time? In addition, What should I do if I want to achieve the maximum rate?

    I currently using msp430f5659 device using code composer studio 6.1.1

    and I write register value using following function

    void LMX2571_Reg_Write (unsigned char reg_address, unsigned short data)

    {

    volatile unsigned char dummy_rx;

    P4OUT &= ~BIT3; //Set STE Low for Transmission

    UCA2TXBUF = (unsigned char)(reg_address); // Send the first byte to the TX Buffer: Address of register

    while ( (UCA2STAT & UCBUSY) ); // USCI_B1 TX buffer ready?

    dummy_rx = UCA2RXBUF; // Dummy Read Rx buf

    UCA2TXBUF = (unsigned char)(data >>8); // Send the second byte to the TX Buffer: Data[23:16]

    while ( (UCA2STAT & UCBUSY) ); // USCI_B1 TX buffer ready?

    dummy_rx = UCA2RXBUF; // Dummy Read Rx buf

    UCA2TXBUF = (unsigned char)(data & 0x00FF); // Send the third byte to the TX Buffer: Data[15:8]

    while ( (UCA2STAT & UCBUSY) ); // USCI_B1 TX buffer ready?

    dummy_rx = UCA2RXBUF; // Dummy Read Rx buf

    P4OUT |= BIT3; // SEN HIGH at end of transmission

    __delay_cycles(100000);

    }

    Can you make any suggestion for achieving specific time control for FSK?

    Another question is that I also want to do OOK modulation with 20Mhz signal. (e.g. bit 1 = 20Mhz signal, bit 0 = no signal). What I think I should do is turn on and off the signal in order to make some bits. What is the most effective way to achieve this modulation? How can I turn off and on the signal in a small amount of time? The target bit rate is similar with that of FSK.

    Best regards,

    Jongchan Woo

  • Hi Jongchan,
    I am not familiar with software, I am not able to comment your code.
    Maybe I can explain a little bit more on the programming speed.
    Since a register is 24-bit long, to write a register we need 24 SPI clock cycle. If SPI is running at 10MHz, then we will need 2.4us to write a register. Obviously, this is too long in your application as the FSK rate is 100kHz.
    If you can make the SPI running at 50MHz, it will only take 0.48us to change the CHDIV2 value, I think this will not hurt your system.
    Similarly, for OOK application, you can toggle the R7[7] OUTBUF_EN_TX register bit to enable or disable the output buffer.