esp-open-rtosを使ってみる

i2c通信(BMP180)

exampleディレクトリーには、センサーやTFT/LCDを扱うための沢山のサンプルコードが含まれています。
今回は、その中からbmp180_i2cのサンプルを紹介します。
このサンプルは、i2cのBMP180から温度と気圧を取り出すサンプルです。
BMP180とi2cで通信する部分は、extras/bmp180のbm180_driver_task(太線内)として提供されています。
このアプリケーションは、以下の様に2つのタスク、2つのQUEUE、1つのタイマーCallBackを使います。
mainqueueには、タイマーCallBackからのイベントと、bmp180_driver_taskからのイベントが積まれます。


BMP180モジュールとの接続は、extras/bmp180/README.mdに記載されています。
#define SCL_PIN GPIO_ID_PIN(0) // GPIO0
#define SDA_PIN GPIO_ID_PIN(2) // GPIO2
i2cのPullUpはなくても動きました。

サンプルコードをビルドして実行すると、以下の様に表示されます。(一部、無関係な表示は消しています)
SDK version : 0.9.9
GIT version : a721fb0
bmp180_task: Started user interface task
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.15hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.15hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.29hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.15hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.18hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.12hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.20hPa
bmp180_task: Received Timer Event
bmp180_task: Received BMP180 Event temp:=19.0C press=1008.20hPa

bmp180_driver_taskを別のセンサードライバーに差し替えれば、どんなセンサーでも扱うことができます。
実際のi2c通信は以下の様に行っています。
static int bmp180_readRegister16(i2c_dev_t *dev, uint8_t reg, int16_t *r)
{
    uint8_t d[] = { 0, 0 };
    int error;

    if ((error = i2c_slave_read(dev->bus, dev->addr, &reg, d, 2)))
        return error;

    *r = ((int16_t)d[0] << 8) | (d[1]);
    return 0;
}

static int bmp180_start_Messurement(i2c_dev_t *dev, uint8_t cmd)
{
    uint8_t reg = BMP180_CONTROL_REG;

    return i2c_slave_write(dev->bus, dev->addr, &reg, &cmd, 1);
}

i2cアクセスのAPIはextras/i2cで提供されています。
extras/i2c/i2c.hに各パラメータの説明が有ります。

続く....