Inter-Integrated Circuit (I2C) peripheral support(i2c.h)
I2C 周辺装置のサポート
概要
I2Cインタフェースを使った周辺装置との接続をサポートします。
重要な注意点
内蔵のI2Cペリフェラルにはいくつかの重要な既知の問題があります。 詳細は、STM32F10xx8およびSTM32F10xxBの正誤表(ST Doc ID 14574 Rev 8)、2.11.1項、2.11.2項を参照してください。 これらの問題の重要な結果は、I2C割り込みを先取りしてはいけないということです。 したがって、(デフォルトで)Wirishは、システムで最も高いI2C割り込み優先順位(優先度0)を使用します。 その他の割り込み優先順位は低く設定されます。
データ型
■ struct i2c_reg_map
I2Cレジスタマップタイプ
__IO uint32 CR1 制御レジスタ 1
__IO uint32 CR2 制御レジスタ 2
__IO uint32 OAR1 自アドレス・レジスタ 1
__IO uint32 OAR2 自アドレス・レジスタ 2
__IO uint32 DR データ・レジスタ
__IO uint32 SR1 ステータス・レジスタ 1
__IO uint32 SR2 ステータス・レジスタ 2
__IO uint32 CCR クロック制御レジスタ
__IO uint32 TRISE TRISE(立ち上がり時間)レジスタ
■ i2c_state enum
`I2Cデバイスの状態
I2C_STATE_DISABLED 0 Disabled
I2C_STATE_IDLE 1 Idle
I2C_STATE_XFER_DONE 2 Done with transfer
I2C_STATE_BUSY 3 Busy
I2C_STATE_ERROR -1 Error occurred
■ I2C message type
I2Cメッセージタイプ
uint16 addr アドレス
uint16 flags I2C_MSG_READとI2C_MSG_10BIT_ADDRの論理和
uint16 length メッセージ長
uint16 xferred メッセージ転送
uint8 *data データ
関連定義
I2C_MSG_READ 0x1 書き込みがデフォルトを読み込みに変更
I2C_MSG_10BIT_ADDR 0x2 10ビットアドレス利用
■ struct i2c_dev
I2Cデバイスタイプ パブリックメンバー
struct i2c_reg_map *regs レジスタマップ
struct i2c_msg *msg メッセージ
uint32 error_flags エラーフラグ、I2Cエラー条件で設定
volatile uint32 timestamp 内部で使用
struct gpio_dev *gpio_port 非推奨。scl_port、sda_portを利用のこと。非ヌル時、SDA、SCLピンのGPIOポートとして使用。 nul時、SDAにsda_port、SDAにsda_portを使用
struct gpio_dev *sda_port SDA GPIO デバイス(gpio_port を参照してください)
struct gpio_dev *scl_port SCL GPIO デバイス (gpio_port を参照してください)
uint16 msgs_left メッセージの残り
uint8 sda_pin gpio_portのSDA ビット
uint8 scl_pin gpio_portのSCL ビット
rcc_clk_id clk_id RCC clock information
nvic_irq_num ev_nvic_line イベント IRQ 番号
nvic_irq_num er_nvic_line エラー IRQ 番号
volatile i2c_state state Device state
デバイス
■extern i2c_dev* const I2C1 I2C1 デバイス
■extern i2c_dev* const I2C2 I2C2 デバイス
API関数
■ void i2c_init(i2c_dev *dev)
I2Cデバイスを初期化し、レジスタをデフォルト値にリセットします。
引数
dev :初期化するデバイス
■ void i2c_master_enable(i2c_dev *dev, uint32 flags)
I2Cデバイスをバスマスタとして初期化します。
引数
dev :有効にするデバイス
flags :
I2C_FAST_MODE:400kHz動作、
I2C_DUTY_16_9:16/9 Tlow / Thighデューティサイクル(高速モードの場合のみ)、
I2C_BUS_RESET:初期化時にハングしたスレーブをリセット
I2C_10BIT_ADDRESSING:Enable 10 ビット・アドレッシング、
I2C_REMAP:I2C1をSCL / PB8 SDA / PB9にリマップ
■ int32 i2c_master_xfer(i2c_dev *dev, i2c_msg *msgs, uint16 num, uint32 timeout)
I2Cトランザクションを処理します。
トランザクションは、1つ以上のi2c_msgで構成され、読み取りまたは書き込みが可能です。
複数のi2c_msgは、メッセージ間で繰り返し開始を生成します。
引数
dev :I2Cデバイス
msgs :送受信するメッセージ
num :送受信するメッセージ数
timeout :転送を中止するまでのバスアイドルタイムアウト(ミリ秒単位)。 0はタイムアウトなし
戻り値
成功 :0
プロトコルエラー :I2C_ERROR_PROTOCOL
転送がタイムアウト :I2C_ERROR_TIMEOUT
■ void i2c_bus_reset(const i2c_dev *dev)
I2Cバスをリセットします。
リセットは、ハングしたスレーブがSDAおよびSCLを解放してからSTART条件を生成し、次にSTOP条件を生成するまで、パルスをクロック出力することによって実行されます。
引数
dev :I2Cデバイス
■ void i2c_disable(i2c_dev *dev)
I2Cデバイスを無効にします。
この関数は、対応するペリフェラルを無効にし、デバイスの状態をI2C_STATE_DISABLEDとしてマークします。
引数
dev :無効にするI2Cデバイス
■ void i2c_peripheral_enable(i2c_dev *dev)
I2C周辺機器の電源を入れます。
引数
dev :オンにするデバイス
■ void i2c_peripheral_disable(i2c_dev *dev)
I2C周辺機器をオフにします。
引数
dev :オフにするデバイス
■ void i2c_write(i2c_dev *dev, uint8 byte)
送信レジスタにデータをセットします。
引数
dev :I2C デバイス
byte :書き込むバイトデータ
■ void i2c_set_input_clk(i2c_dev *dev, uint32 freq)
入力クロック周波数をMHz単位で設定します。
引数
dev :I2C デバイス
freq :周波数(メガヘルツ 2〜36)
■ void i2c_set_clk_control(i2c_dev *dev, uint32 val)
I2Cクロック制御レジスタを設定します。
RM008を参照
引数
dev :I2C デバイス
val :クロック制御レジスタに使用する値(高速/標準モード)
■ void i2c_set_trise(i2c_dev *dev, uint32 trise)
SCLの立ち上がり時間を設定します。
引数
dev :I2C デバイス
trise :高速/標準モードでの最大立ち上がり時間(関連する式についてはRM0008を参照)。
■ void i2c_start_condition(i2c_dev *dev)
バス上に開始条件を生成します。
引数
dev :I2C デバイス
■ void i2c_stop_condition(i2c_dev *dev)
バス上に停止条件を生成します。
引数
dev :I2C デバイス
■ void i2c_enable_irq(i2c_dev *dev, uint32 irqs)
1つまたは複数のI2C割り込みを有効にします。
引数
dev :I2C デバイス
irqs :I2C_IRQ_ERROR(エラー割り込み)、I2C_IRQ_EVENT(イベント割り込み)、I2C_IRQ_BUFFER(バッファ割り込み)
■ void i2c_disable_irq(i2c_dev *dev, uint32 irqs)
1つまたは複数のI2C割り込みを無効にします。
引数
dev :I2C デバイス
irqs :I2C_IRQ_ERROR(エラー割り込み)、I2C_IRQ_EVENT(イベント割り込み)、I2C_IRQ_BUFFER(バッファ割り込み)
■ void i2c_enable_ack(i2c_dev *dev)
I2C確認応答を有効にする。
引数
dev :I2C デバイス
I2C確認応答を無効にする。
■ void i2c_disable_ack(i2c_dev *dev)
引数
dev :I2C デバイス
■ void i2c_config_gpios(const i2c_dev *dev)
デバイスのGPIOを設定します。
GPIOデバイスdev-> sda_pinとdev-> scl_pinをGPIOデバイスdev-> gpio_portに設定して、I2Cデバイスdevで使用します。
引数
dev :I2C デバイス
■ void i2c_master_release_bus(const i2c_dev *dev)
I2Cバスを制御するGPIOを解放します。
devに制御されたI2Cバスをマスタとして解放し、GPIOデバイスdev-> gpio_port上のdev-> sda_pinとdev-> scl_pinをI2Cデバイスdevから切断します。
引数
dev :I2C デバイス
レジスタマップベースポインタ
■ I2C1_BASE ((struct i2c_reg_map*)0x40005400) STM32F1 I2C1レジスタ・マップ・ベース・ポインタ
■ I2C2_BASE ((struct i2c_reg_map*)0x40005800) STM32F1 I2C1レジスタ・マップ・ベース・ポインタ
レジスタのビット定義
制御レジスタ1(CR1)
ビット番号
I2C_CR1_SWRST (1U << 15) (rw) ソフトウェアリセット
I2C_CR1_ALERT (1U << 13) (rw) SMBus アラート
I2C_CR1_PEC (1U << 12) (rw) パケットエラーチェック
I2C_CR1_POS (1U << 11) (rw) 確認応答 / PEC 位置(データ受信)
I2C_CR1_ACK (1U << 10) (rw) 確認応答有効
I2C_CR1_STOP (1U << 9) (rw) STOP 生成
I2C_CR1_START (1U << 8) (rw) START 生成
I2C_CR1_NOSTRETCH (1U << 7) (rw) クロック伸長ディセーブル(スレーブモード)
I2C_CR1_ENGC (1U << 6) (rw) 同報イネーブル
I2C_CR1_ENPEC (1U << 5) (rw) PEC イネーブル
I2C_CR1_ENARP (1U << 4) (rw) ARP イネーブル
I2C_CR1_SMBTYPE (1U << 3) (rw) SMBus タイプ
I2C_CR1_SMBTYPE_DEVICE (0U << 3) (rw) SMBus タイプ:SMBus デバイス
I2C_CR1_SMBTYPE_HOST (1U << 3) (rw) SMBus タイプ:SMBus ホスト
I2C_CR1_SMBUS (1U << 1) (rw) SMBus モード
I2C_CR1_SMBUS_I2C (0U << 1) (rw) SMBus モード: I2C モード
I2C_CR1_SMBUS_SMBUS (1U << 1) (rw) SMBus モード: SMBus モード
I2C_CR1_PE (1U << 0) (rw) ペリフェラルイネーブル
制御レジスタ2(CR2)
ビット番号
I2C_CR2_LAST (1U << 12) (rw) DMA 最終転送
I2C_CR2_DMAEN (1U << 11) (rw) DMA リクエストイネーブル
I2C_CR2_ITBUFEN (1U << 10) (rw) バッファ割り込みイネーブル
I2C_CR2_ITEVTEN (1U << 9) (rw) イベント割り込みイネーブル
I2C_CR2_ITERREN (1U << 8) (rw) エラー割り込みイネーブル
I2C_CR2_FREQ 0x3F (rw) ペリフェラルクロック周波数
自己アドレスレジスタ 1(I2C_OAR1)
ビット番号
I2C_OAR1_ADDMODE (1U << 15) (rw) アドレスモード(スレーブモード)
I2C_OAR1_ADDMODE_7_BIT (0U << 15) (rw) アドレスモード: 7 ビットスレーブアドレス
I2C_OAR1_ADDMODE_10_BIT (1U << 15) (rw) アドレスモード: 0 ビットスレーブアドレス
I2C_OAR1_ADD 0x3FF (rw) インタフェースアドレス
自己アドレスレジスタ 2(I2C_OAR2)
ビット番号
I2C_OAR2_ADD2 0xFE (rw) インタフェースアドレス
I2C_OAR2_ENDUAL 1U (rw) デュアルアドレスモードイネーブル
ステータスレジスタ 1(I2C_SR1)
ビット番号
I2C_SR1_SMBALERT (1U << 15) (rc_w0) SMBus アラート
I2C_SR1_TIMEOUT (1U << 14) (rc_w0) Timeout または Tlow エラー
I2C_SR1_PECERR (1U << 12) (rc_w0) 受信時の PEC エラー
I2C_SR1_OVR (1U << 11) (rc_w0) オーバーラン/アンダーラン
I2C_SR1_AF (1U << 10) (rc_w0) 確認応答障害
I2C_SR1_ARLO (1U << 9) (rc_w0) アービトレーションロスト(マスタモード)
I2C_SR1_BERR (1U << 8) (rc_w0) バスエラー
I2C_SR1_TXE (1U << 7) (r) データレジスタエンプティ(トランスミッタ)
I2C_SR1_RXNE (1U << 6) (r) データレジスタノットエンプティ(レシーバ)
I2C_SR1_STOPF (1U << 4) (r) STOP 検出(スレーブモード)
I2C_SR1_ADD10 (1U << 3) (r) 10 ビットヘッダの送信(マスタモード)
I2C_SR1_BTF (1U << 2) (r) バイト転送終了
I2C_SR1_ADDR (1U << 1) (r) アドレス送信(マスタモード)/アドレス一致(スレーブモード)
I2C_SR1_SB (1U << 0) (r) スタートビット(マスタモード
ステータスレジスタ 2(I2C_SR2)
ビット番号
I2C_SR2_PEC 0xFF00 (r) パケットエラーチェックレジスタ
I2C_SR2_DUALF (1U << 7) (r) デュアルフラグ(スレーブモード)
I2C_SR2_SMBHOST (1U << 6) (r) SMBus ホストヘッダ(スレーブモード)
I2C_SR2_SMBDEFAULT (1U << 5) (r) SMBus デバイスデフォルトアドレス(スレーブモード)
I2C_SR2_GENCALL (1U << 4) (r) 同報アドレス(スレーブモード)
I2C_SR2_TRA (1U << 2) (r) トランスミッタ/レシーバ
I2C_SR2_BUSY (1U << 1) (r) バスビジー
I2C_SR2_MSL (1U << 0) (r) マスタ/スレーブ
クロック制御レジスタ(I2C_CCR)
ビット番号
I2C_CCR_FS (1U << 15) (rw) I2C マスタモード選択
I2C_CCR_DUTY (1U << 14) (rw) 高速モードデューティサイクル
I2C_CCR_DUTY_2_1 (0U << 14) (rw) 高速モードデューテ: 2/1
I2C_CCR_DUTY_16_9 (1U << 14) (rw) 高速モードデューテ:16/9
I2C_CCR_CCR 0xFFF (rw) 高速/標準モード(マスタモード)でのクロック制御レジスタ
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。
NAVER、ヤフオク等の営利目的の記事転用、リンク貼りは禁止です。