1+ /* *
2+ * @file i2c_wire.cpp
3+ * @author Phil Schatzmann
4+ * @brief I2S Implementation using Arduino Wire Library
5+ * @date 2021-12-12
6+ *
7+ * @copyright Copyright (c) 2021
8+ *
9+ */
110#include " AudioKitSettings.h"
211
312#ifdef AUDIOKIT_USE_WIRE
413
514#include < Wire.h>
615#include < stdio.h>
7- #include " i2c_bus.h"
8- #include " audiokit_logger.h"
16+
917#include " audio_error.h"
18+ #include " audiokit_logger.h"
19+ #include " i2c_bus.h"
20+
21+ // 0x20
22+ #define PORT 0x20
23+ #define END true
24+
25+ i2c_bus_handle_t i2c_bus_create (i2c_port_t port, i2c_config_t * conf)
26+ {
27+ KIT_LOGD (LOG_METHOD);
1028
29+ KIT_LOGD (" sda: %d" , conf->sda_io_num );
30+ KIT_LOGD (" scl: %d" , conf->scl_io_num );
31+ Wire.setPins (conf->sda_io_num , conf->scl_io_num );
1132
12- i2c_bus_handle_t i2c_bus_create (i2c_port_t port, i2c_config_t *conf){
13- // Wire.begin(I2C_SDA, I2C_SCL);
14- if (!Wire.begin (conf->sda_io_num ,conf->scl_io_num )){
15- LOGE (" ->Wire.begin" );
33+ KIT_LOGD (" clk_speed: %d" , conf->master .clk_speed );
34+ Wire.setClock (conf->master .clk_speed );
35+
36+ if (!Wire.begin ()) {
37+ KIT_LOGE (" ->Wire.begin" );
1638 }
39+
1740 return nullptr ;
1841}
1942
20- esp_err_t i2c_bus_cmd_begin (i2c_bus_handle_t bus, i2c_cmd_handle_t cmd, portBASE_TYPE ticks_to_wait){
21- LOGD (LOG_METHOD);
43+ esp_err_t i2c_bus_cmd_begin (i2c_bus_handle_t bus, i2c_cmd_handle_t cmd, portBASE_TYPE ticks_to_wait)
44+ {
45+ KIT_LOGD (LOG_METHOD);
2246 return ESP_OK;
2347}
2448
25- // 0x20
26- #define PORT 0x20
27-
2849// this method is used !
29- esp_err_t i2c_bus_write_bytes (i2c_bus_handle_t bus, int addr, uint8_t *reg, int reglen, uint8_t *data, int datalen){
30- LOGD (LOG_METHOD);
31- assert (addr == PORT);
32- LOGD (" ->i2c addr: %d" , addr);
50+ esp_err_t i2c_bus_write_bytes (i2c_bus_handle_t bus, int addr, uint8_t * reg, int reglen, uint8_t * data, int datalen)
51+ {
52+ KIT_LOGD (" i2c_bus_write_bytes: addr=%d reglen=%d datalen=%d - reg=%d value=%d" , addr, reglen, datalen, reg[0 ], data[0 ]);
53+
54+ assert (reglen == 1 );
55+ assert (datalen == 1 );
56+
3357 int result = ESP_OK;
34- Wire.beginTransmission (addr);
35- int len = Wire.write (reg, reglen);
36- if (len!=reglen){
37- LOGE (" ->Wire.write addr" );
38- result = ESP_FAIL;
39- }
40- len = Wire.write (data, datalen);
41- if (len!=reglen){
42- LOGE (" ->Wire.write data" );
43- result = ESP_FAIL;
44- }
45- int rc = Wire.endTransmission ();
46- if (rc!=0 ){
47- LOGE (" ->Wire.endTransmission: %d" ,rc);
58+ Wire.beginTransmission (addr >> 1 );
59+ Wire.write (reg[0 ]);
60+ Wire.write (data[0 ]);
61+ int rc = Wire.endTransmission (END);
62+ if (rc != 0 ) {
63+ KIT_LOGE (" ->Wire.endTransmission: %d" , rc);
4864 result = ESP_FAIL;
4965 }
5066 return result;
5167}
5268
53- esp_err_t i2c_bus_write_data (i2c_bus_handle_t bus, int addr, uint8_t *data, int datalen){
54- LOGD (LOG_METHOD);
55- assert (addr == PORT);
69+ esp_err_t i2c_bus_write_data (i2c_bus_handle_t bus, int addr, uint8_t * data, int datalen)
70+ {
71+ KIT_LOGD (" i2c_bus_write_data: addr=%d len=%d" , addr, datalen);
72+ assert (datalen == 1 );
73+
5674 int result = ESP_OK;
57- Wire.beginTransmission (addr);
58- int len = Wire.write (data,datalen);
59- if (len!=datalen){
60- LOGE (" ->Wire.write data" );
61- result = ESP_FAIL;
62- }
63- int rc = Wire.endTransmission ();
64- if (rc!=0 ){
65- LOGE (" ->Wire.endTransmission: %d" , rc);
75+ Wire.beginTransmission (addr >> 1 );
76+ Wire.write (data, datalen);
77+ int rc = Wire.endTransmission (END);
78+ if (rc != 0 ) {
79+ KIT_LOGE (" ->Wire.endTransmission: %d" , rc);
6680 result = ESP_FAIL;
6781 }
6882 return result;
6983}
7084
7185// / This method is used
72- esp_err_t i2c_bus_read_bytes (i2c_bus_handle_t bus, int addr, uint8_t *reg, int reglen, uint8_t *outdata, int datalen){
73- LOGD (LOG_METHOD);
74- assert (addr == PORT);
75- int result = i2c_bus_write_bytes (bus, addr, reg, reglen, outdata, datalen);
76-
77- uint8_t result_len = Wire.requestFrom ((uint16_t )addr, (uint8_t )datalen,(bool ) true );
78- LOGD (" ->Wire.requestFrom %d->%d" , datalen, result_len);
79- // wait for result
80- while (Wire.available ()<datalen){
81- delay (10 );
82- }
83- LOGD (" ->Wire.available %d->%d" , datalen, Wire.available ());
84- for (int j=0 ;j<datalen;j++){
85- outdata[j]=Wire.read ();
86+ esp_err_t i2c_bus_read_bytes (i2c_bus_handle_t bus, int addr, uint8_t * reg, int reglen, uint8_t * outdata, int datalen)
87+ {
88+ KIT_LOGD (" i2c_bus_read_bytes: addr=%d reglen=%d datalen=%d - reg=%d" , addr, reglen, datalen, reg[0 ]);
89+ assert (reglen == 1 );
90+ assert (datalen == 1 );
91+
92+ outdata[0 ] = 0 ;
93+ int result = ESP_OK;
94+
95+ Wire.beginTransmission (addr >> 1 );
96+ Wire.write (reg[0 ]);
97+ int rc = Wire.endTransmission ();
98+
99+ uint8_t result_len = Wire.requestFrom ((uint16_t )(addr >> 1 ), (uint8_t )1 , true );
100+ if (result_len > 0 ) {
101+ result_len = Wire.readBytes (outdata, datalen);
102+ } else {
103+ KIT_LOGE (" ->Wire.requestFrom %d->%d" , datalen, result_len);
104+ result = ESP_FAIL;
86105 }
87106 return result;
88107}
89108
90- esp_err_t i2c_bus_delete (i2c_bus_handle_t bus){
91- LOGD (LOG_METHOD);
92- # ifndef ESP32
109+ esp_err_t i2c_bus_delete (i2c_bus_handle_t bus)
110+ {
111+ KIT_LOGD (LOG_METHOD);
93112 Wire.end ();
94- #endif
95113 return ESP_OK;
96114}
97115
98-
99-
100116#endif
0 commit comments