DBSRX, I2C Interface Verification

I’m in the process of debugging my DBSRX driver, and have verified the
following:

  1. The GC1 input voltage from the aux_dac can be properly commanded.
    Verification was carried out by probing the GC1 pin on the Max2118 chip,
    and observing the voltage sweep from .75 to 2.6 Volts.

  2. The enable_refclk and set_refclk_divisor work. This was verified by
    probing the Xtal+ pin on the Max2118 chip, and observing the expected
    clock frequency based on the commanded divisor (4 MHz for a divisor
    value of 16).

  3. Read of Max2118 status. After a power cycle reading 2 bytes from the
    I2C interface reports back values of 64, and 127. Reading again results
    in values of 0 and 127 (the PWR status bit has been cleared).

Unfortunately nothing else is working. The charge pump calibration
procedure keeps failing due to the 3 ADC PLL bits being zero every time
I read the Max2118 status. I need to verify that the I2C write commands
are getting through to the Max2118. For the Max2118 3 bytes are written
over the I2C to write a single register, they are:

  1. (Device address<<1) + write bit
  2. Register address (0…5)
  3. Register value

I noticed that in the python code the first byte is left out, is this
taken care of by the FPGA? Has anyone tried to turn on the diagnostic
features of the Max2118 to get a clock signal out of the CNTOUT pin?
I’ve tried setting the DIAG value to 6 in order to output the result of
the R divider onto the CNTOUT pin, but when I probe the pin there is no
signal. Thanks for any clues.

On Thu, Feb 08, 2007 at 05:25:47PM -0500, Gregory W Heckler wrote:

I need to verify that the I2C write commands
are getting through to the Max2118. For the Max2118 3 bytes are written
over the I2C to write a single register, they are:

  1. (Device address<<1) + write bit
  2. Register address (0…5)
  3. Register value

I noticed that in the python code the first byte is left out, is this
taken care of by the FPGA?

Yes, that’s why you pass the i2c_addr to the write_i2c method, just
like the read_i2c method.

/*!

  • \brief Write to I2C peripheral
  • \param i2c_addr I2C bus address (7-bits)
  • \param buf the data to write
  • \returns true iff successful
  • Writes are limited to a maximum of of 64 bytes.
    */
    bool write_i2c (int i2c_addr, const std::string buf);

/*!

  • \brief Read from I2C peripheral
  • \param i2c_addr I2C bus address (7-bits)
  • \param len number of bytes to read
  • \returns the data read if successful, else a zero length string.
  • Reads are limited to a maximum of 64 bytes.
    */
    std::string read_i2c (int i2c_addr, int len);

Eric

Gregory W Heckler wrote:

value of 16).

  1. (Device address<<1) + write bit
  2. Register address (0…5)
  3. Register value

I noticed that in the python code the first byte is left out, is this
taken care of by the FPGA? Has anyone tried to turn on the diagnostic
features of the Max2118 to get a clock signal out of the CNTOUT pin?
I’ve tried setting the DIAG value to 6 in order to output the result
of the R divider onto the CNTOUT pin, but when I probe the pin there
is no signal. Thanks for any clues.

One other thing to keep in mind is that the PLL takes time to lock, so
you may need to wait before trying the next VCO.

Matt