Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: max32625pico maxim-dev mbed-rtos USBDevice
Fork of PICO_USB_I2C_SPI by
main.cpp@19:1a13f0c067b1, 2017-11-28 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
