
Example for onboard MAX77650 PMIC driver and MAX32620FTHR platform driver
Dependencies: MAX32620FTHR MAX77650
main.cpp@0:1b50d5674f92, 2018-05-01 (annotated)
- Committer:
- jessexm
- Date:
- Tue May 01 16:36:27 2018 +0000
- Revision:
- 0:1b50d5674f92
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jessexm | 0:1b50d5674f92 | 1 | #include "mbed.h" |
jessexm | 0:1b50d5674f92 | 2 | #include "MAX32620FTHR.h" |
jessexm | 0:1b50d5674f92 | 3 | #include "MAX77650.h" |
jessexm | 0:1b50d5674f92 | 4 | |
jessexm | 0:1b50d5674f92 | 5 | // Configure GPIO voltage |
jessexm | 0:1b50d5674f92 | 6 | MAX32620FTHR max32620fthr(MAX32620FTHR::VIO_3V3); |
jessexm | 0:1b50d5674f92 | 7 | |
jessexm | 0:1b50d5674f92 | 8 | // LEDs connected to MAX32620 |
jessexm | 0:1b50d5674f92 | 9 | DigitalOut redLed(LED_RED, LED_OFF); |
jessexm | 0:1b50d5674f92 | 10 | DigitalOut grnLed(LED_GREEN, LED_OFF); |
jessexm | 0:1b50d5674f92 | 11 | DigitalOut bluLed(LED_BLUE, LED_OFF); |
jessexm | 0:1b50d5674f92 | 12 | |
jessexm | 0:1b50d5674f92 | 13 | // I2C master 2 |
jessexm | 0:1b50d5674f92 | 14 | I2C i2c2(I2C2_SDA, I2C2_SCL); |
jessexm | 0:1b50d5674f92 | 15 | |
jessexm | 0:1b50d5674f92 | 16 | // MAX77650 PMIC and Charger |
jessexm | 0:1b50d5674f92 | 17 | MAX77650 max77650(i2c2); |
jessexm | 0:1b50d5674f92 | 18 | |
jessexm | 0:1b50d5674f92 | 19 | // MAX77650 IRQ |
jessexm | 0:1b50d5674f92 | 20 | InterruptIn max77650IntIn(P2_3); |
jessexm | 0:1b50d5674f92 | 21 | |
jessexm | 0:1b50d5674f92 | 22 | // Configure PMIC LEDs to rotate colors |
jessexm | 0:1b50d5674f92 | 23 | static const char ledRotate[] = { |
jessexm | 0:1b50d5674f92 | 24 | MAX77650::CNFG_LED0_A, |
jessexm | 0:1b50d5674f92 | 25 | 0x44, 0x44, 0x44, |
jessexm | 0:1b50d5674f92 | 26 | 0x17, 0x37, 0x77, |
jessexm | 0:1b50d5674f92 | 27 | 0x01, |
jessexm | 0:1b50d5674f92 | 28 | }; |
jessexm | 0:1b50d5674f92 | 29 | |
jessexm | 0:1b50d5674f92 | 30 | // Configure PMIC to drive green LED |
jessexm | 0:1b50d5674f92 | 31 | static const char ledGreen[] = { |
jessexm | 0:1b50d5674f92 | 32 | MAX77650::CNFG_LED0_A, |
jessexm | 0:1b50d5674f92 | 33 | 0x04, 0x44, 0x04, |
jessexm | 0:1b50d5674f92 | 34 | 0x0F, 0x0F, 0x0F, |
jessexm | 0:1b50d5674f92 | 35 | 0x01, |
jessexm | 0:1b50d5674f92 | 36 | }; |
jessexm | 0:1b50d5674f92 | 37 | |
jessexm | 0:1b50d5674f92 | 38 | // Disable LED's connected to PMIC |
jessexm | 0:1b50d5674f92 | 39 | static const char ledNone[] = { |
jessexm | 0:1b50d5674f92 | 40 | MAX77650::CNFG_LED0_A, |
jessexm | 0:1b50d5674f92 | 41 | 0x04, 0x04, 0x04, |
jessexm | 0:1b50d5674f92 | 42 | 0x0F, 0x0F, 0x0F, |
jessexm | 0:1b50d5674f92 | 43 | 0x01, |
jessexm | 0:1b50d5674f92 | 44 | }; |
jessexm | 0:1b50d5674f92 | 45 | |
jessexm | 0:1b50d5674f92 | 46 | // Cycle through PMIC LED's with every button push |
jessexm | 0:1b50d5674f92 | 47 | void max77650IrqHandler(void) |
jessexm | 0:1b50d5674f92 | 48 | { |
jessexm | 0:1b50d5674f92 | 49 | char irqStatus; |
jessexm | 0:1b50d5674f92 | 50 | static char ledPhase = 0; |
jessexm | 0:1b50d5674f92 | 51 | static char ledData[] = { |
jessexm | 0:1b50d5674f92 | 52 | MAX77650::CNFG_LED0_A, |
jessexm | 0:1b50d5674f92 | 53 | 0x44, 0x04, 0x04, |
jessexm | 0:1b50d5674f92 | 54 | 0x0F, 0x0F, 0x0F, |
jessexm | 0:1b50d5674f92 | 55 | 0x01, |
jessexm | 0:1b50d5674f92 | 56 | }; |
jessexm | 0:1b50d5674f92 | 57 | |
jessexm | 0:1b50d5674f92 | 58 | while (!(max77650.readReg(MAX77650::INT_GLBL, &irqStatus))) { |
jessexm | 0:1b50d5674f92 | 59 | if (irqStatus) { |
jessexm | 0:1b50d5674f92 | 60 | if (irqStatus & 0x04) { |
jessexm | 0:1b50d5674f92 | 61 | ledPhase++; |
jessexm | 0:1b50d5674f92 | 62 | switch (ledPhase % 4) { |
jessexm | 0:1b50d5674f92 | 63 | case 0: ledData[1] ^= 0x40; break; |
jessexm | 0:1b50d5674f92 | 64 | case 1: ledData[1] ^= 0x40; ledData[2] ^= 0x40; break; |
jessexm | 0:1b50d5674f92 | 65 | case 2: ledData[2] ^= 0x40; ledData[3] ^= 0x40; break; |
jessexm | 0:1b50d5674f92 | 66 | case 3: ledData[3] ^= 0x40; break; |
jessexm | 0:1b50d5674f92 | 67 | } |
jessexm | 0:1b50d5674f92 | 68 | if (!(max77650.writeReg(ledData, sizeof(ledData)))) { |
jessexm | 0:1b50d5674f92 | 69 | break; |
jessexm | 0:1b50d5674f92 | 70 | } |
jessexm | 0:1b50d5674f92 | 71 | } |
jessexm | 0:1b50d5674f92 | 72 | } else { |
jessexm | 0:1b50d5674f92 | 73 | break; |
jessexm | 0:1b50d5674f92 | 74 | } |
jessexm | 0:1b50d5674f92 | 75 | } |
jessexm | 0:1b50d5674f92 | 76 | } |
jessexm | 0:1b50d5674f92 | 77 | |
jessexm | 0:1b50d5674f92 | 78 | // MAX77650 IRQ configuration |
jessexm | 0:1b50d5674f92 | 79 | void max77650IrqInit(void) |
jessexm | 0:1b50d5674f92 | 80 | { |
jessexm | 0:1b50d5674f92 | 81 | // Configure MAX77650 to generate an interrupt request when push buton SW2 is pressed |
jessexm | 0:1b50d5674f92 | 82 | max77650.writeReg(MAX77650::CNFG_GLBL, MAX77650::SBIA_LPM | MAX77650::DBEN_30_MS); |
jessexm | 0:1b50d5674f92 | 83 | max77650.writeReg(MAX77650::INTM_GLBL, MAX77650::NEN_FALL); |
jessexm | 0:1b50d5674f92 | 84 | |
jessexm | 0:1b50d5674f92 | 85 | // Manually invoke the MAX77650 interrupt handler to service any pending interrupts |
jessexm | 0:1b50d5674f92 | 86 | max77650IrqHandler(); |
jessexm | 0:1b50d5674f92 | 87 | |
jessexm | 0:1b50d5674f92 | 88 | // Configure InterruptIn object to service MAX77650 IRQ signal |
jessexm | 0:1b50d5674f92 | 89 | max77650IntIn.mode(PullUp); |
jessexm | 0:1b50d5674f92 | 90 | max77650IntIn.fall(max77650IrqHandler); |
jessexm | 0:1b50d5674f92 | 91 | max77650IntIn.enable_irq(); |
jessexm | 0:1b50d5674f92 | 92 | } |
jessexm | 0:1b50d5674f92 | 93 | |
jessexm | 0:1b50d5674f92 | 94 | int main() |
jessexm | 0:1b50d5674f92 | 95 | { |
jessexm | 0:1b50d5674f92 | 96 | int state = 0; |
jessexm | 0:1b50d5674f92 | 97 | |
jessexm | 0:1b50d5674f92 | 98 | // Turn off Low-Dropout Linear Regulator (LDO); unused on MAX32620FTHR platform |
jessexm | 0:1b50d5674f92 | 99 | max77650.disableLDO(); |
jessexm | 0:1b50d5674f92 | 100 | |
jessexm | 0:1b50d5674f92 | 101 | // Set SIMO Buck-Boost Regulator 2 target voltage; provides VDDIOH |
jessexm | 0:1b50d5674f92 | 102 | max77650.setSBB2Voltage(3.3f); |
jessexm | 0:1b50d5674f92 | 103 | |
jessexm | 0:1b50d5674f92 | 104 | // Turn PMIC green LED on, red and blue off |
jessexm | 0:1b50d5674f92 | 105 | max77650.writeReg(ledGreen, sizeof(ledGreen)); |
jessexm | 0:1b50d5674f92 | 106 | |
jessexm | 0:1b50d5674f92 | 107 | Thread::wait(3000); |
jessexm | 0:1b50d5674f92 | 108 | |
jessexm | 0:1b50d5674f92 | 109 | // Configure PMIC LED's to cycle between colors |
jessexm | 0:1b50d5674f92 | 110 | max77650.writeReg(ledRotate, sizeof(ledRotate)); |
jessexm | 0:1b50d5674f92 | 111 | |
jessexm | 0:1b50d5674f92 | 112 | Thread::wait(3000); |
jessexm | 0:1b50d5674f92 | 113 | |
jessexm | 0:1b50d5674f92 | 114 | // Turn off PMIC LED's |
jessexm | 0:1b50d5674f92 | 115 | max77650.writeReg(ledNone, sizeof(ledNone)); |
jessexm | 0:1b50d5674f92 | 116 | |
jessexm | 0:1b50d5674f92 | 117 | // Enable PMIC push button interrupt |
jessexm | 0:1b50d5674f92 | 118 | max77650IrqInit(); |
jessexm | 0:1b50d5674f92 | 119 | |
jessexm | 0:1b50d5674f92 | 120 | // Cycle MAX32620FTHR LED's |
jessexm | 0:1b50d5674f92 | 121 | for (;;) { |
jessexm | 0:1b50d5674f92 | 122 | Thread::wait(500); |
jessexm | 0:1b50d5674f92 | 123 | switch (state++ & 0x3) { |
jessexm | 0:1b50d5674f92 | 124 | case 0: redLed = LED_ON; break; |
jessexm | 0:1b50d5674f92 | 125 | case 1: redLed = LED_OFF; grnLed = LED_ON; break; |
jessexm | 0:1b50d5674f92 | 126 | case 2: grnLed = LED_OFF; bluLed = LED_ON; break; |
jessexm | 0:1b50d5674f92 | 127 | case 3: bluLed = LED_OFF; break; |
jessexm | 0:1b50d5674f92 | 128 | } |
jessexm | 0:1b50d5674f92 | 129 | } |
jessexm | 0:1b50d5674f92 | 130 | } |