Sean Burford / i2c_pullup

Dependencies:   max32625pico maxim-dev mbed-rtos USBDevice

Fork of PICO_USB_I2C_SPI by Greg Steiert

Revision:
17:43cc59f768af
Parent:
16:847788f907eb
Child:
19:1a13f0c067b1
--- a/main.cpp	Fri Nov 24 05:37:12 2017 +0000
+++ b/main.cpp	Tue Nov 28 05:56:36 2017 +0000
@@ -5,6 +5,9 @@
 #include "max32625pico.h"
 #include "pwrman_regs.h"
 
+#include "USBSerial.h"
+USBSerial serial;
+
 static DigitalOut rLED(LED1);
 static DigitalOut gLED(LED2);
 static DigitalOut bLED(LED3);
@@ -20,7 +23,7 @@
     }
     if (result == E_NO_ERROR) {
         MXC_PWRMAN->wud_ctrl = MXC_F_PWRMAN_WUD_CTRL_CTRL_ENABLE;
-        MXC_PWRMAN->wud_ctrl |= (port * 8) + pin;  // Pad select
+        MXC_PWRMAN->wud_ctrl |= (port << 3) + pin;  // Pad select
         MXC_PWRMAN->wud_ctrl &= ~(MXC_F_PWRMAN_WUD_CTRL_PAD_MODE);
         MXC_PWRMAN->wud_ctrl |= (MXC_E_PWRMAN_PAD_MODE_WEAK_HI_LO <<
                                  MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
@@ -31,6 +34,84 @@
     return result;
 }
 
+typedef enum {
+    UNKNOWN,
+    MAX14720A,
+    MAX14720B,
+    MAX14720C,
+    MAX14720D,
+    MAX14750A,
+    MAX14750B,
+    MAX14750C
+} chip_t;
+
+void showRegisters(char* regs) {
+    int i;
+    for (i = 0; i < 0x20; i++) {
+        serial.printf("%02X ", regs[i]);
+    }
+    serial.printf("\r\n");
+    if (regs[0] != 0x01) return;
+    chip_t chipType = UNKNOWN;
+    if (regs[6] == 0xC0) {
+        switch(regs[7]) {
+        case 0x08: chipType = MAX14750A; break;
+        case 0x20: chipType = MAX14750B; break;
+        case 0x0A: chipType = MAX14750C; break;
+        default: break;
+        }
+    } else if (regs[6] == 0xE0) {
+        bool aOrB = false;
+        switch(regs[9]) {
+        case 0xA7: aOrB = true; break;
+        case 0x07: chipType = MAX14720C; break;
+        case 0x47: chipType = MAX14720D; break;
+        default: break;
+        }
+        if (aOrB) {
+            if (regs[0x0B] == 0x80) {
+                chipType = MAX14720A;
+            } else if (regs[0x0B] == 0xE1) {
+                chipType = MAX14720B;
+            }
+        }
+    }
+    switch(chipType) {
+    case MAX14750A: serial.printf("MAX14750A\r\n"); break;
+    case MAX14750B: serial.printf("MAX14750B\r\n"); break;
+    case MAX14750C: serial.printf("MAX14750C\r\n"); break;
+    case MAX14720A: serial.printf("MAX14720A\r\n"); break;
+    case MAX14720B: serial.printf("MAX14720B\r\n"); break;
+    case MAX14720C: serial.printf("MAX14720C\r\n"); break;
+    case MAX14720D: serial.printf("MAX14720D\r\n"); break;
+    }
+    if ((chipType == MAX14750A) || (chipType == MAX14750B) ||
+        (chipType == MAX14750C)) {
+        serial.printf("SWIN: %s\r\n", regs[0x1B] & 8? "high": "low");
+        serial.printf("HVEN: %s\r\n", regs[0x1B] & 4? "high": "low");
+        serial.printf("BEN:  %s\r\n", regs[0x1B] & 2? "high": "low");
+        serial.printf("LEN:  %s\r\n", regs[0x1B] & 1? "high": "low");
+    }
+}
+
+void readMax14750Regs(I2C* i2c) {
+    const int addr = 0x54;
+    char buf[0x20] = {};
+    // Request register 0.
+    buf[0] = 0x00;
+    bool writeFailed = i2c->write(addr, (char*)&buf, 1, false);
+    if (writeFailed) {
+        serial.printf("i2c write 0x54 failed\r\n");
+        return;
+    }
+    // Read 32 register values.
+    if (i2c->read(addr + 1, (char*)(&buf[0]), 0x20, false) != 0) {
+        serial.printf("i2c read 0x55 failed\r\n");
+        return;
+    }
+    showRegisters(buf);
+}
+
 int main()
 {
     rLED = LED_ON;
@@ -40,22 +121,18 @@
     MAX32625PICO pico(
         MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_IOH, MAX32625PICO::VIO_IOH);
 
-    gpioAlternatePullup(P1_6);
-    gpioAlternatePullup(P1_7);
+    gpioAlternatePullup(P3_4);
+    gpioAlternatePullup(P3_5);
 
-    I2C i2c(P1_6, P1_7);
+    I2C i2c(P3_4, P3_5);
     i2c.frequency(100000);
 
     rLED = LED_OFF;
     gLED = LED_OFF;
 
-    char dbuf[32];
     while(1) {
-        Thread::wait(15);
-        if (i2c.read(0x55, dbuf, 8) == 0) {
-            gLED = !gLED;
-        } else {
-            rLED = !rLED;
-        }
+        char c = serial.getc();
+        serial.printf("%c\r\n", c);
+        readMax14750Regs(&i2c);
     }
 }
\ No newline at end of file