Skip to content

Latest commit

 

History

History
560 lines (427 loc) · 54.7 KB

i2c_master_controller.org

File metadata and controls

560 lines (427 loc) · 54.7 KB

I2C Master Controller

I2C Master Controllerは、OBC Moduleの外部に実装される I2Cデバイスに通信するために使用する External I2C Interfaceを制御するためのモジュールです。

OBC Moduleは、OBC Module上のセンサーにアクセスするための I2C Interface (Internal I2C)と、OBC Moduleの外部の I2Cデバイスにアクセスするための I2C Interface (External I2C)を持っています。 Internal I2Cの制御は、System Monitorに搭載されている Board Health Monitor機能により行います。 Board Health Monitor機能に関する詳細は、「System Monitor」の章を参照してください。

レジスタ詳細

I2C Master Controllerは、Base Address 0x4F03_0000に配置されています。

OffsetSymbolRegisterInitial
0x0000I2CM_ENRI2C Master Enable Register0x00000000
0x0004I2CM_TXFIFORI2C Master TX FIFO Register0x00000000
0x0008I2CM_RXFIFORI2C Master RX FIFO Register0x00000000
0x000CI2CM_BSRI2C Master Bus Status Register0x00000000
0x0010I2CM_ISRI2C Master Interrupt Status Register0x00000000
0x0014I2CM_IERI2C Master Interrupt Enable Register0x00000000
0x0018I2CM_FIFOSRI2C Master FIFO Status Register0x00000000
0x001CI2CM_FIFORRI2C Master FIFO Reset Register0x00000000
0x0020I2CM_FTLSRI2C Master FIFO Threshold Level Setting Register0x00000000
0x0024I2CM_SCLTSRI2C Master SCL Timeout Setting Register0x00000000
0x0030I2CM_THDSTARI2C Master START Hold Timing Setting Register0x00000031
0x0034I2CM_TSUSTORI2C Master STOP Setup Timing Setting Register0x00000031
0x0038I2CM_TSUSTARI2C Master Repeated START Setup Timing Setting Register0x00000031
0x003CI2CM_THIGHRI2C Master Clock High Timing Setting Register0x00000039
0x0040I2CM_THDDATRI2C Master Data Hold Timing Setting Register0x00000004
0x0044I2CM_TSUDATRI2C Master Data Setup Timing Setting Register0x00000039
0x0048I2CM_TBUFRI2C Master Bus Free Timing Setting Register0x00000045
0x004CI2CM_TBSMPLRI2C Master Bus Sampling Timing Setting Register0x00000000
0xF000I2CM_VERI2C Master Controller IP Version Register-

I2C Master Enable Register (Offset 0x0000)

I2C Master Enable Registerは、I2C Master ControllerのEnable設定を行うレジスタです。

EnableがOFFの時は、I2C Master ControllerはI2C Busに接続される FPGAのBufferを HiZ状態とし、一切の送受信を行いません。 EnableをONにすると、I2C BusがIdle状態の時に送受信が可能となります。

bitSymbolFieldDescriptionR/W
31:1-ReservedReserved-
0I2CM_ENI2C EnableI2C Master ControllerのEnable設定を行います。0: Enable OFF 1: Enable ONR/W

I2C Master TX FIFO Register (Offset 0x0004)

I2C Master TX FIFO Registerは、I2Cデバイスへ送信するデータや、送受信データのフォーマットを設定するためのレジスタです。

レジスタに書き込む値は、転送状況によって変わります。

転送開始の 1 Byte目は、I2CM_TXDATAフィールドの ビット7:1に 通信する I2Cデバイスのデバイスアドレスを書き込み、ビット0に R/W情報として 次の転送サイクルが 送信モードの場合は”0”, 受信モードの場合は”1”を書き込みます。 ここで書き込まれた 8ビットのデータは MSB側から順にそのまま I2Cバスに出力されます。

1 Byte目にビット0に書き込まれた R/W情報によって、送信モード(R/W: 0)となる場合、2 Byte目以降は I2CM_TXDATAに転送データを書き込みます。 送信モードの場合、I2CM_TXDATAの書き込みと同時に I2CM_STOPか I2CM_RESTARTが “1”に書き込まれるまで転送が継続します。 I2CM_TXDATAと共に I2CM_STOPが”1”に書き込まれた場合は、データ送信の完了後に STOP Conditionが送信され、I2CM_TXDATAと共に I2CM_RESTARTが”1”に書き込まれた場合は、データ送信の完了後に Repeated START Conditionが送信されます。 この状態になると、次の送信は 1 Byte目の送信状態に戻ります。

1 Byte目にビット0に書き込まれた R/W情報によって、受信モード(R/W: 1)となる場合、2 Byte目の I2CM_TXDATAには受信データの Byte数を書き込みます。 この時、書き込む受信データの Byte数は、「実際に受信する Byte数 - 1」の値を設定します。 また、最終Byteとなるデータの受信後に STOP Conditionまたは Repeated START Conditionを送信するため、I2CM_STOPか I2CM_RESTARTのどちらかのビットを”1”にセットします。

本レジスタの設定については「I2C通信操作手順例」も参照してください。

bitSymbolFieldDescriptionR/W
31:10-ReservedReserved-
9I2CM_RESTARTI2C Repeated START Condition最終 Byteの転送完了後に I2C BusにRepeated START Conditionを送信する場合にセットするビットです。最終Byteの送受信後にRepeated START Conditionを挿入する場合は、このビットを”1”にセットします。WO
8I2CM_STOPI2C STOP Condition最終 Byteの転送完了後に I2C BusにSTOP Conditionを送信する場合にセットするビットです。最終Byteの送受信後にSTOP Conditionを送信する場合は、このビットを”1”にセットします。WO
7:0I2CM_TXDATAI2C Tx DataI2Cの送信データを設定します。このレジスタの書き込みデータは、送信モードでは送信データ, 受信モードでは 受信データ Byte数となります。WO

I2C Master RX FIFO Register (Offset 0x0008)

I2C Master RX FIFO Registerは、I2Cデバイスから受信したデータを読み出すためのレジスタです。

I2Cデバイスから受信データは RX FIFOに格納されます。 RX FIFOは 16 Byte実装されており、このレジスタを読み出す事で RX FIFOに格納されたデータを 1 Byteずつデータを読み出す事ができます。

bitSymbolFieldDescriptionR/W
31:8-ReservedReserved-
7:0I2CM_RXDATAI2C Rx DataI2Cデバイスから受信したデータを読み出すためのフィールドです。RO

I2C Master Bus Status Register (Offset 0x000C)

I2C Master Bus Status Registerは、I2C Busのステータスを確認するためのレジスタです。 I2C_SELFBUSY,I2C_OTHERBUSYビットがともに”0”を示す時、I2C BusがIdle状態であることを示します。

bitSymbolFieldDescriptionR/W
31:2-ReservedReserved-
1I2CM_OTHERBUSYI2C Bus Busy by Other Communication同一I2C Busのバス状態を示すビットです。他のマスターデバイスがI2C通信中の時、このビットは”1”を示します。このビットはI2C EnableがOFFの状態でも機能します。RO
0I2CM_SELFBUSYI2C Bus Busy by Self CommunicationI2C Master ControllerのI2Cバス状態を示すビットです。自身のI2C Master ControllerがI2C通信中、このビットは”1”を示します。RO

I2C Master Interrupt Status Register (Offset: 0x0010)

I2C Master Interrupt Status Registerは、I2C Master Controllerの割り込みステータスレジスタです。 それぞれのビットは”1”をセットすると、割り込みをクリアする事ができます。

bitSymbolFieldDescriptionR/W
31:13-ReservedReserved-
12I2CM_SCLTOI2C SCL Timeout通信中のSCL Timeoutが発生した事を示すビットです。I2CデバイスによるSCLのクロックストレッチ機能等により、通信中にSCLがLoとなっている時間が I2C Master SCL Timeout Setting RegisterのI2CM_SCLTOPRODフィールドの設定値を超えたとき本ビットが”1”にセットされます。R/WC
11I2CM_RXFIFOUDFI2C RX FIFO UnderflowRX FIFOの Underflowが発生したことを示すビットです。RX FIFOが Emptyの時に、I2C Master RX FIFO Registerの読み出しが行われたとき、本ビットが”1”にセットされます。R/WC
10I2CM_TXFIFOOVFI2C TX FIFO OverflowTX FIFOの Overflowが発生したことを示すビットです。TX FIFOが Fullの時に、I2C Master TX FIFO Registerへの書き込みを行ったとき、本ビットが”1”にセットされます。R/WC
9I2CM_BITERI2C BIT ErrorBIT Errorが発生したことを示すビットです。Lowレベルのビットを送信した時に、異なるレベルが検出された場合に本ビットが”1”にセットされます。BIT Errorを検出すると、I2C Master Controllerは以降のデータ送信を停止し、STOP Conditionを送信してからI2C EnableをOffにしてIdle状態に戻ります。R/WC
8I2CM_ACKERI2C ACK ErrorACK Errorが発生したことを示すビットです。送信中に ACKビットでLowレベルが検出出来なかった場合に本ビットが”1”にセットされます。ACK Errorを検出すると、I2C Master Controllerは以降のデータ送信を停止し、STOP Conditionを送信してからI2C EnableをOffにしてIdle状態に戻ります。R/WC
7:6-ReservedReserved-
5I2CM_RXFIFOOTHI2C RX FIFO Over ThresholdRX FIFOに格納されるデータが閾値を上回ったことを示すビットです。データ量が I2C Master FIFO Threshold Level Setting Registerの I2CM_RXFIFOOTHLフィールドの設定値より多くなった場合に本ビットが”1”にセットされます。R/WC
4I2CM_TXFIFOUTHI2C TX FIFO Under ThresholdTX FIFOに格納されるデータが閾値を下回ったことを示すビットです。データ量が I2C Master FIFO Threshold Level Setting Registerの I2CM_TXFIFOUTHLフィールドの設定値より少なくなった場合に本ビットが”1”にセットされます。R/WC
3:2-ReservedReserved-
1I2CM_ARBLSTI2C Arbitration Lost送信中にArbitration Lostが発生した事を示すビットです。送信中に他の I2C Masterと送信が競合したことによる調停制御で送信を停止した場合、本ビットが”1”にセットされます。Arbitration Lostを検出すると、I2C Master Controllerは I2C EnableをOffにしてIdle状態に戻ります。R/WC
0I2CM_COMPI2C CompliteI2C Master ControllerによるI2C通信が正常に完了した事を示すビットです。I2C通信の正常完了で I2C BusにSTOP Conditionを送信した時、本ビットが”1”にセットされます。Arbitration LostやError検出によるSTOP Conditionの送信時には本ビットはセットされません。R/WC

I2C Master Interrupt Enable Register (Offset: 0x0014)

I2C Master Interrupt Enable Registerは、I2C Master Controllerの割り込みイベントを割り込み信号に通知する設定を行うためのレジスタです。

Interrupt Enable Registerのビットが “1”にセットした時、その割り込み要因に対応する Interrupt Status Registerのビットが “1”にセットされた時、レベル割り込みが出力します。

bitSymbolFieldDescriptionR/W
31:13-ReservedReserved-
12I2CM_SCLTOENBI2C SCL Timeout EnableI2CM_SCLTOイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
11I2CM_RXFIFOUDFENBI2C RX FIFO Underflow EnableI2CM_RXFIFOUDFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
10I2CM_TXFIFOOVFENBI2C TX FIFO Overflow EnableI2CM_TXFIFOOVFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
9I2CM_BITERENBI2C BIT Error EnableI2CM_BITERイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
8I2CM_ACKERENBI2C ACK Error EnableI2CM_ACKERイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
7:6-ReservedReserved-
5I2CM_RXFIFOOTHENBI2C RX FIFO Over Threshold EnableI2CM_RXFIFOOTHイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
4I2CM_TXFIFOUTHENBI2C TX FIFO Under Threshold EnableI2CM_TXFIFOUTHイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
3:2-ReservedReserved-
1I2CM_ARBLSTENBI2C Arbitration Lost EnableI2CM_ARBLSTイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
0I2CM_COMPENBI2C Complite EnableI2CM_COMPイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W

I2C Master FIFO Status Register (Offset 0x0018)

I2C Master FIFO Status Registerは、TX FIFO/RX FIFOに格納されているデータ量を読み出すためのレジスタです。

bitSymbolFieldDescriptionR/W
31:21-ReservedReserved-
20:16I2CM_RXFIFOCAPI2C RX FIFO CapacityRX FIFOに格納されているデータ量を示すフィールドです。RO
15:5-ReservedReserved-
4:0I2CM_TXFIFOCAPI2C TX FIFO CapacityTX FIFOに格納されているデータ量を示すフィールドです。RO

I2C Master FIFO Reset Register (Offset 0x001C)

I2C Master FIFO Reset Registerは、TX FIFO/RX FIFOのリセットを行うためのレジスタです。 何らかの理由によりFIFOのクリアを行いたい場合にこのレジスタを使用します。

bitSymbolFieldDescriptionR/W
31:17-ReservedReserved-
16I2CM_RXFIFORSTI2C RX FIFO ResetRX FIFOをリセットするためのビットです。本ビットに”1”をセットすると、TX FIFOがリセットされデータが消去されます。WO
15:1-ReservedReserved-
0I2CM_TXFIFORSTI2C TX FIFO ResetTX FIFOをリセットするためのビットです。本ビットに”1”をセットすると、RX FIFOがリセットされデータが消去されます。WO

I2C Master FIFO Threshold Level Setting Register (Offset 0x0020)

I2C Master FIFO Threshold Level Registerは、TX FIFO/RX FIFOのデータ量に応じた割り込み出力を行うための設定レジスタです。

bitSymbolFieldDescriptionR/W
31:21-ReservedReserved-
20:16I2CM_RXFIFOOTHLI2C RX FIFO Over Threshold LevelI2CM_RXFIFOOTH割り込みを発生させるRX FIFOのデータ格納量の閾値を設定するためのフィールドです。本フィールドに 0または最大値を設定した場合 I2CM_RXFIFOOTHは無効となり、割り込みは発生しません。R/W
15:5-ReservedReserved-
4:0I2CM_TXFIFOUTHLI2C TX FIFO Under Threshold LevelI2CM_TXFIFOUTH割り込みを発生させるTX FIFOのデータ格納量の閾値を設定するためのフィールドです。本フィールドに 0または最大値を設定した場合 I2CM_TXFIFOUTHは無効となり、割り込みは発生しません。R/W

I2C Master SCL Timeout Setting Register (Offset 0x0024)

I2C Master SCL Timeout Setting Registerは、SCL Timeout割り込み発生させるための SCL Timeout時間を設定するレジスタです。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_SCLTOPRODI2C SCL Timeout PeriodI2CM_SCLTO割り込みを発生させる SCL Low期間を設定するためのフィールドです。このフィールドには、1 us単位の Timeout時間を設定します。本フィールドを0に設定した場合は I2CM_SCLTOは無効となり、割り込みは発生しません。R/W

I2C Master START Hold Timing Setting Register (Offset 0x0030)

I2C Master START Hold Timing Setting Registerは、I2C規格における START/Repeated START Conditionの Hold時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_THDSTAI2C START Hold TimeSTART ConditionのHold時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によってタイミングを設定します。R/W

レジスタ設定によるSTART Hold Time(tHDSTA)は、次の式で計算できます。

$tHDSTA [s] = System\ Clock\ period\ [s] × \left(I2CM\_THDSTA +1\right)$

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master STOP Setup Timing Setting Register (Offset 0x0034)

I2C Master STOP Setup Timing Setting Registerは、I2C規格における STOP ConditionのSetup時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_TSUSTOI2C STOP Setup TimeSTOP ConditionのSetup時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によってタイミングを設定します。R/W

レジスタ設定によるSTOP Setup Time(tSUSTO)は、次の式で計算できます。

$tSUSTO [s] = System\ Clock\ period\ [s] × \left(I2CM\_TSUSTO +1\right)$

マルチマスター構成となる場合、または、クロックストレッチ機能を持った I2Cデバイスと接続して通信する場合、このレジスタは”0x3”以上に設定してください。

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Repeated START Setup Timing Setting Register (Offset 0x0038)

I2C Master Repeated START Setup Timing Setting Registerは、I2C規格における Repeated START ConditionのSetup時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_TSUSTAI2C Repeated START Setup TimeRepeated START ConditionのSetup時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によってタイミングを設定します。R/W

レジスタ設定によるRepeated START Setup Time(tSUSTA)は、次の式で計算できます。

$tSUSTA [s] = System\ Clock\ period\ [s] × \left(I2CM\_TSUSTA +1\right)$

マルチマスター構成となる場合、または、クロックストレッチ機能を持った I2Cデバイスと接続して通信する場合、このレジスタは 0x3以上に設定してください。

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Clock High Timing Setting Register (Offset 0x003C)

I2C Master Clock High Timing Setting Registerは、I2C規格における SCLのHigh時間を設定するレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_THIGHI2C SCL High periodSCLのHigh時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によってタイミングを設定します。R/W

レジスタ設定によるSCLのHigh時間(tHIGH)は、次の式で計算できます。

$tHIGH\ [s] = System\ Clock\ period\ [s] × \left(I2CM\_THIGH +1\right)$

このレジスタは必ず”0x4”以上に設定する必要があります。

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Data Hold Timing Setting Register (Offset 0x0040)

I2C Master Data Hold Timing Setting Registerは、I2C規格における データのHold時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_THDDATI2C Data Hold TimeデータのHold時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によって設定します。R/W

レジスタ設定によるData Hold Time(tHDDAT)は、次の式で計算できます。

$tHDDAT\ [s] = System\ Clock\ period\ [s] × \left(I2CM\_THDDAT +1\right)$

マルチマスター構成となる場合、または、クロックストレッチ機能を持った I2Cデバイスと接続して通信する場合、このレジスタは”0x3”以上に設定してください。

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Data Setup Timing Setting Register (Offset 0x0044)

I2C Master Data Setup Timing Setting Registerは、I2C規格における データのSetup時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_TSUDATI2C Data Setup TimeデータのSetup時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によって設定します。R/W

レジスタ設定によるData Setup Time(tSUDAT)は、次の式で計算できます。

$tSUDAT\ [s] = System\ Clock\ period\ [s] × \left(I2CM\_TSUDAT +1\right)$

また、SCLのLow時間(tLOW)は、Data Hold TimeとData Setup Timeの和により決定されます。

$tLOW\ [s] = tHDDAT\ [s] + tSUDAT\ [s]$

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Bus Free Timing Setting Register (Offset 0x0048)

I2C Master Bus Free Timing Setting Registerは、I2C規格における ConditionとSTART Condition間のBus開放時間を設定するためのレジスタです。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_TBUFI2C Bus Free TimeI2C Busの開放時間を設定するフィールドです。このフィールドはシステムクロックのサイクル数によって設定します。R/W

レジスタ設定によるBus Free Time(tBUF)は、次の式で計算できます。

$tBUF\ [s] = System\ Clock\ period\ [s] × \left(I2CM\_TBUF +1\right)$

このレジスタの設定を行う場合は「I2Cタイミングパラメータの設定」も参照してください。

I2C Master Bus Sampling Timing Setting Register (Offset 0x004C)

I2C Master Bus Sampling Timing Setting Registerは、受信データのサンプリングタイミングを設定するためのレジスタです。

SCLの立ち上がりタイミングを起点として、このレジスタに設定した遅延時間後に SDA信号のサンプリングを行います。 このレジスタは、I2C Master Enable RegisterのI2CM_ENビットが”0”の時のみ書き込みが可能です。

bitSymbolFieldDescriptionR/W
31:16-ReservedReserved-
15:0I2CM_SMPLDLYI2C Sampling DelaySDAをサンプリングするタイミングを設定するフィールドです。このフィールドはシステムクロックのサイクル数によって設定します。R/W

レジスタ設定によるSDAのサンプリング遅延時間は、次の式で計算できます。

$SDA Sampling Delay\ [s] = System\ Clock\ period\ [s] × I2CM\_SMPLDLY$

I2C Master Controller IP Version Register (Offset: 0xF000)

I2C Master Controller IPコアバージョンの管理レジスタです。

bitSymbolFieldDescriptionR/W
31:24MAJVERI2C Master Controller IP Major VersionI2C Master ControllerコアのMajor Versionを示します。RO
23:16MINVERI2C Master Controller IP Minor VersionI2C Master ControllerコアのMinor Versionを示します。RO
15:0PATVERI2C Master Controller IP Patch VersionI2C Master ControllerコアのPatch Versionを示します。RO

I2Cアクセス手順

この章では、I2C Master Controllerを使用するための、レジスタの制御手順を説明します。

初期設定操作手順例

I2C Master Controllerの初期設定の手順について説明します。

./images/i2cm_init_config_seq.png

I2C Master ControllerのTiming Parameterは、システムクロックが 48 MHz、Fast-mode(ビットレート:400Kb/s)でのI2C通信に合わせて初期設定がされています。 システムクロックが 48 MHz、Fast-mode(ビットレート:400Kb/s)で通信を行う場合はタイミングパラメータの設定変更を省略し、手順例8から設定を進めることが出来ます。 それ以外の場合は、タイミングパラメータの設定変更(手順例1~7)を行う必要があります。

手順例 1〜7のタイミングパラメータの設定順序に制限は無いため、この手順と異なる順序で設定しても問題ありません。 タイミングパラメータ設定の詳細や、各モードにおける設定例については「I2Cタイミングパラメータの設定」を参照してください。

1: I2C Master START Hold Timing Setting Registerの設定を行います。 2: I2C Master STOP Setup Timing Setting Registerの設定を行います。 3: I2C Master Repeated START Setup Timing Setting Registerの設定を行います。 4: I2C Master Clock High Timing Setting Registerの設定を行います。 5: I2C Master Data Hold Timing Setting Registerの設定を行います。 6: I2C Master Data Setup Timing Setting Registerの設定を行います。 7: I2C Master Bus Free Timing Setting Registerの設定を行います。 8: I2C Master Interrupt Enable Registerの使用する割り込みステータスのイネーブルビットを”1”に設定します。 9: I2C Master Enable RegisterのI2CM_ENビットを”1”に設定し、I2C Master Controllerを有効化します。

I2Cタイミングパラメータの設定

I2C Master ControllerによるI2C通信タイミングは、以下のレジスタ設定により決まります。

  • I2C Master START Hold Timing Setting Register: START ConditionおよびRepeated START ConditionのHold時間
  • I2C Master STOP Setup Timing Setting Register: STOP ConditionのSetup時間
  • I2C Master Repeated START Setup Timing Setting Register: Repeated START ConditionのSetup時間
  • I2C Master Clock High Timing Setting Register: I2Cクロック(SCL)のHigh期間
  • I2C Master Data Hold Timing Setting Register: I2Cデータ(SDA)のHold時間
  • I2C Master Data Setup Timing Setting Register: I2Cデータ(SDA)のSetup時間
  • I2C Master Bus Free Timing Setting Register: STOP ConditionからSTART Condition間のBus Free時間

初期状態ではシステムクロック 48 MHz、Fast-mode(400Kb/s)で通信を行う場合のタイミングに設定されています。 接続する I2Cデバイスが対応する通信レートやモードに応じ変更することが出来ます。

各タイミングパラメータの設定により生成される、I2C Master Controllerのタイミングを以下に示します。

./images/i2cm_timing.png

./images/i2cm_timing_repsta.png

I2Cクロック(SCL)のLow期間(tLOW)は、I2Cデータ(SDA)のSetup/Hold時間(I2CM_TSUDAT,I2CM_THDDAT)のTotal時間となります。 I2C通信の1ビットは、I2Cクロック(SCL)のHigh期間(I2CM_THIGH)と I2Cクロック(SCL)のLow期間(tLOW)のTotal時間となります。

システムクロックが96MHz, 48MHz, 24MHzにおいて、Standard-mode(100Kb/s)、Fast-mode(400Kb/s)、Fast-mode Plus(1Mb/s)で通信する場合の、タイミングパラメータ設定値の例を以下にします。

ParameterStandard-mode(100Kb/s)Fast-mode(400Kb/s)Fast-mode Plus(1Mb/s)
I2CM_THDSTA[15:0]0x01DF(5us)0x0063(1.04us)0x0027(0.42us)
I2CM_TSUSTO[15:0]0x01DF(5us)0x0063(1.04us)0x0027(0.42us)
I2CM_TSUSTA[15:0]0x022F(5.83us)0x0063(1.04us)0x0027(0.42us)
I2CM_THIGH[15:0]0x01CB(4.79us)0x0072(1.20us)0x002D(0.48us)
I2CM_THDDAT[15:0]0x0027(0.42us)0x0009(0.10us)0x0003(0.04us)
I2CM_TSUDAT[15:0]0x01CB(4.79us)0x0072(1.20us)0x002D(0.48us)
I2CM_TBUF[15:0]0x022F(5.83us)0x008B(1.46us)0x0037(0.58us)
ParameterStandard-mode(100Kb/s)Fast-mode(400Kb/s)[default]Fast-mode Plus(1Mb/s)
I2CM_THDSTA[15:0]0x00EF(5us)0x0031(1.04us)0x0013(0.42us)
I2CM_TSUSTO[15:0]0x00EF(5us)0x0031(1.04us)0x0013(0.42us)
I2CM_TSUSTA[15:0]0x0117(5.83us)0x0031(1.04us)0x0013(0.42us)
I2CM_THIGH[15:0]0x00E5(4.79us)0x0039(1.21us)0x0015(0.46us)
I2CM_THDDAT[15:0]0x0013(0.42us)0x0004(0.10us)0x0003(0.08us)
I2CM_TSUDAT[15:0]0x00E5(4.79us)0x0039(1.21us)0x0015(0.46us)
I2CM_TBUF[15:0]0x0117(5.83us)0x0045(1.46us)0x001B(0.58us)
ParameterStandard-mode(100Kb/s)Fast-mode(400Kb/s)Fast-mode Plus(1Mb/s)
I2CM_THDSTA[15:0]0x0077(5us)0x0018(1.04us)0x0009(0.42us)
I2CM_TSUSTO[15:0]0x0077(5us)0x0018(1.04us)0x0009(0.42us)
I2CM_TSUSTA[15:0]0x008B(5.83us)0x0018(1.04us)0x0009(0.42us)
I2CM_THIGH[15:0]0x0072(4.79us)0x001B(1.17us)0x0009(0.42us)
I2CM_THDDAT[15:0]0x0009(0.42us)0x0003(0.17us)0x0003(0.17us)
I2CM_TSUDAT[15:0]0x0072(4.79us)0x001B(1.17us)0x0009(0.42us)
I2CM_TBUF[15:0]0x008B(5.83us)0x0022(1.46us)0x000D(0.58us)

制限事項:

  1. データ処理に必要な時間として、I2C Master Clock High Timing Setting Register(I2CM_THIGH)の設定値は、必ず0x0004以上となるように設定してください。
  2. マルチマスター構成となる場合、または クロックストレッチ機能を持った I2Cデバイスと接続して通信する場合、以下のレジスタの設定値は、I2Cクロックの同期処理に必要な時間を確保するため 0x0003以上となるように設定する必要があります。
    • I2C Master STOP Setup Timing Setting Register(I2CM_TSUSTO)
    • I2C Master Repeated START Setup Timing Setting Register(I2CM_TSUSTA)
    • I2C Master Data Hold Timing Setting Register(I2CM_THDDAT)

I2C通信操作手順例

この章では、I2C通信を行うための I2C Master Controllerのレジスタ制御手順を説明します。

I2C Master Controllerは、マルチマスターに対応する実装のため、I2C Master Controllerと I2Cバスを切り離す機能と、I2C Busを監視する機能を持っています。 この仕様により、I2C Master Enable RegisterのI2CM_ENビットが”1”で、且つ I2C BusがIdle状態の時のみ I2C通信を開始することができます。 I2CM_ENビットが”0”、または、I2C BusがIdle状態でない場合は、I2C Master TX FIFO Registerにデータが書き込まれても I2C通信を開始せず、I2CM_ENビットが”1”、かつ、I2C BusがIdle状態になるまで Waitします。

これ以降のレジスタアクセス手順は、I2CM_ENビットが “1”で I2C Busが Idle状態である事を前提に記載しています。

データ書き込み操作手順

本章では I2Cデバイスへのデータ書き込みを行う場合の手順を説明します。

I2Cデバイスへデータ書き込みを行う場合の I2C Busの波形を以下に示します。

./images/i2cm_write_acc_seq.png

A: TX FIFO(I2C Master TX FIFO RegisterのI2CM_TXDATAフィールド)の Bit7-1に I2Cデバイスのアドレスと Bit0(R/Wビット)に”0”(送信モード)を書き込みます。 I2C Master ControllerはI2C書き込み動作を開始し、I2C BusにStart Condition, TX FIFOに書き込まれたアドレス, R/Wビットの順に送信します。 データ送信後の次のサイクルは I2Cデバイスからの ACK受信を行います。

B: 送信するデータを送信順に 1Byte単位でTX FIFOに書き込みます。 書き込みが完了したデータから、順次 I2C Busに送信されます。 なお、I2Cデバイスからの ACK受信は 1 Byte毎に毎回行います。

C: 最終 Byteの送信データを TX FIFOに書き込む時、同時に I2C Master TX FIFO RegisterのI2CM_STOPビットに”1”をセットします。 I2C Master Controllerは、最終 Byteのデータ送信と ACK受信の完了後に、I2C BusにSTOP Conditionを送信し、I2C Master Interrupt Status Registerの I2CM_COMP割り込みをセットして、書き込み動作を完了します。

具体的な例として、I2Cデバイスのアドレス 0x67に、0x89, 0xAB, 0xCD, 0xEFのデータを書き込む場合には、I2C Master TX FIFO Registerに以下の書き込みを行います。

  1. Register Write, Address Offset: 0x0004, Write Data: 0x000000CE
  2. Register Write, Address Offset: 0x0004, Write Data: 0x00000089
  3. Register Write, Address Offset: 0x0004, Write Data: 0x000000AB
  4. Register Write, Address Offset: 0x0004, Write Data: 0x000000CD
  5. Register Write, Address Offset: 0x0004, Write Data: 0x000001EF

TX FIFOの容量を超えるサイズのデータを送信する場合は、TX FIFOがOverflowしないよう書き込み間隔を調整する必要があります。 TX FIFOのデータ格納量のステータスは、I2C Master FIFO Status Registerや TX FIFO関連の割り込みにより、ソフトウェアから確認することができます。 I2C書き込み動作中に、I2CM_STOPビットがセットされない状態でTX FIFOが Emptyとなった場合、I2C通信を一時停止します。 この時、TX FIFOに送信データが書き込まれると、I2C通信を再開します。

次にRepeated Start Conditionを使用した書き込みアクセスの手順を説明します。 この手順はデバイスアドレスとは別にレジスタアドレスを持つ I2Cデバイスとの通信時などで使用します。

./images/i2cm_write_acc_seq_repsta.png

A: 前の手順と同様に TX FIFOのBit7-1に I2Cデバイスのアドレス、Bit0(R/Wビット)に”0”(送信モード)を書き込みます。

B: TX FIFOに 送信データの書き込み(ここではI2Cデバイスのレジスタアドレスとします)と同時に、I2C Master TX FIFO RegisterのI2CM_RESTARTビットに”1”をセットします。 I2C Master Controllerはレジスタアドレスの送信後のACK受信が完了すると、Repeated Start Conditionを送信します。

C: Aの手順と同様、再度TX FIFOのBit7-1に I2Cデバイスのアドレスと、Bit0(R/Wビット)に”0”(送信モード)を書き込みます。

D: 送信するデータを 1 Byte単位で送信順にTX FIFOに書き込みます。

E: 最終 Byteの送信データを TX FIFOに書き込む時、同時にI2C Master TX FIFO Registerの I2CM_STOPビットに”1”をセットします。

具体的な例として、アドレス 0x67のI2Cデバイスのレジスタアドレス 0xFEに、0xDC、0xBA、0x98、0x76、0x54のデータを書き込む場合には、I2C Master TX FIFO Registerに以下の書き込みを行います。

  1. Register Write, Address Offset: 0x0004, Write Data: 0x000000CE
  2. Register Write, Address Offset: 0x0004, Write Data: 0x000002FE
  3. Register Write, Address Offset: 0x0004, Write Data: 0x000000CE
  4. Register Write, Address Offset: 0x0004, Write Data: 0x000000DC
  5. Register Write, Address Offset: 0x0004, Write Data: 0x000000BA
  6. Register Write, Address Offset: 0x0004, Write Data: 0x00000098
  7. Register Write, Address Offset: 0x0004, Write Data: 0x00000076
  8. Register Write, Address Offset: 0x0004, Write Data: 0x00000154

データ読み出し操作手順

本章では I2Cデバイスからのデータ読み出しを行う場合の手順を説明します。

I2Cデバイスからデータ読み出しを行う場合の I2C Busの波形を以下に示します。

./images/i2cm_read_acc_seq.png

A: TX FIFO(I2C Master TX FIFO RegisterのI2CM_TXDATAフィールド)のBit7-1に I2Cデバイスのアドレス7と、Bit0(R/Wビット)に”1”を書き込みます。 I2C Master ControllerはI2C読み出し動作を開始し、I2C BusにStart Condition送信後、TX FIFOに書き込まれたアドレスとR/Wビットを送信します。 データ送信後の次のサイクルは I2Cデバイスからの ACK受信を行います。

B: 受信するデータのByte数から 1を引いた値をTX FIFOに書き込みます。 この時、同時に I2C Master TX FIFO RegisterのI2CM_STOPビットに”1”をセットします。 TX FIFOに設定されたByte数分のデータ受信を行い、受信データを RX FIFOへ格納します。 なお、I2Cデバイスから 1 Byteのデータを受信するたびに I2Cデバイスへの ACK送信を行います。

C: I2C Master Controllerは、最終 Byteのデータ受信後 NACKを送信し、I2C BusにStop Conditionを送信します。 また同時に、I2C Master Interrupt Status RegisterのI2CM_COMP割り込みをセットして、読み出し動作を完了します。

I2C Master Controllerは、最終 Byteのデータ送信と ACK受信の完了後に、I2C BusにSTOP Conditionを送信し、I2C Master Interrupt Status Registerの I2CM_COMP割り込みをセットして、書き込み動作を完了します。

具体的な例として、I2Cデバイスのアドレス 0x67から 4 Byteのデータ読み出す場合は、I2C Master TX FIFO Registerに以下の書き込みを行います。

  1. Register Write, Address Offset: 0x0004, Write Data: 0x000000CF
  2. Register Write, Address Offset: 0x0004, Write Data: 0x00000103

受信データはI2C Master RX FIFO Registerを読み出すことにより取得できます。 I2C読み出し動作中に、設定したByte数のデータ受信が完了しない状態で RX FIFOが Fullとなった場合、I2C通信を一時停止します。 この時、RX FIFOから受信データが読み出されると、I2C通信を再開します。 RX FIFOの容量を超えるサイズのデータを受信する場合は、RX FIFOのサイズを考慮し RX FIFOから定期的にデータ読み出す必要があります。 RX_FIFOのデータ格納量のステータスは、I2C Master FIFO Status Registerや RX_FIFO関連の割り込みにより、ソフトウェアから確認することができます。

次にRepeated Start Conditionを使用した読み出しアクセスの手順を説明します。 この手順はデバイスアドレスとは別にレジスタアドレスを持つ場合や、10ビットアドレスの I2Cデバイスとの通信時に使用します。

./images/i2cm_read_acc_seq_repsta.png

A: 前の手順と同様に、TX FIFOのBit7-1に I2Cデバイスのアドレス、Bit0(R/Wビット)に”0”(送信モード)を書き込みます。

B: TX FIFOに送信データの書き込み(ここではI2Cデバイスのレジスタアドレスとします)と同時に、I2C Master TX FIFO RegisterのI2CM_RESTARTビットに”1”をセットします。 I2C Master Controllerはレジスタアドレスの送信後のACK受信が完了すると、Repeated Start Conditionを送信します。

C: TX FIFOのBit7-1に I2Cデバイスのアドレスと、Bit0(R/Wビット)に”1”を書き込みます。

D: 受信するデータの Byte数から 1を引いた値のTX FIFOに書き込みます。この時 同時にI2C Master TX FIFO RegisterのI2CM_STOPビットに”1”をセットします。

具体的な例として、アドレス 0x67のI2Cデバイスのレジスタアドレス 0xFEから 5 Byteのデータ読み出しを行いたい場合は、I2C Master TX FIFO Registerに以下の書き込みを行います。

  1. Register Write, Address Offset: 0x0004, Write Data: 0x000000CE
  2. Register Write, Address Offset: 0x0004, Write Data: 0x000002FE
  3. Register Write, Address Offset: 0x0004, Write Data: 0x000000CF
  4. Register Write, Address Offset: 0x0004, Write Data: 0x00000104