1
+ /*
2
+ * Copyright (c) 2024 Manuel Markwort <https://github.com/mmarkwort>
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions are met:
6
+ *
7
+ * 1. Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ * this list of conditions and the following disclaimer in the documentation
11
+ * and/or other materials provided with the distribution.
12
+ * 3. Neither the name of the copyright holder nor the names of itscontributors
13
+ * may be used to endorse or promote products derived from this software without
14
+ * specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ /**
29
+ * @file tps63101x.c
30
+ *
31
+ * ESP-IDF driver for Texas Instruments TPS631012 and TPS631013 1.6-V to 5.5-V Input Voltage 1.5-A Buck-boost Converter with I2C
32
+ *
33
+ * Copyright (c) 2024 Manuel Markwort <https://github.com/mmarkwort>\n
34
+ *
35
+ * BSD Licensed as described in the file LICENSE
36
+ */
37
+
38
+ #include <esp_idf_lib_helpers.h>
39
+ #include "tps63101x.h"
40
+
41
+ #define I2C_FREQ_HZ 400000 //!< 400kHz bus speed
42
+
43
+ #define TPS63101X_CONTROL_1_REG_ADDR 0x02 //!< Address of Control 1 register
44
+ #define TPS63101X_VOUT_REG_ADDR 0x03 //!< Address of VOUT register
45
+ #define TPS63101X_CONTROL_2_REG_ADDR 0x05 //!< Address of Control 2 register
46
+
47
+ #define CHECK_ARG (VAL ) do { if (!(VAL)) return ESP_ERR_INVALID_ARG; } while (0)
48
+
49
+ esp_err_t tps63101x_init_desc (i2c_dev_t * dev , i2c_port_t port , gpio_num_t sda_gpio , gpio_num_t scl_gpio )
50
+ {
51
+ CHECK_ARG (dev );
52
+
53
+ dev -> port = port ;
54
+ dev -> addr = TPS63101X_I2C_ADDR ;
55
+ dev -> cfg .sda_io_num = sda_gpio ;
56
+ dev -> cfg .scl_io_num = scl_gpio ;
57
+ #if HELPER_TARGET_IS_ESP32
58
+ dev -> cfg .master .clk_speed = I2C_FREQ_HZ ;
59
+ #endif
60
+
61
+ return i2c_dev_create_mutex (dev );
62
+ }
63
+
64
+ esp_err_t tps63101x_free_desc (i2c_dev_t * dev )
65
+ {
66
+ CHECK_ARG (dev );
67
+
68
+ return i2c_dev_delete_mutex (dev );
69
+ }
70
+
71
+ esp_err_t tps63101x_read (i2c_dev_t * dev , uint8_t addr , void * data )
72
+ {
73
+ CHECK_ARG (dev );
74
+
75
+ I2C_DEV_TAKE_MUTEX (dev );
76
+ I2C_DEV_CHECK (dev , i2c_dev_read_reg (dev , addr , data , 1 ));
77
+ I2C_DEV_GIVE_MUTEX (dev );
78
+
79
+ return ESP_OK ;
80
+ }
81
+
82
+ esp_err_t tps63101x_write (i2c_dev_t * dev , uint8_t addr , void * data )
83
+ {
84
+ CHECK_ARG (dev );
85
+
86
+ I2C_DEV_TAKE_MUTEX (dev );
87
+ I2C_DEV_CHECK (dev , i2c_dev_write_reg (dev , addr , data , 1 ));
88
+ I2C_DEV_GIVE_MUTEX (dev );
89
+
90
+ return ESP_OK ;
91
+ }
92
+
93
+ esp_err_t tps63101x_get_control_1 (i2c_dev_t * dev , tps63101x_control_1_t * control_1 )
94
+ {
95
+ return tps63101x_read (dev , TPS63101X_CONTROL_1_REG_ADDR , control_1 );
96
+ }
97
+
98
+ esp_err_t tps63101x_set_control_1 (i2c_dev_t * dev , tps63101x_control_1_t * control_1 )
99
+ {
100
+ return tps63101x_write (dev , TPS63101X_CONTROL_1_REG_ADDR , control_1 );
101
+ }
102
+
103
+ esp_err_t tps63101x_get_vout (i2c_dev_t * dev , tps63101x_vout_t * vout )
104
+ {
105
+ return tps63101x_read (dev , TPS63101X_VOUT_REG_ADDR , vout );
106
+ }
107
+
108
+ esp_err_t tps63101x_set_vout (i2c_dev_t * dev , tps63101x_vout_t * vout )
109
+ {
110
+ return tps63101x_write (dev , TPS63101X_VOUT_REG_ADDR , vout );
111
+ }
112
+
113
+ esp_err_t tps63101x_get_control_2 (i2c_dev_t * dev , tps63101x_control_2_t * control_2 )
114
+ {
115
+ return tps63101x_read (dev , TPS63101X_CONTROL_2_REG_ADDR , control_2 );
116
+ }
117
+
118
+ esp_err_t tps63101x_set_control_2 (i2c_dev_t * dev , tps63101x_control_2_t * control_2 )
119
+ {
120
+ return tps63101x_write (dev , TPS63101X_CONTROL_2_REG_ADDR , control_2 );
121
+ }
122
+
123
+ esp_err_t tps63101x_reset (i2c_dev_t * dev )
124
+ {
125
+ esp_err_t err ;
126
+
127
+ tps63101x_control_1_t control_1 ;
128
+ tps63101x_vout_t vout ;
129
+ tps63101x_control_2_t control_2 ;
130
+
131
+ control_1 .register_data .reg = TPS63101X_CONTROL_1_DEFAULT ;
132
+ vout .register_data .reg = TPS63101X_VOUT_DEFAULT ;
133
+ control_2 .register_data .reg = TPS63101X_CONTROL_2_DEFAULT ;
134
+
135
+ err = tps63101x_set_control_1 (dev , & control_1 );
136
+ if (err != ESP_OK )
137
+ {
138
+ return err ;
139
+ }
140
+
141
+ vTaskDelay (pdMS_TO_TICKS (1500 ));
142
+
143
+ err = tps63101x_set_control_2 (dev , & control_2 );
144
+ if (err != ESP_OK )
145
+ {
146
+ return err ;
147
+ }
148
+
149
+ vTaskDelay (pdMS_TO_TICKS (1500 ));
150
+
151
+ err = tps63101x_set_vout (dev , & vout );
152
+ if (err != ESP_OK )
153
+ {
154
+ return err ;
155
+ }
156
+
157
+ return err ;
158
+ }
159
+
160
+ uint8_t tps63101x_to_register_voltage (float voltage )
161
+ {
162
+ if (voltage < 1.0f || voltage > 5.5f )
163
+ {
164
+ return 0xff ;
165
+ }
166
+
167
+ return (voltage - 1.0f ) / 0.025 ;
168
+ }
0 commit comments