30 #include "freertos/FreeRTOS.h" 31 #include "freertos/task.h" 36 #pragma GCC optimize ("O2") 42 #define I2C_COMMTASK_STACK 1000 43 #define I2C_COMMTASK_PRIORITY 5 44 #define I2C_DEFAULT_FREQUENCY 100000 47 #define EVTGROUP_READY (1 << 0) 48 #define EVTGROUP_WRITE (1 << 1) 49 #define EVTGROUP_READ (1 << 2) 50 #define EVTGROUP_DONE (1 << 3) 56 m_commTaskHandle(nullptr),
73 m_eventGroup = xEventGroupCreate();
77 xTaskCreatePinnedToCore(&commTaskFunc,
"", I2C_COMMTASK_STACK,
this, I2C_COMMTASK_PRIORITY, &m_commTaskHandle, 0);
80 xEventGroupWaitBits(m_eventGroup, EVTGROUP_DONE,
true,
false, portMAX_DELAY);
83 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
85 return m_i2c !=
nullptr;
92 vTaskDelete(m_commTaskHandle);
93 m_commTaskHandle =
nullptr;
100 vEventGroupDelete(m_eventGroup);
101 m_eventGroup =
nullptr;
105 bool I2C::write(
int address, uint8_t * buffer,
int size,
int frequency,
int timeOutMS)
108 xEventGroupWaitBits(m_eventGroup, EVTGROUP_READY,
true,
false, portMAX_DELAY);
110 m_jobInfo.frequency = frequency;
111 m_jobInfo.address = address;
112 m_jobInfo.buffer = buffer;
113 m_jobInfo.size = size;
114 m_jobInfo.timeout = timeOutMS;
118 xEventGroupSync(m_eventGroup, EVTGROUP_WRITE, EVTGROUP_DONE, portMAX_DELAY);
121 bool ret = (m_jobInfo.lastError == I2C_ERROR_OK);
124 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
130 int I2C::read(
int address, uint8_t * buffer,
int size,
int frequency,
int timeOutMS)
133 xEventGroupWaitBits(m_eventGroup, EVTGROUP_READY,
true,
false, portMAX_DELAY);
135 m_jobInfo.frequency = frequency;
136 m_jobInfo.address = address;
137 m_jobInfo.buffer = buffer;
138 m_jobInfo.size = size;
139 m_jobInfo.timeout = timeOutMS;
143 xEventGroupSync(m_eventGroup, EVTGROUP_READ, EVTGROUP_DONE, portMAX_DELAY);
145 int ret = m_jobInfo.readCount;
148 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
155 void I2C::commTaskFunc(
void * pvParameters)
157 I2C * ths = (
I2C*) pvParameters;
159 i2c_t * i2c = i2cInit(ths->m_bus, ths->m_SDAGPIO, ths->m_SCLGPIO, I2C_DEFAULT_FREQUENCY);
161 ESP_LOGE(
"unable to init I2C");
170 int freq = i2cGetFrequency(i2c);
172 I2CJobInfo * job = &ths->m_jobInfo;
178 xEventGroupSetBits(ths->m_eventGroup, EVTGROUP_DONE);
181 auto bits = xEventGroupWaitBits(ths->m_eventGroup, EVTGROUP_WRITE | EVTGROUP_READ,
true,
false, portMAX_DELAY);
184 if (freq != job->frequency) {
185 freq = job->frequency;
186 i2cSetFrequency(i2c, freq);
189 if (bits & EVTGROUP_WRITE)
190 job->lastError = i2cWrite(i2c, job->address, job->buffer, job->size,
true, job->timeout);
191 else if (bits & EVTGROUP_READ)
192 job->lastError = i2cRead(i2c, job->address, job->buffer, job->size,
true, job->timeout, &job->readCount);
203 #endif // #ifdef ARDUINO bool begin(gpio_num_t SDAGPIO, gpio_num_t SCLGPIO)
Initializes I2C instance associating GPIOs to I2C signals.
I2C class allows multiple tasks to communicate with I2C devices, serializing read/write jobs...
I2C(int bus=0)
I2C class constructor.
int read(int address, uint8_t *buffer, int size, int frequency=100000, int timeOutMS=50)
Receives a buffer from I2C bus.
This file contains fabgl::I2C definition.
bool write(int address, uint8_t *buffer, int size, int frequency=100000, int timeOutMS=50)
Sends a buffer to I2C bus.