1 概要
ADコンバータはADS1115です。
1-1 MPUとの接続Pin
PinNo一覧表
emapping functionにする方法は
GPIO_PinRemapConfig (GPIO_Remap_I2C1, ENABLE); // SCL PB6->PB8 SDA PB7->PB9
で切り替わる。
| GPIO | CH32V203K8T6 | CH32V203C8T6 | |||||
|---|---|---|---|---|---|---|---|
| ①Default alternate function | ②Remapping function | ① | ② | ① | ② | ||
| I2C1_SMBA | PB5 | -- | 28 | -- | 41 | -- | |
| I2C1_SCL | PB6 | PB8 | 29 | 31? | 42 | 45 | |
| I2C1_SDA | PB7 | PB9 | 30 | -- | 43 | 46 | |
| I2C2_SCL | PB10 | -- | -- | -- | 21 | ーー | |
| I2C2_SDA | PB11 | -- | -- | -- | 21 | -- | |
emapping functionにする方法は
GPIO_PinRemapConfig (GPIO_Remap_I2C1, ENABLE); // SCL PB6->PB8 SDA PB7->PB9
で切り替わる。
1-2 メモ
I2C1_SMBAとは、
I2Cインターフェースに関連する SMBus Alert(アラート)信号用のピン を指す。
主な機能と特徴は以下の通りです。
I2Cインターフェースに関連する SMBus Alert(アラート)信号用のピン を指す。
主な機能と特徴は以下の通りです。
SMBusの機能拡張: 標準的なI2CバスはSCL(クロック)とSDA(データ)の2本の信号線で構成されますが、
SMBus(System Management Bus)規格ではオプションでALERT#(またはSMBA)という3本目の信号線が追加されます。
割り込み通知: SMBAピンは、スレーブデバイスがマスターデバイス(ホスト)に対してイベント(エラーやステータスの変化など)の発生を通知するための割り込みラインとして機能します。
ピンの共有: 複数のスレーブデバイスが1本のSMBAピンを共有してマスターに割り込みをかけることができます。
マスターは、アラート応答アドレス(Alert Response Address: ARA)にアクセスすることで、どのデバイスが割り込みを発生させたかを特定できます。
汎用I/Oとしても使用可能: I2C1_SMBAとして設定されていない場合、このピンは通常の汎用入出力(GPIO)ポートとしても利用できます。
つまり、I2C1_SMBA は、I2C1インターフェースがSMBusモードで動作している際に、アラート機能を有効にするための専用ピンである、と理解できます。割り込み通知: SMBAピンは、スレーブデバイスがマスターデバイス(ホスト)に対してイベント(エラーやステータスの変化など)の発生を通知するための割り込みラインとして機能します。
ピンの共有: 複数のスレーブデバイスが1本のSMBAピンを共有してマスターに割り込みをかけることができます。
マスターは、アラート応答アドレス(Alert Response Address: ARA)にアクセスすることで、どのデバイスが割り込みを発生させたかを特定できます。
汎用I/Oとしても使用可能: I2C1_SMBAとして設定されていない場合、このピンは通常の汎用入出力(GPIO)ポートとしても利用できます。
2 プログラム概要
2-1 動作概要
2-1-1 概要と参考ページ
(1)動作内容ADS1115 のAN0電圧を読み取る物を作成する。
なお電圧値は標準のUSARTを使用し表示する。
(2)対応する接続ピン
| I2C | ||
| I2C1_SCL | PB6 | |
| I2C1_SDA | PB7 | |
| USART | ||
| USART1_TX | A9 | |
| USART1_RX | A10 | |
(3)関係するページは
・I2Cの規則 [Software] [プロトコル関係] [ I2Cについて ]を参照。
・ADS1115のハード [部品] [sensor_AD_時計] [●Hardware] [ADS1115ハード]を参照。
2-1-2 設定レジスタ内容
| 測定箇所 | AIN0 and AINN =GND |
| 測定電圧範囲 | ±2.048V(default) |
| モード1 | パワーダウン シングルショット モード (default) |
| データレート | 860SPS 変換時間 1.63ms |
| モード2 | ヒステリシス付きの従来のコンパレータ (デフォルト) |
| ALERT/RDY ピンの極性 | アクティブ ロー (デフォルト) |
| ALERT/RDYの動作 | 非ラッチ コンパレータ (デフォルト) |
| コンパレータの動作 | コンパレータを無効にする (デフォルト) |
3 プログラム
3-1 プログラム内容
3-2 補足説明
3-2-1初期化
3-2-1-1 RCC_APBxPeriphClockCmd
クロックの供給は2箇所必要
I2C1 と AFIO
RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
AFIOとは
I2C1 と AFIO
RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
AFIOとは
GPIOピンと内蔵ペリフェラルの機能を内部で接続・マッピングするレジスターで
UART (シリアル通信)、SPI、I2C、タイマーのPWM出力、ADC入力などの特定のハードウェア機能を
実行する場合に使用する。
3-2-1-2 GPIO_PinRemapConfig
GPIOのPinをI2Cで使用するために再マッピングをする。
特定の周辺機能が使用するGPIOピンの割り当てを変更(再マッピング)するためのライブラリ関数です。 GPIO_Remap_I2C1の他非常に多いので詳細は ch32v20x_gpio.h の GPIO_Remap_define 以下を参照
特定の周辺機能が使用するGPIOピンの割り当てを変更(再マッピング)するためのライブラリ関数です。 GPIO_Remap_I2C1の他非常に多いので詳細は ch32v20x_gpio.h の GPIO_Remap_define 以下を参照
3-2-1-3 I2C_Init
Initで設定するのは下記 6種類
I2C_InitTSturcture.I2C_Mode
I2C_InitTSturcture.I2C_ClockSpeed
I2C_InitTSturcture.I2C_DutyCycle
I2C_InitTSturcture.I2C_OwnAddress1
I2C_InitTSturcture.I2C_Ack
I2C_InitTSturcture.I2C_AcknowledgedAddress
I2C_InitTSturcture.I2C_Mode
I2C_InitTSturcture.I2C_ClockSpeed
I2C_InitTSturcture.I2C_DutyCycle
I2C_InitTSturcture.I2C_OwnAddress1
I2C_InitTSturcture.I2C_Ack
I2C_InitTSturcture.I2C_AcknowledgedAddress
■ I2C_Modeについて
| モード名 | 概要 | 主な違い・特徴 |
|---|---|---|
| I2C_Mode _I2C | 標準的な I2C通信モード |
- クロック速度の範囲が広い (0 Hzから標準100 kHz, 高速400 kHz以上まで)。 - 最小クロック速度の規定がない。 - タイムアウト機能がない(スレーブがクロックストレッチを無期限に行う可能性がある) |
| I2C_Mode _SMBusDevice | SMBusプロトコルの スレーブデバイスモード |
- SMBusの電気的・タイミング仕様に準拠する。 - クロック速度は通常10 kHz〜100 kHzに制限される。 - タイムアウト機能がある(一定時間SCLがlowになるとバスをリセットするなど、堅牢性が高い)。 - オプションでパケットエラーチェック (PEC) をサポート。 |
| I2C_Mode _SMBusHost | SMBusプロトコルの ホスト(マスター)モード |
- SMBusデバイスモードと同様の仕様で動作するが、ホスト(マスター)として振る舞う。 - スレーブへのコマンド発行やデータ転送を制御する。 - タイムアウトやPECなどのSMBus特有の機能をハードウェアレベルでサポートすることがある。 |
■ I2C_ClockSpeed
標準モード(100 kHz = 100000)や高速モード(400 kHz = 400000)
接続機器を確認して設定すること。
レジスターを設定する場合
接続機器を確認して設定すること。
レジスターを設定する場合
I2Cクロック速度は、主に以下の2つのレジスタによって決定されます:
・I2C_CTLR2 (Frequency bits 0-5): ペリフェラルクロック周波数 (PCLK1) をMHz単位で設定します。
・I2C_CFGR (CCR bits 0-11): クロック制御レジスタで、SCLクロック周期を計算するための値を設定します。
計算式(標準モード、デューティ比50%の場合):
例: PCLK1が8MHzで、100kHzのI2Cスピードが必要な場合:
この場合、I2C_CTLR2 には 8 を、I2C_CFGR のCCRフィールドには 40 を設定します。
接続している機器の速度から決定する。
・I2C_CFGR (CCR bits 0-11): クロック制御レジスタで、SCLクロック周期を計算するための値を設定します。
計算式(標準モード、デューティ比50%の場合):
例: PCLK1が8MHzで、100kHzのI2Cスピードが必要な場合:
この場合、I2C_CTLR2 には 8 を、I2C_CFGR のCCRフィールドには 40 を設定します。
接続している機器の速度から決定する。
■ I2C_DutyCycle
・スタンダードモード (Standard Mode: Sm, 最大100 kHz):
デューティサイクル比は通常 1:1 (T_low = T_high) です。
・ファストモード (Fast Mode: Fm, 最大400 kHz):
選択可能な2つのデューティサイクル比があります:
2:1 (T_low = 2 * T_high)
16:9 (T_low = 16/9 * T_high, または約1.8倍)
※MounRiverStudioでは ch32v20x_i2c.h を見ると スタンダードモードが無く、2種類を選択するようです。
/* I2C_duty_cycle_in_fast_mode */
#define I2C_DutyCycle_16_9 ((uint16_t)0x4000)
#define I2C_DutyCycle_2 ((uint16_t)0xBFFF)
デューティサイクル比は通常 1:1 (T_low = T_high) です。
・ファストモード (Fast Mode: Fm, 最大400 kHz):
選択可能な2つのデューティサイクル比があります:
2:1 (T_low = 2 * T_high)
16:9 (T_low = 16/9 * T_high, または約1.8倍)
※MounRiverStudioでは ch32v20x_i2c.h を見ると スタンダードモードが無く、2種類を選択するようです。
/* I2C_duty_cycle_in_fast_mode */
#define I2C_DutyCycle_16_9 ((uint16_t)0x4000)
#define I2C_DutyCycle_2 ((uint16_t)0xBFFF)
■ I2C_OwnAddress1
スレーブモードで動作する際に、自身のアドレスで今回はマスターで使用するため 0x00
アドレスは OwnAddress1 と OwnAddress2 の2つに設定できる。
アドレスは OwnAddress1 と OwnAddress2 の2つに設定できる。
■ I2C_Ack
I2C通信プロトコルにおけるアクノリッジ (ACK: Acknowledge)信号の制御に関連する機能または関数
#define I2C_Ack_Enable ((uint16_t)0x0400)
#define I2C_Ack_Disable ((uint16_t)0x0000)
I2C通信では、データを送信した後、受信側がデータを受信できたことを送信側に知らせるためにACK信号 (または受信できなかったことを知らせるNACK信号)を返す。
以下の役割で使用されます。
これにより、スレーブは転送を終了する必要があることを認識します。
#define I2C_Ack_Enable ((uint16_t)0x0400)
#define I2C_Ack_Disable ((uint16_t)0x0000)
I2C通信では、データを送信した後、受信側がデータを受信できたことを送信側に知らせるためにACK信号 (または受信できなかったことを知らせるNACK信号)を返す。
以下の役割で使用されます。
マスター受信時の制御:
マスターデバイスがスレーブデバイスからデータを受信している際、最後のバイトを受信した後にNACK (非アクノリッジ)を送信するように設定するために使用されます。これにより、スレーブは転送を終了する必要があることを認識します。
ACK信号の有効化・無効化:
CH32Vのペリフェラルライブラリでは、I2Cハードウェアが自動的にACK信号を 生成またはチェックするように設定するための関数である可能性があります。ACKポーリング:
EEPROMなどのデバイスへの書き込みが完了したかどうかを確認するために、マスターがアドレスを送信し、 ACKが返ってくるまでポーリングする際に、この機能が関与する場合があります。■ I2C_AcknowledgedAddress
アドレスビット長指定
#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000)
#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000)
ほとんどのI2Cデバイスは7ビットアドレスを使用する
#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000)
#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000)
ほとんどのI2Cデバイスは7ビットアドレスを使用する

テスト状況
4 結果
4-1 全体信号
左〜右へ信号は流れ最初(左側信号)は
変換指示 サブルーチン ADS1115_Start 信号
10(ms)をおいてデータ取得 サブルーチン ADS1115_Read 信号
4-2 ADS1115_Start 信号
変換指示
書き込みモード
ポインタレジスターに 01(設定レジスタに書き込み指示)を書き込み
設定レジスタに 0xC5E3 を書き込んだ
設定レジスタに 0xC5E3 を書き込んだ
4-3 ADS1115_Read 信号
データ取得
書き込みモードポインタレジスターに 00(変換レジスタのデータを読み込み)を書き込み
続いて読み込みモード
2Byteデータ 0x2C93 (テスト入力電圧 0.713mV) を読み込みしている
注意
なお下部表示は書き込みモードと読み込みモードの間にストップコンディションを入れた場合を示す。
I2C規格書にはストップコンディションは入れていないが、入れても動作していることを確認した。
4-4 a> USART_Printf
この時ADS1115にAN0に入力している電圧は100(mV)だった。
