Hobby Lab 趣味のモノ作り実験のサイトです。
部品 プロセッサー他 CH32V 203_test_I2C
1 概要
 1-1 MPUとの接続Pin
 1-2 メモ
2 プログラム概要
 2-1 動作概要
 2-1-1 概要と参考ページ
 2-1-2 設定レジスタ内容
3 プログラム
 3-1 プログラム内容
 3-2 補足説明
 3-2-1 初期化
 3-2-1-1 RCC_APBxPeriphClockCmd
 3-2-1-2 GPIO_PinRemapConfig
 3-2-1-3 I2C_Init
4 結果
 4-1 全体信号
 4-2 ADS1115_Start信号
 4-3 ADS1115_Read信号
 4-4 USART_Printf

I2C 関係
プロトコル
 I2C について
スレーブ関係資料
 ADS1115 16bit4CH A/D
 INA226 直流電圧電流計
 BME280 気圧,湿度,気温計
 BH1750 照度計
 DS3231 時計
 SSD1306 0.96"OLED
マスター関係プログラム
 I2C RaspberryPi_設定
ADS1115
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226
 Arduino
 RaspberryPi_Python
BNE280
 Arduino
 RaspberryPi_Python
BH1750
 Arduino
 RaspberryPi_Python
DS3231
 Arduino
 RaspberryPi_Python
SSD1306
 Arduino
 RaspberryPi_Python

Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他

1 概要


ADコンバータはADS1115です。

1-1 MPUとの接続Pin

PinNo一覧表
GPIOCH32V203K8T6CH32V203C8T6
①Default alternate
function
②Remapping
function
I2C1_SMBAPB5 --28--41--
I2C1_SCL PB6 PB82931?4245
I2C1_SDA PB7 PB930--4346
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(アラート)信号用のピン を指す。
主な機能と特徴は以下の通りです。
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モードで動作している際に、アラート機能を有効にするための専用ピンである、と理解できます。




2 プログラム概要

2-1 動作概要

2-1-1 概要と参考ページ

(1)動作内容
 ADS1115 のAN0電圧を読み取る物を作成する。
 なお電圧値は標準のUSARTを使用し表示する。

(2)対応する接続ピン
I2C
I2C1_SCLPB6
I2C1_SDAPB7
USART
USART1_TXA9
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 プログラム内容

ADS1115_Start、ADS1115_Read サブルーチン内①〜⑰は『Software』『Protocol』フォルダー内
『I2C全般』ファイルの 2.読み書き信号 を参照

 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とは
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 以下を参照

 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_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%の場合):
CCR値= PCLK1[Hz] 2×I2Cスピード[Hz]
例: PCLK1が8MHzで、100kHzのI2Cスピードが必要な場合:
CCR値= 8×106 2×100×103 =40
この場合、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)

■ I2C_OwnAddress1
スレーブモードで動作する際に、自身のアドレスで今回はマスターで使用するため 0x00
アドレスは 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信号)を返す。
以下の役割で使用されます。
マスター受信時の制御:
マスターデバイスがスレーブデバイスからデータを受信している際、最後のバイトを受信した後に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ビットアドレスを使用する





テスト状況

4 結果

 4-1 全体信号

左〜右へ信号は流れ最初(左側信号)は

変換指示 サブルーチン ADS1115_Start 信号

10(ms)をおいて

データ取得 サブルーチン ADS1115_Read 信号


 4-2 ADS1115_Start 信号

変換指示

書き込みモード
ポインタレジスターに 01(設定レジスタに書き込み指示)を書き込み
設定レジスタに 0xC5E3 を書き込んだ

 4-3 ADS1115_Read 信号

データ取得

書き込みモード
 ポインタレジスターに 00(変換レジスタのデータを読み込み)を書き込み
続いて読み込みモード
 2Byteデータ 0x2C93 (テスト入力電圧 0.713mV) を読み込みしている
注意
なお下部表示は書き込みモードと読み込みモードの間にストップコンディションを入れた場合を示す。
I2C規格書にはストップコンディションは入れていないが、入れても動作していることを確認した。

 4-4 USART_Printf

この時ADS1115にAN0に入力している電圧は100(mV)だった。





































更新日 2025/11/24 19:52  管理者 平林 剛Hirabayashi Takeshi