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@17:43cc59f768af, 2017-11-28 (annotated)
- 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?
| 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 | 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 | } |
