88# endif
99#endif
1010
11- void pingI2C ();
1211
13- namespace nicla {
14-
15- BQ25120A _pmic;
16-
17- bool ledPoweredOn = false ;
12+ RGBled nicla::leds;
13+ BQ25120A nicla::_pmic;
14+ rtos::Mutex nicla::i2c_mutex;
1815
16+ void nicla::pingI2CThd () {
17+ while (1 ) {
18+ // already protected by a mutex on Wire operations
19+ readLDOreg ();
20+ delay (10000 );
21+ }
22+ }
1923
20- bool begin ()
21- {
22- pinMode (P0_10, OUTPUT);
23- digitalWrite (P0_10, HIGH);
24- Wire1.begin ();
24+ bool nicla:: begin ()
25+ {
26+ pinMode (P0_10, OUTPUT);
27+ digitalWrite (P0_10, HIGH);
28+ Wire1.begin ();
2529#ifndef NO_NEED_FOR_WATCHDOG_THREAD
2630 static rtos::Thread th (osPriorityHigh, 1024 , nullptr , " ping_thread" );
27- th.start (pingI2C );
31+ th.start (&nicla::pingI2CThd );
2832#endif
29- }
30-
31- void enableCD ()
32- {
33- pinMode (p25, OUTPUT);
34- digitalWrite (p25, HIGH);
35- }
36-
37- void disableCD ()
38- {
39- pinMode (p25, OUTPUT);
40- digitalWrite (p25, LOW);
41- }
42-
43- /*
44- LDO reg:
45- | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
46- | EN_LDO | LDO_4 | LDO_3 | LDO_2 | LDO_1 | LDO_0 | X | X |
47-
48- Conversion function:
49- LDO = 0.8V + LDO_CODE * 100mV
33+ }
5034
51- - for LDO = 3.3V:
52- - set LCO_CODE = 25 (0x19)
53- - shift to lef by 2 positions: (0x19 << 2) = 0x64
54- - set EN_LDO: 0xE4
55- - for LDO = 1.8V:
56- - set LCO_CODE = 10 (0x0A)
57- - shift to lef by 2 positions: (0x0A << 2) = 0x28
58- - set EN_LDO: 0xA8
59- */
35+ void nicla::enableCD ()
36+ {
37+ pinMode (p25, OUTPUT);
38+ digitalWrite (p25, HIGH);
39+ }
6040
61- bool enable3V3LDO ()
62- {
63- enableCD ();
64- uint8_t ldo_reg = 0xE4 ;
65- _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
66- if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
67- disableCD ();
68- return false ;
69- }
70- disableCD ();
71- return true ;
72- }
41+ void nicla::disableCD ()
42+ {
43+ pinMode (p25, OUTPUT);
44+ digitalWrite (p25, LOW);
45+ }
7346
74- bool enable1V8LDO ()
75- {
76- enableCD ();
77- uint8_t ldo_reg = 0xA8 ;
78- _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
79- if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
80- disableCD ();
81- return false ;
82- }
47+ /*
48+ LDO reg:
49+ | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
50+ | EN_LDO | LDO_4 | LDO_3 | LDO_2 | LDO_1 | LDO_0 | X | X |
51+
52+ Conversion function:
53+ LDO = 0.8V + LDO_CODE * 100mV
54+
55+ - for LDO = 3.3V:
56+ - set LCO_CODE = 25 (0x19)
57+ - shift to lef by 2 positions: (0x19 << 2) = 0x64
58+ - set EN_LDO: 0xE4
59+ - for LDO = 1.8V:
60+ - set LCO_CODE = 10 (0x0A)
61+ - shift to lef by 2 positions: (0x0A << 2) = 0x28
62+ - set EN_LDO: 0xA8
63+ */
64+
65+ bool nicla::enable3V3LDO ()
66+ {
67+ enableCD ();
68+ uint8_t ldo_reg = 0xE4 ;
69+ _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
70+ if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
8371 disableCD ();
84- return true ;
72+ return false ;
8573 }
74+ disableCD ();
75+ return true ;
76+ }
8677
87- bool disableLDO ()
88- {
89- enableCD ();
90- uint8_t ldo_reg = _pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL);
91- ldo_reg &= 0x7F ;
92- _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
93- if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
94- disableCD ();
95- return false ;
96- }
78+ bool nicla::enable1V8LDO ()
79+ {
80+ enableCD ();
81+ uint8_t ldo_reg = 0xA8 ;
82+ _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
83+ if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
9784 disableCD ();
98- return true ;
85+ return false ;
9986 }
87+ disableCD ();
88+ return true ;
89+ }
10090
101- uint8_t readLDOreg ()
102- {
103- enableCD ();
104- uint8_t ldo_reg = _pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL);
91+ bool nicla::disableLDO ()
92+ {
93+ enableCD ();
94+ uint8_t ldo_reg = _pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL);
95+ ldo_reg &= 0x7F ;
96+ _pmic.writeByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL, ldo_reg);
97+ if (_pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL) != ldo_reg) {
10598 disableCD ();
106- return ldo_reg ;
99+ return false ;
107100 }
108-
101+ disableCD ();
102+ return true ;
109103}
110104
111- void pingI2C () {
112- while (1 ) {
113- nicla::readLDOreg ();
114- delay (10000 );
115- }
116- }
105+ uint8_t nicla::readLDOreg ()
106+ {
107+ enableCD ();
108+ uint8_t ldo_reg = _pmic.readByte (BQ25120A_ADDRESS, BQ25120A_LDO_CTRL);
109+ disableCD ();
110+ return ldo_reg;
111+ }
0 commit comments