Sean Burford / i2c_pullup

Dependencies:   max32625pico maxim-dev mbed-rtos USBDevice

Fork of PICO_USB_I2C_SPI by Greg Steiert

Committer:
seanburford
Date:
Tue Nov 28 06:07:43 2017 +0000
Revision:
19:1a13f0c067b1
Parent:
17:43cc59f768af
Child:
20:166e033d5073
Comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:60a522ae2e35 1 #include "mbed.h"
switches 13:fed6ff32bf5d 2 #include "rtos.h"
switches 3:aa55728c8e09 3
seanburford 14:7a4b0f9d1474 4 #include "gpio_api.h"
seanburford 14:7a4b0f9d1474 5 #include "max32625pico.h"
seanburford 15:9801f08ce0ee 6 #include "pwrman_regs.h"
switches 5:2436ae0a9eb1 7
seanburford 17:43cc59f768af 8 #include "USBSerial.h"
seanburford 17:43cc59f768af 9 USBSerial serial;
seanburford 17:43cc59f768af 10
seanburford 14:7a4b0f9d1474 11 static DigitalOut rLED(LED1);
seanburford 14:7a4b0f9d1474 12 static DigitalOut gLED(LED2);
seanburford 14:7a4b0f9d1474 13 static DigitalOut bLED(LED3);
switches 5:2436ae0a9eb1 14
seanburford 16:847788f907eb 15 int gpioAlternatePullup(PinName name) {
seanburford 16:847788f907eb 16 // Enable high resistance pullups per AN6350 section 5.2.4.1
seanburford 15:9801f08ce0ee 17 int result = E_NO_ERROR;
seanburford 16:847788f907eb 18 unsigned int port = PINNAME_TO_PORT(name);
seanburford 16:847788f907eb 19 unsigned int pin = PINNAME_TO_PIN(name);
seanburford 16:847788f907eb 20 MXC_IOMAN->wud_req0 |= ((1 << pin) << (port << 3)); // pinmask
seanburford 15:9801f08ce0ee 21 if (MXC_IOMAN->wud_ack0 != MXC_IOMAN->wud_req0) {
seanburford 15:9801f08ce0ee 22 result = E_BUSY;
seanburford 15:9801f08ce0ee 23 }
seanburford 15:9801f08ce0ee 24 if (result == E_NO_ERROR) {
seanburford 15:9801f08ce0ee 25 MXC_PWRMAN->wud_ctrl = MXC_F_PWRMAN_WUD_CTRL_CTRL_ENABLE;
seanburford 17:43cc59f768af 26 MXC_PWRMAN->wud_ctrl |= (port << 3) + pin; // Pad select
seanburford 15:9801f08ce0ee 27 MXC_PWRMAN->wud_ctrl &= ~(MXC_F_PWRMAN_WUD_CTRL_PAD_MODE);
seanburford 16:847788f907eb 28 MXC_PWRMAN->wud_ctrl |= (MXC_E_PWRMAN_PAD_MODE_WEAK_HI_LO <<
seanburford 16:847788f907eb 29 MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS);
seanburford 15:9801f08ce0ee 30 MXC_PWRMAN->wud_pulse0 = 1;
seanburford 15:9801f08ce0ee 31 }
seanburford 15:9801f08ce0ee 32 MXC_PWRMAN->wud_ctrl = 0;
seanburford 15:9801f08ce0ee 33 MXC_IOMAN->wud_req0 = 0;
seanburford 15:9801f08ce0ee 34 return result;
seanburford 15:9801f08ce0ee 35 }
seanburford 15:9801f08ce0ee 36
seanburford 17:43cc59f768af 37 typedef enum {
seanburford 17:43cc59f768af 38 UNKNOWN,
seanburford 17:43cc59f768af 39 MAX14720A,
seanburford 17:43cc59f768af 40 MAX14720B,
seanburford 17:43cc59f768af 41 MAX14720C,
seanburford 17:43cc59f768af 42 MAX14720D,
seanburford 17:43cc59f768af 43 MAX14750A,
seanburford 17:43cc59f768af 44 MAX14750B,
seanburford 17:43cc59f768af 45 MAX14750C
seanburford 17:43cc59f768af 46 } chip_t;
seanburford 17:43cc59f768af 47
seanburford 17:43cc59f768af 48 void showRegisters(char* regs) {
seanburford 19:1a13f0c067b1 49 // Datasheet table 28 "Register Default Values"
seanburford 17:43cc59f768af 50 int i;
seanburford 17:43cc59f768af 51 for (i = 0; i < 0x20; i++) {
seanburford 17:43cc59f768af 52 serial.printf("%02X ", regs[i]);
seanburford 17:43cc59f768af 53 }
seanburford 17:43cc59f768af 54 serial.printf("\r\n");
seanburford 17:43cc59f768af 55 if (regs[0] != 0x01) return;
seanburford 17:43cc59f768af 56 chip_t chipType = UNKNOWN;
seanburford 19:1a13f0c067b1 57 // regs[6] BoostCfg
seanburford 17:43cc59f768af 58 if (regs[6] == 0xC0) {
seanburford 19:1a13f0c067b1 59 // regs[7] BuckVSet
seanburford 17:43cc59f768af 60 switch(regs[7]) {
seanburford 17:43cc59f768af 61 case 0x08: chipType = MAX14750A; break;
seanburford 17:43cc59f768af 62 case 0x20: chipType = MAX14750B; break;
seanburford 17:43cc59f768af 63 case 0x0A: chipType = MAX14750C; break;
seanburford 17:43cc59f768af 64 default: break;
seanburford 17:43cc59f768af 65 }
seanburford 17:43cc59f768af 66 } else if (regs[6] == 0xE0) {
seanburford 17:43cc59f768af 67 bool aOrB = false;
seanburford 19:1a13f0c067b1 68 // regs[9] BuckISet
seanburford 17:43cc59f768af 69 switch(regs[9]) {
seanburford 17:43cc59f768af 70 case 0xA7: aOrB = true; break;
seanburford 17:43cc59f768af 71 case 0x07: chipType = MAX14720C; break;
seanburford 17:43cc59f768af 72 case 0x47: chipType = MAX14720D; break;
seanburford 17:43cc59f768af 73 default: break;
seanburford 17:43cc59f768af 74 }
seanburford 17:43cc59f768af 75 if (aOrB) {
seanburford 19:1a13f0c067b1 76 // regs[B] LDOCfg
seanburford 17:43cc59f768af 77 if (regs[0x0B] == 0x80) {
seanburford 17:43cc59f768af 78 chipType = MAX14720A;
seanburford 17:43cc59f768af 79 } else if (regs[0x0B] == 0xE1) {
seanburford 17:43cc59f768af 80 chipType = MAX14720B;
seanburford 17:43cc59f768af 81 }
seanburford 17:43cc59f768af 82 }
seanburford 17:43cc59f768af 83 }
seanburford 17:43cc59f768af 84 switch(chipType) {
seanburford 17:43cc59f768af 85 case MAX14750A: serial.printf("MAX14750A\r\n"); break;
seanburford 17:43cc59f768af 86 case MAX14750B: serial.printf("MAX14750B\r\n"); break;
seanburford 17:43cc59f768af 87 case MAX14750C: serial.printf("MAX14750C\r\n"); break;
seanburford 17:43cc59f768af 88 case MAX14720A: serial.printf("MAX14720A\r\n"); break;
seanburford 17:43cc59f768af 89 case MAX14720B: serial.printf("MAX14720B\r\n"); break;
seanburford 17:43cc59f768af 90 case MAX14720C: serial.printf("MAX14720C\r\n"); break;
seanburford 17:43cc59f768af 91 case MAX14720D: serial.printf("MAX14720D\r\n"); break;
seanburford 17:43cc59f768af 92 }
seanburford 17:43cc59f768af 93 if ((chipType == MAX14750A) || (chipType == MAX14750B) ||
seanburford 17:43cc59f768af 94 (chipType == MAX14750C)) {
seanburford 17:43cc59f768af 95 serial.printf("SWIN: %s\r\n", regs[0x1B] & 8? "high": "low");
seanburford 17:43cc59f768af 96 serial.printf("HVEN: %s\r\n", regs[0x1B] & 4? "high": "low");
seanburford 17:43cc59f768af 97 serial.printf("BEN: %s\r\n", regs[0x1B] & 2? "high": "low");
seanburford 17:43cc59f768af 98 serial.printf("LEN: %s\r\n", regs[0x1B] & 1? "high": "low");
seanburford 17:43cc59f768af 99 }
seanburford 17:43cc59f768af 100 }
seanburford 17:43cc59f768af 101
seanburford 17:43cc59f768af 102 void readMax14750Regs(I2C* i2c) {
seanburford 17:43cc59f768af 103 const int addr = 0x54;
seanburford 17:43cc59f768af 104 char buf[0x20] = {};
seanburford 17:43cc59f768af 105 // Request register 0.
seanburford 17:43cc59f768af 106 buf[0] = 0x00;
seanburford 17:43cc59f768af 107 bool writeFailed = i2c->write(addr, (char*)&buf, 1, false);
seanburford 17:43cc59f768af 108 if (writeFailed) {
seanburford 17:43cc59f768af 109 serial.printf("i2c write 0x54 failed\r\n");
seanburford 17:43cc59f768af 110 return;
seanburford 17:43cc59f768af 111 }
seanburford 17:43cc59f768af 112 // Read 32 register values.
seanburford 17:43cc59f768af 113 if (i2c->read(addr + 1, (char*)(&buf[0]), 0x20, false) != 0) {
seanburford 17:43cc59f768af 114 serial.printf("i2c read 0x55 failed\r\n");
seanburford 17:43cc59f768af 115 return;
seanburford 17:43cc59f768af 116 }
seanburford 17:43cc59f768af 117 showRegisters(buf);
seanburford 17:43cc59f768af 118 }
seanburford 17:43cc59f768af 119
switches 0:60a522ae2e35 120 int main()
switches 0:60a522ae2e35 121 {
switches 2:57500e991166 122 rLED = LED_ON;
switches 2:57500e991166 123 gLED = LED_ON;
switches 2:57500e991166 124 bLED = LED_OFF;
switches 3:aa55728c8e09 125
seanburford 14:7a4b0f9d1474 126 MAX32625PICO pico(
seanburford 14:7a4b0f9d1474 127 MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_IOH, MAX32625PICO::VIO_IOH);
switches 0:60a522ae2e35 128
seanburford 17:43cc59f768af 129 gpioAlternatePullup(P3_4);
seanburford 17:43cc59f768af 130 gpioAlternatePullup(P3_5);
seanburford 14:7a4b0f9d1474 131
seanburford 17:43cc59f768af 132 I2C i2c(P3_4, P3_5);
seanburford 16:847788f907eb 133 i2c.frequency(100000);
switches 2:57500e991166 134
switches 2:57500e991166 135 rLED = LED_OFF;
seanburford 14:7a4b0f9d1474 136 gLED = LED_OFF;
switches 5:2436ae0a9eb1 137
switches 1:6923b075c8d7 138 while(1) {
seanburford 17:43cc59f768af 139 char c = serial.getc();
seanburford 17:43cc59f768af 140 serial.printf("%c\r\n", c);
seanburford 17:43cc59f768af 141 readMax14750Regs(&i2c);
switches 0:60a522ae2e35 142 }
seanburford 16:847788f907eb 143 }