26 #include "freertos/FreeRTOS.h" 27 #include "freertos/task.h" 36 #define I2C_COMMTASK_STACK 1000 37 #define I2C_COMMTASK_PRIORITY 5 38 #define I2C_DEFAULT_FREQUENCY 100000 41 #define EVTGROUP_READY (1 << 0) 42 #define EVTGROUP_WRITE (1 << 1) 43 #define EVTGROUP_READ (1 << 2) 44 #define EVTGROUP_DONE (1 << 3) 50 m_commTaskHandle(nullptr),
67 m_eventGroup = xEventGroupCreate();
71 xTaskCreatePinnedToCore(&commTaskFunc,
"", I2C_COMMTASK_STACK,
this, I2C_COMMTASK_PRIORITY, &m_commTaskHandle, 0);
74 xEventGroupWaitBits(m_eventGroup, EVTGROUP_DONE,
true,
false, portMAX_DELAY);
77 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
79 return m_i2c !=
nullptr;
86 vTaskDelete(m_commTaskHandle);
87 m_commTaskHandle =
nullptr;
94 vEventGroupDelete(m_eventGroup);
95 m_eventGroup =
nullptr;
99 bool I2C::write(
int address, uint8_t * buffer,
int size,
int frequency,
int timeOutMS)
102 xEventGroupWaitBits(m_eventGroup, EVTGROUP_READY,
true,
false, portMAX_DELAY);
104 m_jobInfo.frequency = frequency;
105 m_jobInfo.address = address;
106 m_jobInfo.buffer = buffer;
107 m_jobInfo.size = size;
108 m_jobInfo.timeout = timeOutMS;
112 xEventGroupSync(m_eventGroup, EVTGROUP_WRITE, EVTGROUP_DONE, portMAX_DELAY);
115 bool ret = (m_jobInfo.lastError == I2C_ERROR_OK);
118 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
124 int I2C::read(
int address, uint8_t * buffer,
int size,
int frequency,
int timeOutMS)
127 xEventGroupWaitBits(m_eventGroup, EVTGROUP_READY,
true,
false, portMAX_DELAY);
129 m_jobInfo.frequency = frequency;
130 m_jobInfo.address = address;
131 m_jobInfo.buffer = buffer;
132 m_jobInfo.size = size;
133 m_jobInfo.timeout = timeOutMS;
137 xEventGroupSync(m_eventGroup, EVTGROUP_READ, EVTGROUP_DONE, portMAX_DELAY);
139 int ret = m_jobInfo.readCount;
142 xEventGroupSetBits(m_eventGroup, EVTGROUP_READY);
149 void I2C::commTaskFunc(
void * pvParameters)
151 I2C * ths = (
I2C*) pvParameters;
153 i2c_t * i2c = i2cInit(ths->m_bus, ths->m_SDAGPIO, ths->m_SCLGPIO, I2C_DEFAULT_FREQUENCY);
155 ESP_LOGE(
"unable to init I2C");
164 int freq = i2cGetFrequency(i2c);
166 I2CJobInfo * job = &ths->m_jobInfo;
172 xEventGroupSetBits(ths->m_eventGroup, EVTGROUP_DONE);
175 auto bits = xEventGroupWaitBits(ths->m_eventGroup, EVTGROUP_WRITE | EVTGROUP_READ,
true,
false, portMAX_DELAY);
178 if (freq != job->frequency) {
179 freq = job->frequency;
180 i2cSetFrequency(i2c, freq);
183 if (bits & EVTGROUP_WRITE)
184 job->lastError = i2cWrite(i2c, job->address, job->buffer, job->size,
true, job->timeout);
185 else if (bits & EVTGROUP_READ)
186 job->lastError = i2cRead(i2c, job->address, job->buffer, job->size,
true, job->timeout, &job->readCount);
197 #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.