14
14
#include "sensor.h"
15
15
#include <stdio.h>
16
16
#include "sdkconfig.h"
17
+ #include "driver/i2c_master.h"
17
18
#if defined(ARDUINO_ARCH_ESP32 ) && defined(CONFIG_ARDUHAL_ESP_LOG )
18
19
#include "esp32-hal-log.h"
19
20
#else
@@ -23,7 +24,6 @@ static const char* TAG = "sccb";
23
24
24
25
#define LITTLETOBIG (x ) ((x<<8)|(x>>8))
25
26
26
- #include "driver/i2c.h"
27
27
28
28
// support IDF 5.x
29
29
#ifndef portTICK_RATE_MS
@@ -45,31 +45,59 @@ const int SCCB_I2C_PORT_DEFAULT = 0;
45
45
46
46
static int sccb_i2c_port ;
47
47
static bool sccb_owns_i2c_port ;
48
+ static i2c_master_bus_handle_t bus_handle ;
49
+ static i2c_master_dev_handle_t dev_handle = NULL ;
50
+ static uint8_t curr_slave_addr = 0 ;
51
+
52
+ static int UpdateDevice (uint8_t slv_addr ) {
53
+ if (slv_addr != curr_slave_addr ) {
54
+ i2c_master_bus_rm_device (dev_handle );
55
+ curr_slave_addr = 0 ;
56
+ }
57
+ if (!dev_handle ) {
58
+ // Not initialized
59
+ i2c_device_config_t dev_cfg = {
60
+ .dev_addr_length = I2C_ADDR_BIT_LEN_7 ,
61
+ .device_address = slv_addr ,
62
+ .scl_speed_hz = SCCB_FREQ ,
63
+ };
64
+ ESP_ERROR_CHECK (i2c_master_bus_add_device (bus_handle , & dev_cfg , & dev_handle ));
65
+ curr_slave_addr = slv_addr ;
66
+ }
67
+ return 0 ;
68
+ }
48
69
49
70
int SCCB_Init (int pin_sda , int pin_scl )
50
71
{
51
72
ESP_LOGI (TAG , "pin_sda %d pin_scl %d" , pin_sda , pin_scl );
52
- i2c_config_t conf ;
53
- esp_err_t ret ;
73
+ i2c_master_bus_config_t i2c_mst_config = {
74
+ .clk_source = I2C_CLK_SRC_DEFAULT ,
75
+ .i2c_port = SCCB_I2C_PORT_DEFAULT ,
76
+ .scl_io_num = pin_scl ,
77
+ .sda_io_num = pin_sda ,
78
+ .glitch_ignore_cnt = 7 ,
79
+ };
80
+ return i2c_new_master_bus (& i2c_mst_config , & bus_handle );
54
81
55
- memset (& conf , 0 , sizeof (i2c_config_t ));
56
82
57
- sccb_i2c_port = SCCB_I2C_PORT_DEFAULT ;
58
- sccb_owns_i2c_port = true;
59
- ESP_LOGI (TAG , "sccb_i2c_port=%d" , sccb_i2c_port );
83
+ // memset(&conf, 0, sizeof(i2c_config_t));
60
84
61
- conf .mode = I2C_MODE_MASTER ;
62
- conf .sda_io_num = pin_sda ;
63
- conf .sda_pullup_en = GPIO_PULLUP_ENABLE ;
64
- conf .scl_io_num = pin_scl ;
65
- conf .scl_pullup_en = GPIO_PULLUP_ENABLE ;
66
- conf .master .clk_speed = SCCB_FREQ ;
85
+ // sccb_i2c_port = SCCB_I2C_PORT_DEFAULT;
86
+ // sccb_owns_i2c_port = true;
87
+ // ESP_LOGI(TAG, "sccb_i2c_port=%d", sccb_i2c_port);
67
88
68
- if ((ret = i2c_param_config (sccb_i2c_port , & conf )) != ESP_OK ) {
69
- return ret ;
70
- }
89
+ // conf.mode = I2C_MODE_MASTER;
90
+ // conf.sda_io_num = pin_sda;
91
+ // conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
92
+ // conf.scl_io_num = pin_scl;
93
+ // conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
94
+ // conf.master.clk_speed = SCCB_FREQ;
71
95
72
- return i2c_driver_install (sccb_i2c_port , conf .mode , 0 , 0 , 0 );
96
+ // if ((ret = i2c_param_config(sccb_i2c_port, &conf)) != ESP_OK) {
97
+ // return ret;
98
+ // }
99
+
100
+ // return i2c_driver_install(sccb_i2c_port, conf.mode, 0, 0, 0);
73
101
}
74
102
75
103
int SCCB_Use_Port (int i2c_num ) { // sccb use an already initialized I2C port
@@ -89,7 +117,11 @@ int SCCB_Deinit(void)
89
117
return ESP_OK ;
90
118
}
91
119
sccb_owns_i2c_port = false;
92
- return i2c_driver_delete (sccb_i2c_port );
120
+ if (dev_handle ) {
121
+ i2c_master_bus_rm_device (dev_handle );
122
+ dev_handle = NULL ;
123
+ }
124
+ return i2c_del_master_bus (bus_handle );
93
125
}
94
126
95
127
uint8_t SCCB_Probe (void )
@@ -101,12 +133,7 @@ uint8_t SCCB_Probe(void)
101
133
continue ;
102
134
}
103
135
slave_addr = camera_sensor [i ].sccb_addr ;
104
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
105
- i2c_master_start (cmd );
106
- i2c_master_write_byte (cmd , ( slave_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
107
- i2c_master_stop (cmd );
108
- esp_err_t ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
109
- i2c_cmd_link_delete (cmd );
136
+ esp_err_t ret = i2c_master_probe (bus_handle , slave_addr , 1000 );
110
137
if ( ret == ESP_OK ) {
111
138
return slave_addr ;
112
139
}
@@ -116,23 +143,9 @@ uint8_t SCCB_Probe(void)
116
143
117
144
uint8_t SCCB_Read (uint8_t slv_addr , uint8_t reg )
118
145
{
146
+ ESP_ERROR_CHECK (UpdateDevice (slv_addr ));
119
147
uint8_t data = 0 ;
120
- esp_err_t ret = ESP_FAIL ;
121
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
122
- i2c_master_start (cmd );
123
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
124
- i2c_master_write_byte (cmd , reg , ACK_CHECK_EN );
125
- i2c_master_stop (cmd );
126
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
127
- i2c_cmd_link_delete (cmd );
128
- if (ret != ESP_OK ) return -1 ;
129
- cmd = i2c_cmd_link_create ();
130
- i2c_master_start (cmd );
131
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | READ_BIT , ACK_CHECK_EN );
132
- i2c_master_read_byte (cmd , & data , NACK_VAL );
133
- i2c_master_stop (cmd );
134
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
135
- i2c_cmd_link_delete (cmd );
148
+ esp_err_t ret = i2c_master_transmit_receive (dev_handle , & reg , 1 , & data , 1 , 1000 );
136
149
if (ret != ESP_OK ) {
137
150
ESP_LOGE (TAG , "SCCB_Read Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d" , slv_addr , reg , data , ret );
138
151
}
@@ -141,15 +154,9 @@ uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg)
141
154
142
155
int SCCB_Write (uint8_t slv_addr , uint8_t reg , uint8_t data )
143
156
{
144
- esp_err_t ret = ESP_FAIL ;
145
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
146
- i2c_master_start (cmd );
147
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
148
- i2c_master_write_byte (cmd , reg , ACK_CHECK_EN );
149
- i2c_master_write_byte (cmd , data , ACK_CHECK_EN );
150
- i2c_master_stop (cmd );
151
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
152
- i2c_cmd_link_delete (cmd );
157
+ ESP_ERROR_CHECK (UpdateDevice (slv_addr ));
158
+ const uint8_t all_data [2 ] = {reg , data };
159
+ esp_err_t ret = i2c_master_transmit (dev_handle , all_data , sizeof (all_data ), 1000 );
153
160
if (ret != ESP_OK ) {
154
161
ESP_LOGE (TAG , "SCCB_Write Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d" , slv_addr , reg , data , ret );
155
162
}
@@ -158,103 +165,107 @@ int SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data)
158
165
159
166
uint8_t SCCB_Read16 (uint8_t slv_addr , uint16_t reg )
160
167
{
161
- uint8_t data = 0 ;
162
- esp_err_t ret = ESP_FAIL ;
163
- uint16_t reg_htons = LITTLETOBIG (reg );
164
- uint8_t * reg_u8 = (uint8_t * )& reg_htons ;
165
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
166
- i2c_master_start (cmd );
167
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
168
- i2c_master_write_byte (cmd , reg_u8 [0 ], ACK_CHECK_EN );
169
- i2c_master_write_byte (cmd , reg_u8 [1 ], ACK_CHECK_EN );
170
- i2c_master_stop (cmd );
171
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
172
- i2c_cmd_link_delete (cmd );
173
- if (ret != ESP_OK ) return -1 ;
174
- cmd = i2c_cmd_link_create ();
175
- i2c_master_start (cmd );
176
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | READ_BIT , ACK_CHECK_EN );
177
- i2c_master_read_byte (cmd , & data , NACK_VAL );
178
- i2c_master_stop (cmd );
179
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
180
- i2c_cmd_link_delete (cmd );
181
- if (ret != ESP_OK ) {
182
- ESP_LOGE (TAG , "W [%04x]=%02x fail\n" , reg , data );
183
- }
184
- return data ;
168
+ return -1 ;
169
+ // uint8_t data=0;
170
+ // esp_err_t ret = ESP_FAIL;
171
+ // uint16_t reg_htons = LITTLETOBIG(reg);
172
+ // uint8_t *reg_u8 = (uint8_t *)®_htons;
173
+ // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
174
+ // i2c_master_start(cmd);
175
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
176
+ // i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN);
177
+ // i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN);
178
+ // i2c_master_stop(cmd);
179
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
180
+ // i2c_cmd_link_delete(cmd);
181
+ // if(ret != ESP_OK) return -1;
182
+ // cmd = i2c_cmd_link_create();
183
+ // i2c_master_start(cmd);
184
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN);
185
+ // i2c_master_read_byte(cmd, &data, NACK_VAL);
186
+ // i2c_master_stop(cmd);
187
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
188
+ // i2c_cmd_link_delete(cmd);
189
+ // if(ret != ESP_OK) {
190
+ // ESP_LOGE(TAG, "W [%04x]=%02x fail\n", reg, data);
191
+ // }
192
+ // return data;
185
193
}
186
194
187
195
int SCCB_Write16 (uint8_t slv_addr , uint16_t reg , uint8_t data )
188
196
{
189
- static uint16_t i = 0 ;
190
- esp_err_t ret = ESP_FAIL ;
191
- uint16_t reg_htons = LITTLETOBIG (reg );
192
- uint8_t * reg_u8 = (uint8_t * )& reg_htons ;
193
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
194
- i2c_master_start (cmd );
195
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
196
- i2c_master_write_byte (cmd , reg_u8 [0 ], ACK_CHECK_EN );
197
- i2c_master_write_byte (cmd , reg_u8 [1 ], ACK_CHECK_EN );
198
- i2c_master_write_byte (cmd , data , ACK_CHECK_EN );
199
- i2c_master_stop (cmd );
200
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
201
- i2c_cmd_link_delete (cmd );
202
- if (ret != ESP_OK ) {
203
- ESP_LOGE (TAG , "W [%04x]=%02x %d fail\n" , reg , data , i ++ );
204
- }
205
- return ret == ESP_OK ? 0 : -1 ;
197
+ return -1 ;
198
+ // static uint16_t i = 0;
199
+ // esp_err_t ret = ESP_FAIL;
200
+ // uint16_t reg_htons = LITTLETOBIG(reg);
201
+ // uint8_t *reg_u8 = (uint8_t *)®_htons;
202
+ // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
203
+ // i2c_master_start(cmd);
204
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
205
+ // i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN);
206
+ // i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN);
207
+ // i2c_master_write_byte(cmd, data, ACK_CHECK_EN);
208
+ // i2c_master_stop(cmd);
209
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
210
+ // i2c_cmd_link_delete(cmd);
211
+ // if(ret != ESP_OK) {
212
+ // ESP_LOGE(TAG, "W [%04x]=%02x %d fail\n", reg, data, i++);
213
+ // }
214
+ // return ret == ESP_OK ? 0 : -1;
206
215
}
207
216
208
217
uint16_t SCCB_Read_Addr16_Val16 (uint8_t slv_addr , uint16_t reg )
209
218
{
210
- uint16_t data = 0 ;
211
- uint8_t * data_u8 = (uint8_t * )& data ;
212
- esp_err_t ret = ESP_FAIL ;
213
- uint16_t reg_htons = LITTLETOBIG (reg );
214
- uint8_t * reg_u8 = (uint8_t * )& reg_htons ;
215
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
216
- i2c_master_start (cmd );
217
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
218
- i2c_master_write_byte (cmd , reg_u8 [0 ], ACK_CHECK_EN );
219
- i2c_master_write_byte (cmd , reg_u8 [1 ], ACK_CHECK_EN );
220
- i2c_master_stop (cmd );
221
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
222
- i2c_cmd_link_delete (cmd );
223
- if (ret != ESP_OK ) return -1 ;
219
+ return ESP_FAIL ;
220
+ // uint16_t data = 0;
221
+ // uint8_t *data_u8 = (uint8_t *)&data;
222
+ // esp_err_t ret = ESP_FAIL;
223
+ // uint16_t reg_htons = LITTLETOBIG(reg);
224
+ // uint8_t *reg_u8 = (uint8_t *)®_htons;
225
+ // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
226
+ // i2c_master_start(cmd);
227
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
228
+ // i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN);
229
+ // i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN);
230
+ // i2c_master_stop(cmd);
231
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
232
+ // i2c_cmd_link_delete(cmd);
233
+ // if(ret != ESP_OK) return -1;
224
234
225
- cmd = i2c_cmd_link_create ();
226
- i2c_master_start (cmd );
227
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | READ_BIT , ACK_CHECK_EN );
228
- i2c_master_read_byte (cmd , & data_u8 [1 ], ACK_VAL );
229
- i2c_master_read_byte (cmd , & data_u8 [0 ], NACK_VAL );
230
- i2c_master_stop (cmd );
231
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
232
- i2c_cmd_link_delete (cmd );
233
- if (ret != ESP_OK ) {
234
- ESP_LOGE (TAG , "W [%04x]=%04x fail\n" , reg , data );
235
- }
236
- return data ;
235
+ // cmd = i2c_cmd_link_create();
236
+ // i2c_master_start(cmd);
237
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN);
238
+ // i2c_master_read_byte(cmd, &data_u8[1], ACK_VAL);
239
+ // i2c_master_read_byte(cmd, &data_u8[0], NACK_VAL);
240
+ // i2c_master_stop(cmd);
241
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
242
+ // i2c_cmd_link_delete(cmd);
243
+ // if(ret != ESP_OK) {
244
+ // ESP_LOGE(TAG, "W [%04x]=%04x fail\n", reg, data);
245
+ // }
246
+ // return data;
237
247
}
238
248
239
249
int SCCB_Write_Addr16_Val16 (uint8_t slv_addr , uint16_t reg , uint16_t data )
240
250
{
241
- esp_err_t ret = ESP_FAIL ;
242
- uint16_t reg_htons = LITTLETOBIG (reg );
243
- uint8_t * reg_u8 = (uint8_t * )& reg_htons ;
244
- uint16_t data_htons = LITTLETOBIG (data );
245
- uint8_t * data_u8 = (uint8_t * )& data_htons ;
246
- i2c_cmd_handle_t cmd = i2c_cmd_link_create ();
247
- i2c_master_start (cmd );
248
- i2c_master_write_byte (cmd , ( slv_addr << 1 ) | WRITE_BIT , ACK_CHECK_EN );
249
- i2c_master_write_byte (cmd , reg_u8 [0 ], ACK_CHECK_EN );
250
- i2c_master_write_byte (cmd , reg_u8 [1 ], ACK_CHECK_EN );
251
- i2c_master_write_byte (cmd , data_u8 [0 ], ACK_CHECK_EN );
252
- i2c_master_write_byte (cmd , data_u8 [1 ], ACK_CHECK_EN );
253
- i2c_master_stop (cmd );
254
- ret = i2c_master_cmd_begin (sccb_i2c_port , cmd , 1000 / portTICK_RATE_MS );
255
- i2c_cmd_link_delete (cmd );
256
- if (ret != ESP_OK ) {
257
- ESP_LOGE (TAG , "W [%04x]=%04x fail\n" , reg , data );
258
- }
259
- return ret == ESP_OK ? 0 : -1 ;
251
+ return ESP_FAIL ;
252
+ // esp_err_t ret = ESP_FAIL;
253
+ // uint16_t reg_htons = LITTLETOBIG(reg);
254
+ // uint8_t *reg_u8 = (uint8_t *)®_htons;
255
+ // uint16_t data_htons = LITTLETOBIG(data);
256
+ // uint8_t *data_u8 = (uint8_t *)&data_htons;
257
+ // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
258
+ // i2c_master_start(cmd);
259
+ // i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
260
+ // i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN);
261
+ // i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN);
262
+ // i2c_master_write_byte(cmd, data_u8[0], ACK_CHECK_EN);
263
+ // i2c_master_write_byte(cmd, data_u8[1], ACK_CHECK_EN);
264
+ // i2c_master_stop(cmd);
265
+ // ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
266
+ // i2c_cmd_link_delete(cmd);
267
+ // if(ret != ESP_OK) {
268
+ // ESP_LOGE(TAG, "W [%04x]=%04x fail\n", reg, data);
269
+ // }
270
+ // return ret == ESP_OK ? 0 : -1;
260
271
}
0 commit comments