diff options
| -rw-r--r-- | docs/ja/i2c_driver.md | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/docs/ja/i2c_driver.md b/docs/ja/i2c_driver.md new file mode 100644 index 000000000..4030da631 --- /dev/null +++ b/docs/ja/i2c_driver.md | |||
| @@ -0,0 +1,128 @@ | |||
| 1 | # I2C マスタドライバ | ||
| 2 | |||
| 3 | <!--- | ||
| 4 | grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh | ||
| 5 | original document: 85041ff05:docs/i2c_driver.md | ||
| 6 | git diff 85041ff05 HEAD -- docs/i2c_driver.md | cat | ||
| 7 | --> | ||
| 8 | |||
| 9 | QMK で使われる I2C マスタドライバには、MCU 間のポータビリティを提供するための一連の関数が用意されています。 | ||
| 10 | |||
| 11 | ## 使用できる関数 | ||
| 12 | |||
| 13 | | 関数 | 説明 | | ||
| 14 | |-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||
| 15 | | `void i2c_init(void);` | I2C ドライバを初期化します。他のあらゆるトランザクションを開始する前に、この関数を一度だけ呼ぶ必要があります。 | | ||
| 16 | | `uint8_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 | | ||
| 17 | | `uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 | | ||
| 18 | | `uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 | | ||
| 19 | | `uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 | | ||
| 20 | | `uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 | | ||
| 21 | | `uint8_t i2c_stop(void);` | I2C トランザクションを終了します。 | | ||
| 22 | |||
| 23 | ### 関数の戻り値 | ||
| 24 | |||
| 25 | `void i2c_init(void)` を除く上にあるすべての関数は、次の真理値表にある値を返します。 | ||
| 26 | |||
| 27 | | 戻り値 | 説明 | | ||
| 28 | |--------|------------------------------| | ||
| 29 | | 0 | 処理が正常に実行されました。 | | ||
| 30 | | -1 | 処理に失敗しました。 | | ||
| 31 | | -2 | 処理がタイムアウトしました。 | | ||
| 32 | |||
| 33 | ## AVR | ||
| 34 | |||
| 35 | ### 設定 | ||
| 36 | |||
| 37 | I2Cマスタドライバを設定するために、次の定義が使えます。 | ||
| 38 | |||
| 39 | | 変数 | 説明 | 既定値 | | ||
| 40 | |---------|---------------------|--------| | ||
| 41 | | `F_SCL` | クロック周波数 (Hz) | 400KHz | | ||
| 42 | |||
| 43 | |||
| 44 | AVR は通常 I2C ピンとして使う GPIO が設定されているので、これ以上の設定は必要ありません。 | ||
| 45 | |||
| 46 | ## ARM | ||
| 47 | |||
| 48 | ARM の場合は、内部に ChibiOS I2C HAL ドライバがあります。この節では STM32 MCU を使用していると仮定します。 | ||
| 49 | |||
| 50 | ### 設定 | ||
| 51 | |||
| 52 | ARM MCU 用の設定はしばしば非常に複雑です。これは、多くの場合複数の I2C ドライバをさまざまなポートに対して割り当てられるためです。 | ||
| 53 | |||
| 54 | 最初に、必要なハードウェアドライバを有効にするために `mcuconf.h` ファイルをセットアップします。 | ||
| 55 | |||
| 56 | | 変数 | 説明 | 既定値 | | ||
| 57 | |-------------------------------|------------------------------------------------------------------------------------------------|--------| | ||
| 58 | | `#STM32_I2C_USE_XXX` | ハードウェアドライバ XXX の有効化/無効化(すべてのドライバを明示的にリストアップする必要あり) | FALSE | | ||
| 59 | | `#STM32_I2C_BUSY_TIMEOUT` | レスポンスの受信がない場合に I2C コマンドを中断するまでの時間 (ms) | 50 | | ||
| 60 | | `#STM32_I2C_XXX_IRQ_PRIORITY` | ハードウェアドライバ XXX の割り込み優先度(上級者向けの設定) | 10 | | ||
| 61 | | `#STM32_I2C_USE_DMA` | MCU がデータ送信を DMA ユニットにオフロードする機能の有効化/無効化 | TRUE | | ||
| 62 | | `#STM32_I2C_XXX_DMA_PRIORITY` | ハードウェアドライバ XXX に使用する DMA ユニットの優先度(上級者向けの設定) | 1 | | ||
| 63 | |||
| 64 | 次に `halconf.h` ファイル内で `#define HAL_USE_I2C` を `TRUE` にします。これにより ChibiOS が I2C ドライバを読み込みます。 | ||
| 65 | |||
| 66 | 最後に、使用したい I2C ハードウェアドライバに応じて正しい GPIO ピンを割り当てます。 | ||
| 67 | |||
| 68 | 標準では I2C1 ハードウェアドライバが使われます。もし他のハードウェアドライバを使う場合、 `config.h` ファイルに `#define I2C_DRIVER I2CDX` を追加します( X は使用するハードウェアドライバの番号です)。例えば I2C3 を有効化する場合、`config.h` ファイルに `#define I2C_DRIVER I2CD3` と定義します。これにより QMK I2C ドライバと ChibiOS I2C driver が同期されます。 | ||
| 69 | |||
| 70 | STM32 MCU では、使用するハードウェアドライバにより、さまざまなピンを I2C ピンとして設定できます。標準では `B6`, `B7` ピンが I2C 用のピンです。 I2C 用のピンを設定するために次の定義が使えます: | ||
| 71 | |||
| 72 | | 変数 | 説明 | 既定値 | | ||
| 73 | |-----------------------|--------------------------------------------------------------------------------------------------|---------| | ||
| 74 | | `I2C1_SCL_BANK` | SCL に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` | | ||
| 75 | | `I2C1_SDA_BANK` | SDA に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` | | ||
| 76 | | `I2C1_SCL` | SCL のピン番号 (0-9) | `6` | | ||
| 77 | | `I2C1_SDA` | SDA のピン番号 (0-9) | `7` | | ||
| 78 | | `I2C1_BANK`(非推奨) | 使用するピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`)。後継は `I2C1_SCL_BANK`, `I2C1_SDA_BANK` です。 | `GPIOB` | | ||
| 79 | |||
| 80 | ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します。 | ||
| 81 | |||
| 82 | STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx, STM32L1xx では I2Cv1 が使われます。 | ||
| 83 | STM32F0xx, STM32F3xx, STM32F7xx, STM32L4xx では I2Cv2 が使われます。 | ||
| 84 | |||
| 85 | #### I2Cv1 | ||
| 86 | |||
| 87 | STM32 MCU の I2Cv1 では、クロック周波数とデューティ比を次の変数で変更できます。詳しくは <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> を参照してください。 | ||
| 88 | |||
| 89 | | 変数 | 既定値 | | ||
| 90 | |--------------------|------------------| | ||
| 91 | | `I2C1_OPMODE` | `OPMODE_I2C` | | ||
| 92 | | `I2C1_CLOCK_SPEED` | `100000` | | ||
| 93 | | `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` | | ||
| 94 | |||
| 95 | #### I2Cv2 | ||
| 96 | |||
| 97 | STM32 MCU の I2Cv2 では、信号のタイミングパラメータを次の変数で変更できます。詳しくは <https://www.st.com/en/embedded-software/stsw-stm32126.html> を参照してください。 | ||
| 98 | |||
| 99 | | 変数 | 既定値 | | ||
| 100 | |-----------------------|--------| | ||
| 101 | | `I2C1_TIMINGR_PRESC` | `15U` | | ||
| 102 | | `I2C1_TIMINGR_SCLDEL` | `4U` | | ||
| 103 | | `I2C1_TIMINGR_SDADEL` | `2U` | | ||
| 104 | | `I2C1_TIMINGR_SCLH` | `15U` | | ||
| 105 | | `I2C1_TIMINGR_SCLL` | `21U` | | ||
| 106 | |||
| 107 | STM32 MCU では GPIO ピンを設定するとき、別の「代替機能」モードを使うことができます。これは I2Cv2 モードで使われるピンを変更するために必要です。適切な設定値は、使用している MCU のデータシートを参照してください。 | ||
| 108 | |||
| 109 | | 変数 | 既定値 | | ||
| 110 | |---------------------|--------| | ||
| 111 | | `I2C1_SCL_PAL_MODE` | `4` | | ||
| 112 | | `I2C1_SDA_PAL_MODE` | `4` | | ||
| 113 | |||
| 114 | #### その他 | ||
| 115 | |||
| 116 | `void i2c_init(void)` 関数は `weak` 属性が付いており、オーバーロードすることができます。この場合、上記で設定した変数は使用されません。可能な GPIO の設定については、 MCU のデータシートを参照してください。次に示すのは初期化関数の例です: | ||
| 117 | |||
| 118 | ```C | ||
| 119 | void i2c_init(void) | ||
| 120 | { | ||
| 121 | setPinInput(B6); // Try releasing special pins for a short time | ||
| 122 | setPinInput(B7); | ||
| 123 | wait_ms(10); // Wait for the release to happen | ||
| 124 | |||
| 125 | palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function | ||
| 126 | palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function | ||
| 127 | } | ||
| 128 | ``` | ||
