ESP32-IDFでI2C-Masterを試してみる

ESP32-IDF開発環境にてI2Cを操作する方法をまとめていきます。

こんにちは、北神です。IoTで良く使用するI2Cを使う場面もあるだろうと思い、まとめました。

詳しい資料は、以下の公式情報から辿ってみてください。

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/i2c.html

また、以下の公式サンプルの一部を使用しております。

https://github.com/espressif/esp-idf/tree/master/examples/peripherals/i2c/i2c_tools

■ マスターのI2Cの設定

I2Cの設定情報を、以下の様に記載します。変更が多い SDAピン、SCLピン、クロック速度を外部で変更できるようにしてあります。
その他は固定で良いと思いますが、必要があれば変更してください。

#define I2C_MASTER_TX_BUF_DISABLE 0
#define I2C_MASTER_RX_BUF_DISABLE 0 
#define WRITE_BIT I2C_MASTER_WRITE 
#define READ_BIT I2C_MASTER_READ    
#define ACK_CHECK_EN 0x1           
#define ACK_CHECK_DIS 0x0         
#define ACK_VAL 0x0                 
#define NACK_VAL 0x1                

#define I2C_SDA     21
#define I2C_SCL     22

void i2c_master_setup(int sda_io_num,int scl_io_num,int clk_speed,i2c_port_t i2c_port)
{
    int i2c_master_port = 0;
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = sda_io_num,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = scl_io_num,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = clk_speed,
        
    };
    i2c_driver_install(i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
    i2c_param_config(i2c_port, &conf);
}

■ i2cdetectを試しに作ってみる

I2Cの設定を記述できたので、早速試してみようと思いました。
一番簡単で便利なi2cdetectをカバーしてみます。
多くの処理は、公式のサンプルを利用しています。

void app_main(void)
{

    i2c_port_t i2c_port = I2C_NUM_0;
    i2c_master_setup(I2C_SDA,I2C_SCL,100000,i2c_port);


    uint8_t address;
    printf("     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\r\n");
    for (int i = 0; i < 128; i += 16) {
        printf("%02x: ", i);
        for (int j = 0; j < 16; j++) {
            fflush(stdout);
            address = i + j;
            i2c_cmd_handle_t cmd = i2c_cmd_link_create();
            i2c_master_start(cmd);
            i2c_master_write_byte(cmd, (address << 1) | WRITE_BIT, ACK_CHECK_EN);
            i2c_master_stop(cmd);
            esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 50 / portTICK_RATE_MS);
            i2c_cmd_link_delete(cmd);
            if (ret == ESP_OK) {
                printf("%02x ", address);
            } else if (ret == ESP_ERR_TIMEOUT) {
                printf("UU ");
            } else {
                printf("-- ");
            }
        }
        printf("\r\n");
    }

    i2c_driver_delete(i2c_port);
    return 0;
}

プログラムを書込み、実行すると、以下の様にコンソールに表示されました。

めでたし、めでたし。

それでは!

関連記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA