Can I use DMA for ESP32C3`IIC to drive ssd1306?
Posted: Sat Aug 17, 2024 9:07 am
It has afterimage when I using ESP32C3`IIC to drive ssd1306 with 1 MHz. So I want to solve this problen with DMA. But in Technical Manuals, I can`t find IIC config in DMA, like this:
This is my code to write data:
This is my code to init ssd1306:
This is my code to write data:
Code: Untitled.c Select all
static esp_err_t ssd1306_write_data(void *sensor, const uint8_t *const data_buf,
const uint8_t data_len) {
ssd1306_dev_t *sens = (ssd1306_dev_t *)sensor;
esp_err_t ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
ret = i2c_master_start(cmd);
assert(ESP_OK == ret);
ret = i2c_master_write_byte(cmd, sens->dev_addr | I2C_MASTER_WRITE, true);
assert(ESP_OK == ret);
ret = i2c_master_write_byte(cmd, 0x40, true);
assert(ESP_OK == ret);
ret = i2c_master_write(cmd, data_buf, data_len, true);
assert(ESP_OK == ret);
ret = i2c_master_stop(cmd);
assert(ESP_OK == ret);
ret = i2c_master_cmd_begin(sens->bus, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
return ret;
}
Code: Untitled.c Select all
void SSD1306_init(void) {
esp_err_t ret;
ssd1306 = ssd1306_create(I2C_MASTER_NUM, SSD1306_ADDR);
TEST_ASSERT_NOT_NULL_MESSAGE(ssd1306, "SSD1306 create returned NULL");
ssd1306_write_cmd(ssd1306, 0xAE);
ssd1306_write_cmd(ssd1306, 0x00);
ssd1306_write_cmd(ssd1306, 0x10);
ssd1306_write_cmd(ssd1306, 0x40);
ssd1306_write_cmd(ssd1306, 0xB0);
ssd1306_write_cmd(ssd1306, 0x81);
ssd1306_write_cmd(ssd1306, 0xFF);
ssd1306_write_cmd(ssd1306, 0xA1);
ssd1306_write_cmd(ssd1306, 0xA6);
ssd1306_write_cmd(ssd1306, 0xA8);
ssd1306_write_cmd(ssd1306, 0x3F);
ssd1306_write_cmd(ssd1306, 0xC8);
ssd1306_write_cmd(ssd1306, 0xD3);
ssd1306_write_cmd(ssd1306, 0x00);
ssd1306_write_cmd(ssd1306, 0xD5);
ssd1306_write_cmd(ssd1306, 0x80);
ssd1306_write_cmd(ssd1306, 0xD8);
ssd1306_write_cmd(ssd1306, 0x05);
ssd1306_write_cmd(ssd1306, 0xD9);
ssd1306_write_cmd(ssd1306, 0xF1);
ssd1306_write_cmd(ssd1306, 0xDA);
ssd1306_write_cmd(ssd1306, 0x12);
ssd1306_write_cmd(ssd1306, 0xDB);
ssd1306_write_cmd(ssd1306, 0x30);
ssd1306_write_cmd(ssd1306, 0x8D);
ssd1306_write_cmd(ssd1306, 0x14);
ssd1306_write_cmd(ssd1306, 0xAF);
ssd1306_clean();
ESP_LOGI(TAG, "Finish init %s", TAG);
}