I2C API

概要

I2C API は、I2C デバイスへの同期アクセスを行うための低レベル API です。 複数タスクから安全に利用するため、アクセス時は lock() / unlock() でトランザクションを保護します。

初期化

xmc::i2c::getPreferredFrequency

uint32_t xmc::i2c::getPreferredFrequency(Chipset device);

デバイス種別に応じた推奨 I2C クロック周波数 [Hz] を返します。

device には接続先デバイス種別を指定します。 戻り値は、そのデバイスで安全に使用できることを想定した推奨クロック周波数です。

xmc::i2c::init

XmcStatus xmc::i2c::init();

I2C ペリフェラルを初期化します。

I2C API を使う前に一度だけ呼び出します。 戻り値は XmcStatus で、成功時は XMC_OK です。

xmc::i2c::deinit

void xmc::i2c::deinit();

I2C ペリフェラルを終了します。

以後 I2C を使用しない場合に呼び出します。戻り値はありません。

トランザクション制御

xmc::i2c::tryLock

bool xmc::i2c::tryLock();

非ブロッキングで I2C ロック取得を試みます。

ロック取得に成功した場合は true、他の処理が使用中で取得できなかった場合は false を返します。

xmc::i2c::lock

XmcStatus xmc::i2c::lock();

ロックが取得できるまで待機してから I2C トランザクションを開始します。

戻り値は XmcStatus です。通常は XMC_OK が返ります。

xmc::i2c::unlock

XmcStatus xmc::i2c::unlock();

I2C トランザクションを終了します。

lock() または tryLock() で開始したトランザクションの終端として呼び出します。 戻り値は XmcStatus です。

通信設定とバス復旧

xmc::i2c::setBaudrate

XmcStatus xmc::i2c::setBaudrate(uint32_t baudrate);

I2C 通信速度 [Hz] を設定します。

baudrate には希望するクロック周波数を指定します。 戻り値は XmcStatus で、プラットフォームが設定に失敗した場合はエラーコードを返します。

xmc::i2c::resetBus

XmcStatus xmc::i2c::resetBus();

SCL トグルによりスタックしたバスを復旧します。

スレーブが SDA を保持したままになった場合など、異常状態からの回復に使用します。 戻り値は XmcStatus です。

データ転送

xmc::i2c::writeBlocking

XmcStatus xmc::i2c::writeBlocking(uint8_t devAddr, const uint8_t *data, uint32_t size, bool nostop);

I2C デバイスへデータを書き込みます。 devAddr は 7bit アドレスです。

data は送信するバッファ先頭アドレス、size は送信バイト数です。 nostoptrue にすると STOP 条件を出さずに終了するため、続けて repeated start を伴う操作を行えます。

戻り値は XmcStatus です。

xmc::i2c::readBlocking

XmcStatus xmc::i2c::readBlocking(uint8_t devAddr, uint8_t *data, uint32_t size, bool nostop);

I2C デバイスからデータを読み出します。

nostoptrue にすると STOP 条件を出さないため、 レジスタアドレス書き込み後の連続読み出しなどに利用できます。

data は受信データの格納先、size は受信バイト数です。 戻り値は XmcStatus です。