セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2025-08-08 現在

mwf_periph_i2c - I2C

mwf_periph_i2c - I2C
    I2Cバスを用いるための手続きをまとめたペリフェラルオブジェクトです。

    mwf_periph_i2c - I2C

    I2Cバスを用いるための手続きをまとめたペリフェラルオブジェクトです。

    コード例

    以下の例では mwf:: 名前空間を明示的に指定しています。省略する場合は using namespape mwf; を記述してください。

    • include
    #include "mwf_periph_i2c.hpp"
    • 初期化
    // create instance of the_i2c0.
    if (!mwf::the_i2c0) {
      mwf::i2c::global_init_i2c0_manager();
    }
    
    // I2C device init
    mwf::the_i2c0->init();
    
    // write 2bytes (e.g. kick sensor capturing)
    const uint8_t cmd1[] = { 0x60, 0x9C };
    if (!mwf::the_i2c0->write_blocking(0x70, cmd1)) return false;
    
    // wait (e.g. wait sensor data conversion.)
    CLOCK_uDelay(1000*30); // wait some for sensor data conversion.
    
    // read 6 bytes (e.g. read the sensor data.)
    uint8_t data[6];
    mwf::the_i2c0->read_blocking(0x70, data);
    • 読み出し(ブロッキング API)
    // write 2bytes (e.g. kick sensor capturing)
    const uint8_t cmd1[] = { 0x60, 0x9C };
    if (!mwf::the_i2c0->write_blocking(0x70, cmd1)) return false;
    
    // wait (e.g. wait sensor data conversion.)
    CLOCK_uDelay(1000*30); // wait some for sensor data conversion.
    
    // read 6 bytes (e.g. read the sensor data.)
    uint8_t data[6];
    mwf::the_i2c0->read_blocking(0x70, data);

    この例では、センサーの取得開始コマンドを送付し、センサー動作時間待ち(センサーが必要とする時間)を経てから、データ取得を行なっています。

    • 読み出し(ノンブロッキング API)
    // write 2bytes (e.g. kick sensor capturing)
    const uint8_t cmd1[] = { 0x60, 0x9C };
    if (!mwf::the_i2c0->write(0x70, cmd1)) return false;
    while(!mwf::the_i2c0->available()); // waiting for completion of write operation.
    
    // wait (e.g. wait sensor data conversion.)
    CLOCK_uDelay(1000*30); // wait some for sensor data conversion.
    
    // read 6 bytes (e.g. read the sensor data.)
    uint8_t data[6];
    mwf::the_i2c0->read(0x70, data);
    while(!mwf::the_i2c0->available()); // waiting for completion of read operation.
    

    ブロッキングAPIと同じwrite/readですが、ノンブロッキングAPIでは write()/read() 関数はデータ送信完了を待たず速やかに終了します。十分な時間を待つか the_i2c0->available()がtrueになるのを待ってから続く操作を行う必要があります(上記の例では、write/read直後にポーリング待ちを行っているので、ブロッキングAPIの利用と違いがありません)。

    class mwf::periph::i2c

    I2Cを利用するための手続きを記述しています。

    ※ 現状の実装では I2C0 を利用する the_i2c0 クラスオブジェクトのみが利用できます。

    E_PIN_CONF

    enum class E_PIN_CONF : uint8_t {
        NODEF = 0,   // 未指定
        PRIMARY = 1, // 主割り当て (PIO10/11)
        ALT = 2      // 副割り当て (PIO15/16)
    };
    // enum class と int 型の代入、比較等をするための型。
    using wE_PIN_CONF = mwf::enum_wapper<E_PIN_CONF>;

    ピン割り当てを指定するための列挙体。

    global_init_i2c0_manager(), global_deinit_i2c0_manager()

    static void global_init_i2c0_manager(wE_PIN_CONF pin_conf = E_PIN_CONF::PRIMARY);
    static void global_deinit_i2c0_manager();

    the_i2c0クラスオブジェクトの生成と破棄を行います。

    生成時にピン配置をpin_confE_PIN_CONF::PRIMARY 値:0(SCL=PIO10,SDA=PIO11)またはE_PIN_CONF::ALT 値:1(SCL=PIO15,SDA=PIO16)を指定します。ピンの初期化は init() 呼出時に行われる。

    (eE_PIN_CONFenum class E_PIN_CONFのラッパクラスで、int型との代入比較のための定義を設けています)

    init(), deinit()

    void init(uint32_t clock_freq = 0, wE_PIN_CONF pin_conf = E_PIN_CONF::NODEF);
    void deinit();

    I2Cバスの初期化と利用終了手続きを行う。初期化時にはclock_freqをパラメータとして与え、0の場合は規定クロック100kHzが選択され、それ以外はclock_freq[Hz]を周波数として指定する。

    pin_confを指定しない場合(E_PIN_CONF::NODEF 値:0)は、global_init_i2c0_manager()で指定したピンを用います。pin_confを指定した場合、そのピン設定を用いて初期化します。以降、本パラメータの省略時は最後に指定したピンを用います。

    write_blocking(), write()

    bool write_blocking(uint8_t addr, const uint8_t* buf, unsigned size);
    template <unsigned N> bool write_blocking(uint8_t addr, const uint8_t (&buf)[N]);
    
    bool write(uint8_t addr, const uint8_t* buf, unsigned size);
    template <unsigned N> bool write(uint8_t addr, const uint8_t (&buf)[N]);

    I2Cバスへデータを書き込む。

    write_blocking()は書き込み完了まで待ち処理を行うブロッキング処理、write()は書き出し完了を待たずに関数を終了するノンブロッキング処理です。書き出しが完了すると .available()true になります。

    addrはI2Cバスのアドレス(7bit)、bufは書き出すデータ、sizeは書き出すデータバイト数を指定します。bufがサイズNの固定配列の場合はNバイト書き出します。

    read_blocking(), read()

    bool read_blocking(uint8_t addr, uint8_t* buf, unsigned size);
    template <unsigned N> bool read_blocking(uint8_t addr, uint8_t(&buf)[N]);
    
    bool read(uint8_t addr, uint8_t* buf, unsigned size);
    template <unsigned N> bool read(uint8_t addr, uint8_t(&buf)[N]);

    I2Cバスからデータを読み込む。

    read_blocking()は読み出し完了まで待ち処理を行うブロッキング処理、write()は読み出し完了を待たずに関数を終了するノンブロッキング処理です。読み出しが完了すると .available()true になります。

    addrはI2Cバスのアドレス(7bit)、bufはデータ格納バッファ、sizeは読み出すデータバイト数を指定します。bufがサイズNの固定配列の場合はNバイト読み出します。

    _transfer()

    bool _transfer(OPT op, uint8_t addr, uint8_t* buf, unsigned size);

    ノンブロッキング読み書きを行う処理関数。opは読み出しか書込みの指定、addrはI2Cバスのアドレス、bufは読み書きのためのバッファ、sizeは読み書きバイト数です。

    _transfer_blocking(), _start_blockin(), _stop_blocking()

    bool _transfer_blocking(OPT op, uint8_t* buf, unsigned size, bool sendStop = false)
    bool _start_blocking(OPT op, uint8_t addr);
    bool _stop_blocking();

    mwxライブラリ向けに調整したブロッキング読み書きの手続き。_start_blocking()_transfer_blocking()を必要な回数、_stop_blocking()の順で呼び出す。サイトの転送で sendStop`をtrueに設定することで適切にSTOP信号を発光できる。

    available()

    bool available();

    ノンブロッキングAPI利用時に、転送終了を判定する。転送終了するとtrueを戻す。

    is_success()

    bool is_success();

    ノンブロッキングAPI利用時に、直前の転送が成功したかどうかを返す。trueなら転送が成功したことを示す。

    class mwf::periph::i2c (sys_ev_handler)

    on_sleep()

    スリープ前の手続きとして I2C デバイスの利用終了手続きを行う。

    on_wakeup()

    スリープ時に初期化(init()呼出)済みの場合は、再度 init() の呼び出しを行い初期化する。