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 05:56:36 2017 +0000
Revision:
17:43cc59f768af
Parent:
16:847788f907eb
Child:
19:1a13f0c067b1
Make I2C work using the weak pullups.

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 17:43cc59f768af 49 int i;
seanburford 17:43cc59f768af 50 for (i = 0; i < 0x20; i++) {
seanburford 17:43cc59f768af 51 serial.printf("%02X ", regs[i]);
seanburford 17:43cc59f768af 52 }
seanburford 17:43cc59f768af 53 serial.printf("\r\n");
seanburford 17:43cc59f768af 54 if (regs[0] != 0x01) return;
seanburford 17:43cc59f768af 55 chip_t chipType = UNKNOWN;
seanburford 17:43cc59f768af 56 if (regs[6] == 0xC0) {
seanburford 17:43cc59f768af 57 switch(regs[7]) {
seanburford 17:43cc59f768af 58 case 0x08: chipType = MAX14750A; break;
seanburford 17:43cc59f768af 59 case 0x20: chipType = MAX14750B; break;
seanburford 17:43cc59f768af 60 case 0x0A: chipType = MAX14750C; break;
seanburford 17:43cc59f768af 61 default: break;
seanburford 17:43cc59f768af 62 }
seanburford 17:43cc59f768af 63 } else if (regs[6] == 0xE0) {
seanburford 17:43cc59f768af 64 bool aOrB = false;
seanburford 17:43cc59f768af 65 switch(regs[9]) {
seanburford 17:43cc59f768af 66 case 0xA7: aOrB = true; break;
seanburford 17:43cc59f768af 67 case 0x07: chipType = MAX14720C; break;
seanburford 17:43cc59f768af 68 case 0x47: chipType = MAX14720D; break;
seanburford 17:43cc59f768af 69 default: break;
seanburford 17:43cc59f768af 70 }
seanburford 17:43cc59f768af 71 if (aOrB) {
seanburford 17:43cc59f768af 72 if (regs[0x0B] == 0x80) {
seanburford 17:43cc59f768af 73 chipType = MAX14720A;
seanburford 17:43cc59f768af 74 } else if (regs[0x0B] == 0xE1) {
seanburford 17:43cc59f768af 75 chipType = MAX14720B;
seanburford 17:43cc59f768af 76 }
seanburford 17:43cc59f768af 77 }
seanburford 17:43cc59f768af 78 }
seanburford 17:43cc59f768af 79 switch(chipType) {
seanburford 17:43cc59f768af 80 case MAX14750A: serial.printf("MAX14750A\r\n"); break;
seanburford 17:43cc59f768af 81 case MAX14750B: serial.printf("MAX14750B\r\n"); break;
seanburford 17:43cc59f768af 82 case MAX14750C: serial.printf("MAX14750C\r\n"); break;
seanburford 17:43cc59f768af 83 case MAX14720A: serial.printf("MAX14720A\r\n"); break;
seanburford 17:43cc59f768af 84 case MAX14720B: serial.printf("MAX14720B\r\n"); break;
seanburford 17:43cc59f768af 85 case MAX14720C: serial.printf("MAX14720C\r\n"); break;
seanburford 17:43cc59f768af 86 case MAX14720D: serial.printf("MAX14720D\r\n"); break;
seanburford 17:43cc59f768af 87 }
seanburford 17:43cc59f768af 88 if ((chipType == MAX14750A) || (chipType == MAX14750B) ||
seanburford 17:43cc59f768af 89 (chipType == MAX14750C)) {
seanburford 17:43cc59f768af 90 serial.printf("SWIN: %s\r\n", regs[0x1B] & 8? "high": "low");
seanburford 17:43cc59f768af 91 serial.printf("HVEN: %s\r\n", regs[0x1B] & 4? "high": "low");
seanburford 17:43cc59f768af 92 serial.printf("BEN: %s\r\n", regs[0x1B] & 2? "high": "low");
seanburford 17:43cc59f768af 93 serial.printf("LEN: %s\r\n", regs[0x1B] & 1? "high": "low");
seanburford 17:43cc59f768af 94 }
seanburford 17:43cc59f768af 95 }
seanburford 17:43cc59f768af 96
seanburford 17:43cc59f768af 97 void readMax14750Regs(I2C* i2c) {
seanburford 17:43cc59f768af 98 const int addr = 0x54;
seanburford 17:43cc59f768af 99 char buf[0x20] = {};
seanburford 17:43cc59f768af 100 // Request register 0.
seanburford 17:43cc59f768af 101 buf[0] = 0x00;
seanburford 17:43cc59f768af 102 bool writeFailed = i2c->write(addr, (char*)&buf, 1, false);
seanburford 17:43cc59f768af 103 if (writeFailed) {
seanburford 17:43cc59f768af 104 serial.printf("i2c write 0x54 failed\r\n");
seanburford 17:43cc59f768af 105 return;
seanburford 17:43cc59f768af 106 }
seanburford 17:43cc59f768af 107 // Read 32 register values.
seanburford 17:43cc59f768af 108 if (i2c->read(addr + 1, (char*)(&buf[0]), 0x20, false) != 0) {
seanburford 17:43cc59f768af 109 serial.printf("i2c read 0x55 failed\r\n");
seanburford 17:43cc59f768af 110 return;
seanburford 17:43cc59f768af 111 }
seanburford 17:43cc59f768af 112 showRegisters(buf);
seanburford 17:43cc59f768af 113 }
seanburford 17:43cc59f768af 114
switches 0:60a522ae2e35 115 int main()
switches 0:60a522ae2e35 116 {
switches 2:57500e991166 117 rLED = LED_ON;
switches 2:57500e991166 118 gLED = LED_ON;
switches 2:57500e991166 119 bLED = LED_OFF;
switches 3:aa55728c8e09 120
seanburford 14:7a4b0f9d1474 121 MAX32625PICO pico(
seanburford 14:7a4b0f9d1474 122 MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_IOH, MAX32625PICO::VIO_IOH);
switches 0:60a522ae2e35 123
seanburford 17:43cc59f768af 124 gpioAlternatePullup(P3_4);
seanburford 17:43cc59f768af 125 gpioAlternatePullup(P3_5);
seanburford 14:7a4b0f9d1474 126
seanburford 17:43cc59f768af 127 I2C i2c(P3_4, P3_5);
seanburford 16:847788f907eb 128 i2c.frequency(100000);
switches 2:57500e991166 129
switches 2:57500e991166 130 rLED = LED_OFF;
seanburford 14:7a4b0f9d1474 131 gLED = LED_OFF;
switches 5:2436ae0a9eb1 132
switches 1:6923b075c8d7 133 while(1) {
seanburford 17:43cc59f768af 134 char c = serial.getc();
seanburford 17:43cc59f768af 135 serial.printf("%c\r\n", c);
seanburford 17:43cc59f768af 136 readMax14750Regs(&i2c);
switches 0:60a522ae2e35 137 }
seanburford 16:847788f907eb 138 }