RXduino  1.20a
RXduinoマニュアル 最終更新日 平成26年6月29日
関数
tkdn_i2c.h

RXマイコンに、I2Cの周辺デバイスを接続してアクセスするためのルーチン [詳細]

#include "tkdn_hal.h"

ソースコードを見る。

関数

void i2c_init (i2c_info *i2c, int sda, int scl)
 I2C(マスター)を操作するための初期化 [詳細]
 
void i2c_init_slave (i2c_info *i2c, int sda, int scl, unsigned char addr)
 I2C(スレーブ)を操作するための初期化 [詳細]
 
int i2c_request_from (i2c_info *i2c, unsigned char address, int count)
 I2Cデバイスに対して受信シーケンスを発行し、データを読み出す [詳細]
 
int i2c_available (i2c_info *i2c)
 受信バッファ内に格納されているデータ数を返す [詳細]
 
int i2c_read (i2c_info *i2c)
 受信バッファからデータを1バイト取り出す [詳細]
 
void i2c_begin_transmission (i2c_info *i2c, unsigned char address)
 I2Cデバイスに対して送信を開始するための準備をする [詳細]
 
int i2c_write (i2c_info *i2c, unsigned char data)
 送信バッファの末尾に1バイトのデータを追加する [詳細]
 
unsigned char i2c_end_transmission (i2c_info *i2c)
 ターゲットデバイスに対してI2Cの送信シーケンスを発行する [詳細]
 
void i2c_set_freq (int freq)
 I2Cの周波数を変更する [詳細]
 

説明

RXマイコンに、I2Cの周辺デバイスを接続してアクセスするためのルーチン

このライブラリは、RXマイコンの任意の端子を通じて、I2C周辺デバイスと接続できます。
RXマイコンに内蔵されたRIICモジュールではなく、GPIOを使っているので、任意の端子を通じて操作できます。

tkdn_i2c.h で定義されています。

関数

void i2c_init ( i2c_info *  i2c,
int  sda,
int  scl 
)

I2C(マスター)を操作するための初期化

この関数を呼び出すと、引数i2cで指定された構造体のメンバを初期化し、I2Cを使用する準備をします。
RXマイコンがI2Cマスターになります。
引数に指定するI2C構造体は、この関数を呼び出すユーザアプリ側で用意してください。

引数
[in]i2c初期化したいi2c構造体へのポインタ
sdaSDA(データ端子)のピンの番号。任意のピンが使用できる。
sclSCL(クロック端子)のピンの番号。任意のピンが使用できる。
覚え書き
SDA端子はACKを受信する時に内蔵プルアップが有効になるので、外付けのプルアップ抵抗がなくてもそれなりに通信はできるが、より安定した高速動作のためにはプルアップ抵抗を外付けすることが望ましい
void i2c_init_slave ( i2c_info *  i2c,
int  sda,
int  scl,
unsigned char  addr 
)

I2C(スレーブ)を操作するための初期化

この関数を呼び出すと、引数i2cで指定された構造体のメンバを初期化し、I2Cを使用する準備をします。
RXマイコンがI2Cスレーブになります。
引数に指定するI2C構造体は、この関数を呼び出すユーザアプリ側で用意してください。

引数
[in]i2c初期化したいi2c構造体へのポインタ
sdaSDA(データ端子)のピンの番号
sclSCL(クロック端子)のピンの番号
addr自身のI2Cアドレス
覚え書き
この関数は作成されていない。すなわちI2Cスレーブモードは使用できない。
TODO:
いずれI2Cスレーブモードを作る必要があるだろう
int i2c_request_from ( i2c_info *  i2c,
unsigned char  address,
int  count 
)

I2Cデバイスに対して受信シーケンスを発行し、データを読み出す

読み出したデータ数は i2c_available() 関数で確認する。バッファ中のデータ i2c_read() 関数で読み出す。

引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
addressターゲットデバイスのアドレス(7bit)
RD/WRを示すビットは含まず、0~0x7Fまでの純粋なアドレスを与えること。
count読み出したいデータのバイト数。範囲は0~260。260以上の値を指定した場合は260に切り捨てられる。
戻り値
実際に受信したバイト数。ターゲットデバイスがNACKを返した場合は、countで指定した値に満たなくても終了する。
int i2c_available ( i2c_info *  i2c)

受信バッファ内に格納されているデータ数を返す

引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
戻り値
データ数(バイト単位)
int i2c_read ( i2c_info *  i2c)

受信バッファからデータを1バイト取り出す

引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
戻り値
データがある場合は0~255を返す。データがない場合は-1を返す。
void i2c_begin_transmission ( i2c_info *  i2c,
unsigned char  address 
)

I2Cデバイスに対して送信を開始するための準備をする

覚え書き
この関数は送信バッファを初期化するだけで、実際の動作は行わない。繰り返し呼ぶと、送信バッファが先頭に戻る。
引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
addressターゲットデバイスのアドレス(7bit)
RD/WRを示すビットは含まず、0~0x7Fまでの純粋なアドレスを与えること。
戻り値
なし
int i2c_write ( i2c_info *  i2c,
unsigned char  data 
)

送信バッファの末尾に1バイトのデータを追加する

覚え書き
この関数は送信バッファにデータを溜めるだけで、実際の動作は行わない
引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
data送信したでデータ
戻り値
成功したら1を返す。送信バッファ(260バイト)に空き容量が無ければ失敗して0を返す
unsigned char i2c_end_transmission ( i2c_info *  i2c)

ターゲットデバイスに対してI2Cの送信シーケンスを発行する

I2Cの送信はこの関数を実行して初めて実際に行われる。
送信されるターゲットアドレスは i2c_begin_transmission() 関数で指定したもの。 送信データは i2c_write() 関数でバッファに格納されたもの。

引数
[in]i2ci2c_init() 関数でセットアップされた構造体へのポインタ
戻り値
戻り値は以下のとおり
  • 0: 成功
  • 1: 送信バッファ溢れ
  • 2: スレーブアドレス送信時にNACKを受信
  • 3: データ送信時にNACKを受信
  • 4: その他のエラー
void i2c_set_freq ( int  freq)

I2Cの周波数を変更する

空ループで測っている。タイマを使ってキャリブレーションしているので、それなりに正確な値が出るはず。

引数
[in]freqクロックの周波数をHz単位で指定する。有効な値は1~200000程度。基本的にソフトでやっているので400kHzは出ない。
戻り値
なし