6 years, 6 months ago.

Interfacing with MAX14750 on MAX32625PICO board

Hi,

The schematic (Figure 4 in MAX32625PICO Application Platform) shows that P3_4 and P3_5 of the MAX32625 on the pico board is attached to the MAX14750 power management IC. The pins on either end are I2C pins, and the 14750 datasheet shows that I2C is available on those pins. The board "Evaluates: MAX32625, MAX14750" so I2C communication with the 14750 is probably possible. There is no opportunity to add pullups to the board.

The schematic shows no pullup resistors, however the MAX32625 user guide I2C section (AN6350 section 7.2.1) states " External resistors (RP) are recommended to pull the lines to a logic-high state; internal pullups can also be used to start I²C buses with low capacitance". Unfortunately 7.2 has no further information on enabling pullups with the I2C peripheral.

I've tried using the pin_mode call to set PullUp on the pins (from pinmap.h) with no effect.

I've tried both 1.8 and vddIOH modes on the pins (https://developer.mbed.org/users/switches/code/max32625pico/): MAX32625PICO pico(MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_1V8, MAX32625PICO::VIO_1V8); pico.vddioh(I2C1_SDA, MAX32625PICO::VIO_IOH); pico.vddioh(I2C1_SCL, MAX32625PICO::VIO_IOH);

Sample code: void findPmic() { uint8_t txbuf[1]; txbuf[0] = 0x00; pin_mode(I2C1_SDA, PullUp); pin_mode(I2C1_SCL, PullUp); I2C pmicI2c(I2C1_SDA, I2C1_SCL); pmicI2c.frequency(100000); for (uint8_t addr = 0; addr < 254; addr += 2) { if (pmicI2c.write(addr, (char*)&txbuf, 1) < 0) { serial.printf("%02X: found MAX14750\r\n", addr); } else { serial.printf("%02X ", addr); } pmicI2c.stop(); } serial.printf("\r\n"); }

To provide a little more context:

Mbed platform page: https://os.mbed.com/platforms/MAX32625PICO/

Max32625pico datasheet and schematic: https://datasheets.maximintegrated.com/en/ds/MAX32625PICO.pdf

Max14750 datasheet: https://datasheets.maximintegrated.com/en/ds/MAX14720-MAX14750.pdf

Max32625 user guide: https://pdfserv.maximintegrated.com/en/an/AN6350.pdf

And the code that I have above:

void findPmic() {
    uint8_t txbuf[1] = {};
    I2C pmicI2c(I2C1_SDA, I2C1_SCL);  // These map to P3_4 and P3_5
    pin_mode(I2C1_SDA, PullUp);
    pin_mode(I2C1_SCL, PullUp);
    pmicI2c.frequency(1000);  // Slow bus in case of capacitance issues
    // Scan every address for a response, the actual address is in the datasheet
    for (uint8_t addr = 0; addr < 254; addr += 2) {
        // Request register 0.
        // Also tried without the , true and stop().
        if (pmicI2c.write(addr, (char*)&txbuf, 1, true) < 0) {
            serial.printf("%02X: found MAX14750\r\n", addr);
        } else {
            serial.printf("%02X ", addr);
        }
        pmicI2c.stop();
    }
    serial.printf("\r\n");
}
posted by Sean Burford 08 Nov 2017

I've created a solution using the weak internal pullups since the GPIO pullups didn't seem to help: https://os.mbed.com/users/seanburford/code/i2c_pullup/file/a6d2db32f84e/main.cpp/

posted by Sean Burford 28 Nov 2017
Be the first to answer this question.