ESP32 Technical Reference Manual を独自に何となく和訳してみました。

ESP32 Technical Reference Manual 何となく和訳してみた(抜粋)

ESP32 Technical Reference Manual を一部抜粋して、Google翻訳等を使って独自に和訳してみました。

英語版原本は以下のリンクにあります。

https://www.espressif.com/en/support/download/documents

備忘録として書いていますので、正直言って、かなりテキトーです。
誤っている場合もありますのでお気を付けください。

今後、徐々に項目を追加していこうと思っています。

スポンサーリンク

1. System and Memory

1.1 Introduction

ESP32は、2つのハーバードアーキテクチャXtensa LX6 CPUを備えたデュアルコアシステムです。 すべての組み込みメモリ、外部メモリ、および周辺機器は、これらのCPUのデータバスおよび/または命令バス上にあります。
いくつかの小さな例外を除き(以下を参照)、2つのCPUのアドレスマッピングは対称です。つまり、同じメモリにアクセスするために同じアドレスを使用します。 システム内の複数の周辺機器は、DMA経由で組み込みメモリにアクセスできます。
2つのCPUの名前は「PRO_CPU」と「APP_CPU」(「プロトコル」と「アプリケーション」)ですが、ほとんどの場合、2つのCPUは交換可能です。

1.2 Features

•アドレススペース
–対称アドレスマッピング
–データバスと命令バスの両方に4 GB(32ビット)アドレス空間
– 1296 KBの組み込みメモリアドレススペース
– 19704 KB外部メモリアドレススペース
– 512 KBの周辺機器アドレススペース
–一部の組み込みおよび外部メモリ領域には、データバスまたは命令バスのいずれかからアクセスできます。
– 328 KB DMAアドレススペース

•組み込みメモリ
– 448 KBの内部ROM
– 520 KBの内部SRAM
– 8 KB RTC FASTメモリ
– 8 KB RTC SLOWメモリ

•外部メモリ
オフチップSPIメモリは、外部メモリとして利用可能なアドレス空間にマッピングできます。 内蔵メモリの一部は、この外部メモリの透過キャッシュとして使用できます。

–最大16 MBのオフチップSPIフラッシュをサポートします。
–最大8 MBのオフチップSPI SRAMをサポートします。

•周辺機器
– 41の周辺機器

•DMA
– 13のモジュールはDMA操作が可能

図1のブロック図はシステム構造を示し、図2のブロック図はアドレスマップ構造を示しています。
Figure 1: System Structure
Figure 2: System Address Mapping

1.3.2.3 Internal SRAM 0

内部SRAM 0の容量は192 KBです。 ハードウェアは、最初の64 KBを使用して外部メモリアクセスをキャッシュするように構成できます。 キャッシュとして使用しない場合、最初の64 KBは、命令バスのアドレス0x4007_0000〜0x4007_FFFFのいずれかのCPUで読み書きできます。 残りの128 KBは、命令バスのアドレス0x4008_0000〜0x4009_FFFFのいずれかのCPUで常に読み書きできます。

1.3.2.4 Internal SRAM 1

内蔵SRAM 1の容量は128 KBです。 どちらのCPUも、データバスのアドレス0x3FFE_0000〜0x3FFF_FFFF、および命令バスのアドレス0x400A_0000〜0x400B_FFFFでこのメモリを読み書きできます。
命令バスを介してアクセスされるアドレス範囲は、データバスを介してアクセスする場合と逆の順序(ワード単位)です。
つまり、アドレス
0x3FFE_0000 and 0x400B_FFFC access the same word
0x3FFE_0004 and 0x400B_FFF8 access the same word
0x3FFE_0008 and 0x400B_FFF4 access the same word
……
0x3FFF_FFF4 and 0x400A_0008 access the same word
0x3FFF_FFF8 and 0x400A_0004 access the same word
0x3FFF_FFFC and 0x400A_0000 access the same word

CPUのデータバスと命令バスはどちらもリトルエンディアンであるため、個々のワードのバイト順はアドレススペース間で逆転しません。
たとえば、アドレス
0x3FFE_0000 accesses the least significant byte in the word accessed by 0x400B_FFFC.
0x3FFE_0001 accesses the second least significant byte in the word accessed by 0x400B_FFFC.
0x3FFE_0002 accesses the second most significant byte in the word accessed by 0x400B_FFFC.
0x3FFE_0003 accesses the most significant byte in the word accessed by 0x400B_FFFC.
0x3FFE_0004 accesses the least significant byte in the word accessed by 0x400B_FFF8.
0x3FFE_0005 accesses the second least significant byte in the word accessed by 0x400B_FFF8.
0x3FFE_0006 accesses the second most significant byte in the word accessed by 0x400B_FFF8.
0x3FFE_0007 accesses the most significant byte in the word accessed by 0x400B_FFF8.
……
0x3FFF_FFF8 accesses the least significant byte in the word accessed by 0x400A_0004.
0x3FFF_FFF9 accesses the second least significant byte in the word accessed by 0x400A_0004.
0x3FFF_FFFA accesses the second most significant byte in the word accessed by 0x400A_0004.
0x3FFF_FFFB accesses the most significant byte in the word accessed by 0x400A_0004.
0x3FFF_FFFC accesses the least significant byte in the word accessed by 0x400A_0000.
0x3FFF_FFFD accesses the second most significant byte in the word accessed by 0x400A_0000.
0x3FFF_FFFE accesses the second most significant byte in the word accessed by 0x400A_0000.
0x3FFF_FFFF accesses the most significant byte in the word accessed by 0x400A_0000.

このメモリの一部は、ROM 0アドレス空間に再マッピングできます。 詳細については、内部Rom 0を参照してください。

1.3.2.5 Internal SRAM 2

内蔵SRAM 2の容量は200 KBです。 データバス上のアドレス0x3FFA_E000〜0x3FFD_FFFFのいずれかのCPUで読み書きできます。

1.3.2.6 DMA

DMAは、CPUデータバスと同じアドレス指定を使用して、内部SRAM 1と内部SRAM 2の読み取りと書き込みを行います。
つまり、DMAは0x3FFE_0000〜0x3FFF_FFFFのアドレス範囲を使用して内部SRAM 1を読み書きし、0x3FFA_E000〜0x3FFD_FFFFのアドレス範囲を使用して内部SRAM 2を読み書きします。
ESP32では、13の周辺機器にDMAが装備されています。 表3にこれらの周辺機器を示します。
Table 3: Module with DMA

1.3.4 Cache

図3に示すように、ESP32の2つのCPUにはそれぞれ、外部ストレージにアクセスするための32 KBのキャッシュがあります。 PRO CPUはレジスタDPORT_PRO_CACHE_CTRL_REGのビットPRO_CACHE_ENABLEを使用してキャッシュを有効にし、APP CPUはレジスタDPORT_APP_CACHE_CTRL_REGのビットAPP_CACHE_ENABLEを使用して同じ機能を有効にします。
Figure 3: Cache Block Diagram

ESP32は、双方向のセットアソシエイティブキャッシュを使用します。 キャッシュ機能をPRO CPUまたはAPP CPUで使用する場合、レジスタDPORT_CACHE_MUX_MODE_REGのビットCACHE_MUX_MODE [1:0]を設定して、内部SRAM0のPOOL0またはPOOL1をキャッシュメモリとして選択できます。 PRO CPUとAPP CPUの両方がキャッシュ機能を使用する場合、内部SRAM0のPOOL0とPOOL1は同時にキャッシュメモリとして使用されますが、命令バスでも使用できます。 これを以下の表5に示します。
Table 5: Cache memory mode

表5で説明されているように、ビットCACHE_MUX_MODEが1または2に設定されている場合、PRO CPUとAPP CPUはキャッシュ機能を同時に有効にできません。 キャッシュ機能が有効になっている場合、POOL0またはPOOL1はキャッシュメモリとしてのみ使用でき、命令バスでも使用できません。
ESP32キャッシュはフラッシュ機能をサポートしています。 フラッシュ機能を使用すると、キャッシュに書き込まれたデータは外部SRAMに再書き込みされるのではなく破棄されることに注意してください。 フラッシュ機能を有効にするには、まずレジスタDPORT_x_CACHE_CTRL_REGのビットx_CACHE_FLUSH_ENAをクリアしてから、このビットを1に設定します。
その後、システムハードウェアはビットx_CACHE_FLUSH_DONEを1に設定します。xは「PRO」または「APP」で、キャッシュフラッシュ操作が完了したことを示します。
ESP32キャッシュのアドレスマッピングの詳細については、内蔵メモリと外部メモリを参照してください。

2. Interrupt Matrix

2.1 Overview

ESP32に埋め込まれた割り込みマトリックスは、2つのCPUの周辺割り込みに周辺割り込みソースを個別に割り当てます。 この構成は、多くのさまざまなニーズを満たすために、非常に柔軟に構成されています。

2.2 Features

71の周辺割り込みソースを入力として受け入れます。
•出力としてCPUごとに26個の周辺割り込みソースを生成します(合計52個)。
•CPU NMI(Non Maskable Interrupt)割り込みマスク。
•周辺割り込みソースの現在の割り込みステータスを照会します。

割り込みマトリックスの構造を図4に示します。
Figure 4: Interrupt Matrix Structure

2.3 Functional Description

2.3.1 Peripheral Interrupt Source

ESP32には合計71の周辺割り込みソースがあります。 すべての周辺割り込みソースを表7にリストします。71のESP32周辺割り込みソースのうち67をいずれかのCPUに割り当てることができます。

残りの4つの周辺割り込みソースはCPU固有で、CPUごとに2つです。 GPIO_INTERRUPT_PROおよびGPIO_INTERRUPT_PRO_NMIはPRO_CPUにのみ割り当てることができます。 GPIO_INTERRUPT_APPおよびGPIO_INTERRUPT_APP_NMIは、APP_CPUにのみ割り当てることができます。 その結果、PRO_CPUとAPP_CPUにはそれぞれ69個の周辺割り込みソースがあります。
Table 7: PRO_CPU, APP_CPU Interrupt Configuration

2.3.2 CPU Interrupt

2つのCPU(PROおよびAPP)の両方にそれぞれ32の割り込みがあり、そのうち26が周辺割り込みです。 CPUのすべての割り込みを表8にリストします。
Table 8: CPU Interrupts

2.3.3 Allocate Peripheral Interrupt Sources to Peripheral Interrupt on CPU

このセクションで:
•Source_Xは、特定の周辺割り込みソースを表します。
•PRO_X_MAP_REG(またはAPP_X_MAP_REG)は、PRO_CPU(またはAPP_CPU)の特定の周辺割り込み構成レジスタを表します。 周辺割り込み設定レジスタは、周辺割り込みソースSource_Xに対応します。 表7の「PRO_CPU(APP_CPU)-周辺割り込み構成レジスタ」にリストされているレジスタは、「周辺割り込みソース-名前」にリストされている周辺割り込みソースに対応しています。
•Interrupt_Pは、Num_Pとして番号が付けられたCPU周辺機器割り込みを表します。 Num_Pの範囲は0〜5、8〜10、12〜14、17〜28、30〜31です。
•Interrupt_Iは、Num_Iという番号のCPU内部割り込みを表します。 Num_Iは、6、7、11、15、16、29の値を取ることができます。

この用語を使用して、割り込みマトリックスコントローラーの可能な操作を次のように説明できます。

周辺割り込みソースSource_XをCPU(PRO_CPUまたはAPP_CPU)に割り当てます。
PRO_X_MAP_REGまたはAPP_X_MAP_REGをNum_Pに設定します。 Num_Pには、任意のCPU周辺機器割り込み番号を指定できます。 CPU割り込みは、複数の周辺機器間で共有できます(以下を参照)。

CPUの周辺割り込みソースSource_Xを無効にします(PRO_CPUまたはAPP_CPU)。
周辺割り込みソースのPRO_X_MAP_REGまたはAPP_X _MAP_REGを任意のNum_Iに設定します。 Num_Iとして番号付けされた割り込みはいずれのCPUにも接続されていないため、内部割り込み番号の特定の選択は動作を変更しません。

複数の周辺機器ソースをPRO_CPU(APP_CPU)周辺機器の割り込みにOR結合します。
複数のPRO_Xn_MAP_REG(APP_Xn_MAP_REG)を同じNum_Pに設定します。これらの周辺割り込みはいずれも、CPU Interrupt_Pをトリガーします。

2.3.4 CPU NMI Interrupt Mask

割り込みマトリックスは、PRO_CPU(またはAPP_CPU)のNMI(Non Maskable Interrupt)割り込みに割り当てられたすべての周辺割り込みソースを、周辺PIDコントローラーからそれぞれPRO_CPU NMI割り込みマスク(またはAPP_CPU NMI割り込みマスク)信号を受信した場合、一時的にマスクします。
(独自解釈:
つまり、マスクすると割り込み要求を受け付けられなくなるということ。
NMIとは、マスクさせたくない割り込み、例えばプログラムが暴走した時に強制的に割り込ませるウォッチドッグタイマなどがある。

2.3.5 Query Current Interrupt Status of Peripheral Interrupt Source

表7のマッピングに示すように、周辺割り込みソースの現在の割り込みステータスは、PRO_INTR_STATUS_REG_n(APP_INTR_STATUS_REG_n)のビット値を介して読み取ることができます。

6. DMA Controller

6.1 Overview

ダイレクトメモリアクセス(DMA)は、周辺機器とメモリ間、およびメモリ間の高速データ転送に使用されます。 CPUの介入なしにデータをDMAですばやく移動できるため、データ処理時にコアをより効率的に使用できます。

ESP32では、13個のペリフェラル、つまりUART0、UART1、UART2、SPI1、SPI2、SPI3、I2S0、I2S1、SDIOスレーブ、SD / MMCホスト、EMAC、BT、およびWi-Fiがデータ転送にDMAを使用できます。

6.2 Features

ESP32機能のDMAコントローラ

  • AHBバスアーキテクチャ
  • 全二重および半二重データ転送のサポート
  • バイト単位のプログラム可能なデータ転送長
  • 4ビートバースト転送をサポート
  • 328 KB DMAアドレススペース
  • DMA搭載のすべての高速通信モジュール

6.3 Functional Description

高速データ転送を大量に必要とするすべてのモジュールはDMAコントローラを含みます。 DMAアドレッシングは、CPUと同じデータバスを使用して内部RAMへの読み書きを行います。

各DMAコントローラは異なる機能を備えています。 ただし、DMAエンジンのアーキテクチャ(DMA_ENGINE)はすべてのDMAコントローラで同じです。

6.3.1 DMA Engine Architecture

図 12: DMA Engine Architectureより

DMAエンジンはAHBバスを介してSRAMにアクセスします。 図12では、RAMはESP32で使用可能な内部SRAMバンクを表しています。 SRAMのアドレッシング範囲の詳細は、システムとメモリの章にあります。 ソフトウェアは、リンクリストを割り当ててDMA操作パラメータを定義することでDMAエンジンを使用できます。

DMAエンジンは、out_link記述子の内容に従って、RAMからペリフェラルにデータを送信します。 また、DMAエンジンは、in_link記述子の内容に従って、ペリフェラルから受信したデータを指定されたRAMの場所に格納します。

6.3.2 Linked List

DMAディスクリプタのリンクリスト(out_linkとin_link)は同じ構造です。 図13に示すように、リンクリスト記述子は3つの単語で構成されています。 各フィールドの意味は次のとおりです。

  • owner(DW0)[31]:現在のリンクリストに対応するバッファの許可された演算子。1’b0:許可される演算子はCPUです。
    1’b1:許可されたオペレータはDMAコントローラです。
  • eof(DW0)[30]:ファイルの終わり文字。
    1’b0:リンクリスト項目はリンクリストの終わりを示さない。
    1’b1:リンクリスト項目はリンクリストの末尾にある。
  • 予約(DW0)[29:24]:予約ビット。
    ソフトウェアはこのスペースに1を書くべきではありません。
  • 長さ(DW0)[23:12]:現在のリンクリストに対応するバッファ内の有効バイト数。フィールド値は、ワードDW1で示されるバッファとの間で転送されるバイト数を示します。
  • サイズ(DW0)[11:0]:現在のリンクリストに対応するバッファのサイズ。
    注:サイズはワード境界に合わせる必要があります。
  • バッファアドレスポインタ(DW1):バッファアドレスポインタ。これはデータバッファのアドレスです。
    注:バッファアドレスはワード境界で整列させる必要があります。
  • 次記述子アドレス(DW2):次のリンクリスト項目のアドレスポインタ。現在のリンクリスト項目がリストの最後(eof = 1)の場合、値は0です。

データ受信時、データ転送長が指定されたバッファサイズより小さい場合、DMAは残りのスペースを使用しません。 これにより、DMAエンジンを使用して任意の数のデータバイトを転送できます。

6.6 I2S DMA Interface

ESP32は、2つのI2Sモジュール、I2S0とI2S1を統合しており、それぞれはDMAチャネルから電力を供給されます。 I2S_FIFO_CONF_REGのREG_I2S_DSCR_ENビットはDMA操作を有効にするために使用されます。 ESP32 I2S DMAは、標準のリンクリスト記述子を使用してデータ転送用のDMA操作を設定します。 バースト転送がサポートされています。

ただし、SPI DMAチャネルとは異なり、1回の転送のデータサイズは1ワード、つまり4バイトです。

I2S_RXEOF_NUM_REGのREG_I2S_RX_EOF_NUM [31:0]ビットは、1ワードの倍数で、1回の転送動作のデータサイズを設定するために使用されます。

I2S_OUT_LINK_REGのI2S_OUTLINK_STARTビットおよびI2S_IN_LINK_REGのI2S_INLINK_STARTビットはDMAエンジンを有効にするために使用され、ハードウェアによってセルフクリアされます。 I2S_OUTLINK_STARTが1に設定されると、DMAエンジンはアウトバウンドリンクリスト記述子の処理を開始し、データを送信する準備をします。 I2S_INLINK_STARTが1に設定されると、DMAエンジンはインバウンドリンクリスト記述子の処理を開始し、データを受信する準備をします。

ソフトウェアはI2S DMAを次のように設定する必要があります。

  1. I2S コントローラ関連レジスタを設定します。
  2. DMAステートマシンおよびFIFOパラメータをリセットする。
  3. DMA関連レジスタを動作用に設定します。
  4. I2Sマスターモードで、I2S動作を開始するためにI2S_TX_STARTビットまたはI2S_RX_STARTビットを設定します。 I2Sスレーブモードでは、I2S_TX_STARTビットまたはI2S_RX_STARTビットをセットし、ホストデバイスによってデータ転送が開始されるのを待ちます。

I2S DMA割り込みの詳細については、I2S 章のセクションDMA割り込みを参照してください。

12. I2S

12.1 Overview

I2S バスは、マルチメディアアプリケーション、特にデジタルオーディオアプリケーションでデジタルデータをストリーミングするための柔軟な通信インターフェースを提供します。

ESP32には、I2S0とI2S1の2つのI2Sインターフェースがあります。
I2S標準バスは、3つの信号を定義します。クロック信号、チャンネル選択信号、およびシリアルデータ信号です。
基本的なI2S データバスには1つのマスターと1つのスレーブがあります。
役割はコミュニケーションを通して変わっていません。
ESP32のI2Sモジュールは、高性能のために別々の送信チャネルと受信チャネルを提供します。

図61は、ESP32 I2Sモジュールのシステムブロック図です。上の図で、「n」の値は0または1のどちらかです。ESP32に組み込まれた2つの独立したI2Sモジュール、つまりI2S0とI2S1があります。各I2S モジュールは、Tx(送信)ユニットとRx(受信)ユニットを含みます。 TxユニットとRxユニットはどちらも、クロックライン、チャネル選択ライン、およびシリアルデータラインを含む3線式インターフェースを備えています。 Txユニットのシリアルデータラインは出力として固定され、受信ユニットのシリアルデータラインは入力として固定されています。 TxおよびRxユニットのクロックラインとチャネル選択ラインは、マスター送信モードとスレーブ受信モードの両方に設定できます。 LCDモードでは、シリアルデータラインはパラレルデータバスまで延びています。 TxユニットとRxユニットの両方に、深さ64の32ビット幅のFIFOがあります。さらに、オンチップDAC / ADCモード、およびPDM信号の送受信をサポートしているのは、I2S0だけです。

図61の右側は、I2S モジュールの信号バスを示しています。 RxおよびTxユニットの信号命名規則はI2SnA_B_Cです。ここで、「n」はI2S0またはI2S1を表します。 「A」はI2Sモジュールのデータバス信号の方向を表し、「I」は入力を表し、「O」は出力を表します。 「B」は信号機能を表す。 「C」は信号の方向を表し、「in」は信号がI2Sモジュールに入力されることを意味し、「out」はI2Sモジュールが信号を出力することを意味します。 I2S 信号バスの詳細については、表57を参照してください。

表57に、I2Sモジュールの信号バスを示します。 I2Sn_CLK信号を除いて、他のすべての信号はGPIOマトリックスとIO MUXを介してチップピンにマッピングされます。 I2Sn_CLK信号はIO_MUXを介してチップピンにマッピングされます。 詳細は、IO_MUXとGPIO Matrixに関する章を参照してください。

12.2 Features

I2S mode
  • 設定可能な高精度出力クロック
  • 全二重および半二重データ送受信モード
  • 複数のデジタルオーディオ規格をサポート
  • 組み込みA-law圧縮/解凍モジュール
  • 設定可能なクロック信号
  • PDM信号の入出力をサポート
  • 設定可能なデータ送受信モード
LCD mode
  • 外付けLCDを含む複数のLCDモードをサポート
  • 外部カメラをサポート
  • 内蔵DAC / ADCモードをサポート
I2S interrupts
  • 標準のI2S インターフェース割り込み
  • I2S  DMAインターフェース割り込み

12.3 The Clock of I2S Module

図62に示すように、I2SモジュールのマスタークロックとしてのI2Sn_CLKは、160 MHzクロックPLL_D2_CLKまたは設定可能なアナログPLL出力クロックAPLL_CLKから派生しています。 I2Sモジュールのシリアルクロック(BCK)は、I2Sn_CLKから派生します。 レジスタI2S_CLKM_CONF_REGのI2S_CLKA_ENAビットを使用して、PLL_D2_CLKまたはAPLL_CLKのいずれかをI2Snのクロックソースとして選択します。 デフォルトでは、PLL_D2_CLKがI2Snのクロックソースとして使用されます。

注:

  • PLL_D2_CLKをクロックソースとして使用する場合は、10進数を使用して分周することは推奨されません。 高性能オーディオアプリケーションでは、アナログPLL出力クロックソースAPLL_CLKを使用して高精度のI2Sn_CLKとBCKを取得する必要があります。 詳細は、リセットとクロックの章を参照してください。
  • ESP32 I2Sがスレーブモードで動作するとき、マスターはマスタークロックとしてI2Sn_CLKを使用し、fi2s> = 8 * fBCK

I2Sn_CLK周波数fi2sと分周器クロックソース周波数fpllの関係は、次の式で示されます。

値が2以上のNは、レジスタI2S_CLKM_CONF_REGのREG _CLKM_DIV_NUM [7:0]ビットに対応し、bはI2S_CLKM_DIV_Bビット、aはI2S_CLKM_DIV_A [5:0]ビットです。

マスターモードでは、I2SモジュールのシリアルクロックBCKはI2Sn_CLKから派生します。

マスター送信モードでは、値が2以上のMは、レジスタI2S_SAMPLE_RATE_CONF_REGのI2S_TX_BCK_DIV_NUM [5:0]ビットです。
マスター受信モードでは、“ M”はレジスタI2S_SAMPLE_RATE_CONF_REGのI2S_RX_BCK_DIV_NUM [5:0]ビットです。

12.4 I2S Mode

12.4.1 Supported Audio Standards

12.4.1.1 Philips Standard

12.4.1.2 MSB Alignment Standard

12.4.1.3 PCM Standard

12.4.2 Module Reset

レジスタI2S_CONF_REGの下位4ビット、つまりI2S_TX_RESET、I2S_RX_RESET、I2S_TX_FIFO_RESET、およびI2S_RX_FIFO_RESETは、それぞれ受信モジュール、送信モジュール、および対応するFIFOバッファをリセットします。 リセット動作を終了するには、対応するビットをセットしてからソフトウェアでクリアする必要があります。

12.4.3 FIFO Operation

FIFO動作に対するデータ読み取り/書き込みパケット長は32ビットである。
FIFOバッファのデータパケットフォーマットはコンフィギュレーションレジスタを使って設定できます。 図61に示すように、送信データと受信データの両方を先にFIFOに書き込み、次にFIFOから読み取る必要があります。 FIFOにアクセスする方法は2つあります。 1つはCPUを使用してFIFOに直接アクセスすること、もう1つはDMAコントローラを使用してFIFOにアクセスすることです。

一般に、レジスタI2S_FIFO_CONF_REGのI2S_RX_FIFO_MOD_FORCE_ENビットとI2S_TX_FIFO_MOD_FORCE_ENビットの両方を1に設定する必要があります。 ハードウェアは受信データ長RX_LENと送信データ長TX_LENを検査します。 受信データと送信データはどちらもFIFO方式でバッファされます。

RX_LENがI2S_RX_DATA_NUM [5:0]より大きい場合、FIFOにバッファされている受信データは設定されたしきい値に達しており、オーバーフローを防ぐために読み出す必要があります。 TX_LENがI2S_TX_DATA_NUM [5:0]よりも小さい場合、FIFOにバッファされている送信データは設定されたしきい値に達しておらず、ソフトウェアはFIFOにデータを送り続けることができます。

12.4.4 Sending Data

ESP32 I2Sモジュールは、3段階でデータ送信操作を実行します。

  • 内部ストレージからデータを読み取り、それをFIFOに転送する
  • FIFOから送信するデータを読み出す
  • ユーザの設定に従って、データをシリアルに、またはパラレルにクロックアウトする

最初の段階では、データを送信してFIFOに書き込むためのモードが2つあります。 送信FIFOモード0では、送信データは時間順にFIFOに書き込まれます。 送信FIFOモード1では、送信データは上位16ビットと下位16ビットに分けられます。 そして、上位16ビットと下位16ビットの両方を再構成してFIFOに書き込みます。 詳細を図66に示し、対応するレジスタを表58に示します。それは、

第2段階では、関連するレジスタ設定に従って、システムはFIFOから送信されるデータを読み取ります。 システムがFIFOからデータを読み取るモードは、I2S_TX_FIFO_MOD [2.0]およびI2S_TX_CHAN_MOD [2:0]の設定に関連しています。 表58に示すように、I2S_TX_FIFO_MOD [2.0]はデータが16ビットか32ビットかを決定し、表59に示すようにI2S_TX_CHAN_MOD [2:0]は送信データのフォーマットを決定します。

12.4.5 Receiving Data

ESP32 I2Sモジュールのデータ受信フェーズは、さらに3つの段階で構成されています。

  • 入力シリアルビットストリームは、I2Sモードで64ビットパラレルデータストリームに変換されます。 LCDモードでは、入力パラレルデータストリームは64ビットパラレルデータストリームに拡張されます。
  • 受信したデータはFIFOに書き込まれます。
  • データは、CPU / DMAによってFIFOから読み取られ、内部メモリに書き込まれます。

データを受信する最初の段階で、受信データストリームは、I2SnI_WS_out(またはI2SnI_WS_in)信号のレベルに応じて、32の上位ビットと32の下位ビットを持つゼロが埋め込まれたパラレルデータストリームに拡張されます。

レジスタI2S_CONF_REGのI2S_RX_MSB_RIGHTビットを使用して、データの展開方法を決定します。

Figure 67: The First Stage of Receiving Data

たとえば、図67に示すように、シリアルデータの幅が16ビットの場合、I2S_RX_RIGHT_FIRSTが1の場合、Data0は破棄され、I2SはData1からのデータの受信を開始します。 I2S_RX_MSB_RIGHTが1の場合、最初のステージのデータはf0xFEDC0000になります。 0x32100000g。 I2S_RX_MSB_RIGHTが0の場合、最初のステージのデータはf0x32100000になります。 0xFEDC0000g。 I2S_RX_RIGHT_FIRSTが0に等しい場合、I2SはData0からのデータの受信を開始します。

I2S_RX_MSB_RIGHTが1の場合、最初のステージのデータはf0xFEDC0000になります。 0x76540000g。 I2S_RX_MSB_RIGHTが0の場合、最初のステージのデータはf0x76540000になります。 0xFEDC0000g。

表60および図68に示すように、第2ステージでは、Rxユニットの受信データがFIFOに書き込まれます。

FIFOに受信データを書き込むには4つのモードがあります。 各モードはI2S_RX_FIFO_MOD [2:0]ビットの値に対応します。

Table 60: Modes of Writing Received Data into FIFO and the Corresponding Register Configuration

Figure 68: Modes of Writing Received Data into FIFO

第3段階では、CPUまたはDMAがFIFOからデータを読み取り、内部メモリに直接書き込みます。 各モードに対応するレジスタ構成を表61に示します。

Table 61: The Register Configuration to Which the Four Modes Correspond

12.4.6 I2S Master/Slave Mode

ESP32 I2Sモジュールは、I2Sバス上でマスターまたはスレーブデバイスとして機能するように構成できます。このモジュールは、マスタートランスミッターとレシーバーに加えて、スレーブトランスミッターとレシーバーの構成をサポートします

構成。これらのモードはすべて、I2Sバスを介した全二重および半二重通信をサポートできます。

レジスタI2S_CONF_REGのI2S_RX_SLAVE_MODビットとI2S_TX_SLAVE_MODビットは、それぞれI2Sをスレーブ受信モードとスレーブ送信モードに設定できます。

レジスタI2S_CONF_REGのI2S_TX_STARTビットは、送信を有効にするために使用されます。 I2Sがマスター送信モードで、このビットが設定されている場合、モジュールはクロック信号と左右のチャネルのデータを駆動し続けます。 FIFOがすべてのバッファデータを送信し、シフトする新しいデータがない場合、データの最後のバッチがデータラインでループされます。このビットがリセットされると、マスターはクロックとデータラインの駆動を停止します。 I2Sがスレーブ送信モードに設定され、このビットが設定されている場合、モジュールはマスターBCKクロックが送信操作を有効にするのを待ちます。

レジスタI2S_CONF_REGのI2S_RX_STARTビットは、受信操作を有効にするために使用されます。 I2Sがマスター送信モードでこのビットが設定されている場合、このビットがリセットされるまで、モジュールはクロック信号を駆動し、入力データストリームをサンプリングし続けます。 I2Sがスレーブ受信モードに設定され、このビットが設定されている場合、受信モジュールは受信動作を有効にするためにマスターBCKクロックを待機します。

12.5 LCD Mode

ESP32 I2SのLCDモードには3つの動作モードがあります。

  • LCDマスター送信モード
  • カメラスレーブ受信モード
  • ADC / DACモード

LCDマスター送信モードのクロック構成は、I2Sのクロック構成と同じです。 LCDモードでは、WSの周波数はfBCKの半分です。

ADC / DACモードでは、クロックソースとしてPLL_D2_CLKを使用してください。

12.5.1 LCD Master Transmitting Mode

図73に示すように、LCDのWR信号はI2S のWS信号に接続されています。 LCDデータバス幅は24ビットです。

I2SをLCDマスター送信モードに設定するには、レジスタI2S_CONF2_REGのI2S_LCD_ENビットを設定し、レジスタI2S_CONF_REGのI2S_TX_SLAVE_MODビットをクリアする必要があります。 一方、データは、レジスタI2S_CONF_CHAN_REGのI2S_TX_CHAN_MOD [2:0]ビットおよびレジスタI2S_FIFO_CONF_REGのI2S_TX_FIFO_MOD [2:0]ビットに従って、正しいモードで送信する必要があります。 WS信号は、GPIOマトリックスを経由するときに反転する必要があります。 詳細は、IO_MUXとGPIO Matrixに関する章を参照してください。 データバスとWR信号の両方が適切なモードで動作するように、I2S_CONF2_REGレジスタのI2S_LCD_TX_SDX2_ENビットとI2S_LCD_TX_WRX2_ENビットをLCDマスター送信モードに設定する必要があります。

図74と図75に示すように、データフレームのフォーム1で、I2S_LCD_TX_WRX2_ENビットを1に設定し、I2S_LCD_TX_SDX2_ENビットを0に設定する必要があります。フレーム内のI2S_LCD_TX_SDX2_ENビットとI2S_LCD_TX_WRX2_ENビットはどちらも1に設定します。 フォーム2

12.5.2 Camera Slave Receiving Mode

ESP32 I2Sは、外部カメラモジュールからの高速データ転送用のカメラスレーブモードをサポートしています。 図76に示すように、このモードでは、I2S はスレーブ受信モードに設定されます。 16チャネルデータ信号バスI2SnI_Data_inの他に、I2Sn_H_SYNC、I2Sn_V_SYNC、I2Sn_H_ENABLEなどの信号があります。

図76に示すように、CameraモジュールのPCLKは、I2SモジュールのI2SnI_WS_inに接続します。

I2Sがカメラスレーブ受信モードにあり、I2Sn_H_SYNC、I2S_V_SYNC、およびI2S_H_REFがハイに保持されている場合、マスターはデータの送信を開始します。こんな感じの式

転送開始 = (I2Sn_H_SYNC == 1)&&(I2Sn_V_SYNC == 1)&&(I2Sn_H_ENABLE == 1)

したがって、データ送信中は、これら3つの信号をハイレベルに保つ必要があります。 たとえば、カメラのI2Sn_V_SYNC信号がデータ送信中にローレベルの場合、I2Sモジュールに転送されたときに反転します。 ESP32はGPIOマトリックスによる信号反転をサポートしています。 詳細は、IO_MUXとGPIO Matrixに関する章を参照してください。

I2Sをカメラモードで動作させるには、レジスタI2S_CONF2_REGのI2S_LCD_ENビットおよびI2S_CAMERA_ENビットを1に設定し、レジスタI2S_CONF_REGのI2S_RX_SLAVE_MODビットを1に設定し、I2S_RX_MSB_RIGHTビットとI2S_CONF_REGのI2S_RX_RIGHT_FIRSTビットは0に設定します。したがって、I2S はLCDスレーブ受信モードで動作します。 同時に、正しいモードでデータを受信するには、レジスタI2S_CONF_CHAN_REGのI2S_RX_CHAN_MOD [2:0]ビットとレジスタI2S_FIFO_CONF_REGのI2S_RX_FIFO_MOD [2:0]ビットの両方を1に設定します。

12.5.3 ADC/DAC mode

LCDモードでは、ESP32のADCとDACはデータを受信できます。 I2S0モジュールを内蔵ADCに接続するときは、I2S0モジュールをマスター受信モードに設定する必要があります。 図77に、I2S0 モジュールとADCの間の信号接続を示します。

最初に、レジスタI2S_CONF2_REGのI2S_LCD_ENビットを1に設定し、レジスタI2S_CONF_REGのI2S_RX_SLAVE_MODビットを0に設定して、I2S0モジュールをLCDマスター受信モードで動作させ、I2S0モジュールクロックをWSの受信モードに設定します。I2S0 は適切な周波数を出力します。 次に、APB_CTRL_APB_SARADC_CTRL_REGレジスタのAPB_CTRL_SARADC_DATA_TO_I2Sビットを1に設定します。SARADCの関連レジスタを設定した後、I2Sがデータを受信できるようにします。 詳細については、「オンチップセンサとアナログ信号処理」の章を参照してください。

I2S0モジュールは、内蔵DACに接続するときにマスター送信モードに設定する必要があります。 図78に、I2S0 モジュールとDACの間の信号接続を示します。 この構成では、DACの制御モジュールはI2S_CLKをクロックと見なします。 図79に示すように、データバスがDACの制御モジュールにデータを入力すると、後者はDAC1モジュールに右チャンネルのデータを、DAC2モジュールに左チャンネルのデータを入力します。 I2S DMAモジュールを使用する場合、8ビットの送信データが8ビットの受信データだけ左にシフトされて、DMAダブルバイトタイプのバッファに入ります。

I2S_CONF2_REGレジスタのI2S_LCD_ENビットを1に設定し、I2S_RX_SHORT_SYNC、I2S_CONF_REG、I2S_RX_MSB_SHIFTおよびI2S_TX_MSB_SHIFTをすべて0に設定し、I_S_TX_MSB_SHIFTを0に設定する必要があります。 I2S0。 16ビットデジタルデータストリームの伝送規格に従って、適切な伝送モードを選択してください。 I2S_CLKとI2SのWSに適した周波数を出力するようにI2S0モジュールクロックを設定します。 関連するDACレジスタを設定した後、データを送信するためにI2S0を有効にします。

12.6 I2S Interrupts

12.6.1 FIFO Interrupts
  • I2S_TX_HUNG_INT:
    データ送信がタイムアウトしたときにトリガされます。
  • I2S_RX_HUNG_INT:
    受信データがタイムアウトしたときにトリガされます。
  • I2S_TX_REMPTY_INT:
    送信FIFOが空のときにトリガされます。
  • I2S_TX_WFULL_INT:
    送信FIFOがフルのときにトリガされます。
  • I2S_RX_REMPTY_INT:
    受信FIFOが空のときにトリガされます。
  • I2S_RX_WFULL_INT:
    受信FIFOがフルのときにトリガされます。
  • I2S_TX_PUT_DATA_INT:
    送信FIFOがほぼ空になったときにトリガされます。
  • I2S_RX_TAKE_DATA_INT:
    受信FIFOがほぼいっぱいになったときにトリガされます。
2.6.2 DMA Interrupts
  • I2S_OUT_TOTAL_EOF_INT:
    すべての送信リンクリストが使い果たされたときにトリガされます。
  • I2S_IN_DSCR_EMPTY_INT:
    有効な受信リンクリストが残っていないときにトリガされます。
  • I2S_OUT_DSCR_ERR_INT:
    無効なrxlink記述子が検出されたときにトリガされます。
  • I2S_IN_DSCR_ERR_INT:
    無効なTXリンクディスクリプタが検出されたときにトリガされます。
  • I2S_OUT_EOF_INT:
    rxlinkがパケット送信を終了したときにトリガされます。
  • I2S_OUT_DONE_INT:
    送信データとバッファデータがすべて読み出されたときにトリガされます。
  • I2S_IN_SUC_EOF_INT:
    すべてのデータを受信したときにトリガされます。
  • I2S_IN_DONE_INT:
    現在のtxlink記述子が処理されたときに発生します。

19. Watchdog Timers

19.1 Introduction

ESP32には3つのウォッチドッグタイマーがあります。2つのタイマーモジュールのそれぞれに1つ(メインシステムウォッチドッグタイマー、またはMWDTと呼ばれます)、RTCモジュールに1つ(RTCウォッチドッグタイマー、またはRWDTと呼ばれます)。 これらのウォッチドッグタイマーは、予期しない障害から回復することを意図しており、アプリケーションプログラムが通常のシーケンスを放棄する原因となります。 ウォッチドッグタイマーには4つの段階があります。 ウォッチドッグが供給または無効化されていない限り、このステージのプログラムされた期間が終了すると、各ステージは3つまたは4つのアクションのうち1つを実行できます。 アクションは、割り込み、CPUリセット、コアリセット、システムリセットです。 RWDTのみがシステムリセットをトリガーでき、チップ全体とRTC自体を含むメインシステムをリセットできます。 タイムアウト値は、各ステージに個別に設定できます。

フラッシュブート中に、RWDTと最初のMWDTが自動的に起動し、ブートの問題を検出して回復します。

19.2 Features

•4つのステージ。それぞれを個別に設定または無効化できます
•各段階のプログラム可能な期間
•各段階の終了時の3つまたは4つの可能なアクション(割り込み、CPUリセット、コアリセット、システムリセット)のうち1つ
•32ビットの有効期限カウンター
•RWDTおよびMWDT構成が誤って変更されるのを防ぐための書き込み保護。
•フラッシュブート保護
SPIフラッシュからの起動プロセスが所定の時間内に完了しない場合、ウォッチドッグはメインシステム全体を再起動します。

19.3 Functional Description

19.3.1 Clock

RWDTはRTC低速クロックからクロックされます。通常、低速クロックは32 KHzです。 MWDTクロックソースは、事前のMWDT 16ビット構成可能なプリスケーラーを介してAPBクロックから取得されます。 どちらのウォッチドッグでも、クロックソースは32ビットの有効期限カウンターに送られます。 このカウンターが現在のステージのタイムアウト値に達すると、ステージに設定されたアクションが実行され、有効期限カウンターがリセットされ、次のステージがアクティブになります。

19.3.1.1 Operating Procedure

ウォッチドッグタイマーを有効にすると、ステージ0からステージ3にループし、その後ステージ0に戻って再び開始します。各ステージの有効期限アクションと期間は個別に構成できます。

有効期限タイマーがステージのタイムアウト値に達した場合、すべてのステージを次のいずれかのアクション用に構成できます。

•割り込みをトリガーする
ステージが終了すると、割り込みがトリガーされます。
•CPUコアのリセット
ステージの有効期限が切れると、指定されたCPUコアがリセットされます。 MWDT0 CPUリセットは、PRO CPUのみをリセットします。 MWDT1 CPUリセットは、APP CPUのみをリセットします。 RWDT CPUリセットは、構成に応じて、これらのいずれか、または両方をリセットできます。
•メインシステムをリセットする
ステージの有効期限が切れると、MWDTを含むメインシステムがリセットされます。この記事では、メインシステムにCPUとすべての周辺機器が含まれています。 RTCはこれの例外であり、リセットされません。
•メインシステムとRTCをリセットする
ステージの有効期限が切れると、メインシステムとRTCの両方がリセットされます。このアクションは、RWDTでのみ使用できます。
•無効
この段階はシステムに影響を与えません。

ソフトウェアがウォッチドッグタイマーを供給すると、ステージ0に戻り、有効期限カウンターが0から再起動します。

19.3.1.2 Write Protection

MWDTとRWDTの両方は、誤った書き込みから保護できます。 これを実現するために、これらには書き込みキーレジスタ(MWDTのTIMERS_WDT_WKEY、RWDTのRTC_CNTL_WDT_WKEY)があります。リセット時に、これらのレジスタは値0x50D83AA1に初期化されます。 このレジスタの値が0x50D83AA1から変更されると、書き込み保護が有効になります。 フィードレジスタを含むWDTレジスタへの書き込み(ただし、書き込みキーレジスタ自体は除く)は無視されます。 WDTにアクセスするための推奨手順は次のとおりです。

1.書き込み保護を無効にします
2.必要な変更を加えるか、ウォッチドッグにフィードします
3.書き込み保護を再度有効にします

19.3.1.3 Flash Boot Protection

フラッシュブート中、タイマーグループ0(TIMG0)のMWDTとRWDTは自動的に有効になります。 有効なMWDTのステージ0は、有効期限が切れるとシステムをリセットするように自動的に構成されます。 RWDTのステージ0は、期限が切れるとRTCをリセットします。 起動後、レジスタTIMERS_WDT_FLASHBOOT_MOD_ENをクリアしてMWDTのフラッシュブート保護手順を停止し、RTC_CNTL_WDT_FLASHBOOT_MOD_ENをクリアしてRWDTでも同様にする必要があります。 この後、MWDTとRWDTをソフトウェアで構成できます。

19.3.1.4 Registers

MWDTレジスタはタイマーサブモジュールの一部であり、「タイマーレジスタ」セクションで説明されています。 RWDTレジスタはRTCサブモジュールの一部であり、RTCレジスタセクションで説明されています。

20. eFuse Controller

20.1 Introduction

ESP32には、システムパラメータを保存する多くのeFuseがあります。 基本的に、eFuseは1ビットの不揮発性メモリで、eFuseビットが1にプログラムされると0に戻せないという制限があります。

ソフトウェアは、必要に応じて各システムパラメータの各ビットをプログラムするようにeFuse Controllerに指示できます。

これらのシステムパラメータの一部は、eFuse Controllerを使用してソフトウェアで読み取ることができます。 システムパラメータの一部は、ハードウェアモジュールでも直接使用されます。

26. PID/MPU/MMU

26.1 Introduction

ESP32のすべてのペリフェラルおよびメモリセクションは、MMU(メモリ管理ユニット)またはMPU(メモリ保護ユニット)を介してアクセスされます。 MPUは、OSが特定のアプリケーションに与えた許可の種類に応じて、メモリ範囲または周辺機器へのアプリケーションのアクセスを許可または禁止できます。 MMUは同じ操作を実行できるだけでなく、仮想メモリから物理メモリへのアドレス変換も実行できます。 これを使用して、内部または外部メモリ範囲を特定の仮想メモリ領域にマップできます。
これらのマッピングは、アプリケーション固有にすることができます。 したがって、各アプリケーションを調整し、適切に実行するために必要なメモリ構成を設定できます。 OSとアプリケーションを区別するために、各アプリケーションまたはOSが実行できる8つのプロセス識別子(またはPID)があります。 さらに、各アプリケーション(OS)には、独自のマッピングと権限のセットが装備されています。

26.3 Functional Description

26.3.2 MPU/MMU

MPUおよびMMUは、オンチップメモリ​​、オフチップメモリ​​、および周辺機器を管理します。これを行うために、それらはペリフェラルまたはメモリ領域にアクセスするプロセスに基づいています。具体的には、コードがMMU / MPUで保護されたメモリ領域または周辺機器にアクセスしようとすると、MMUまたはMPUは、プロセスが実行されているCPUに関連付けられたPIDジェネレーターからPIDを受け取ります。
オンチップメモリ​​および周辺機器の場合、MMUおよびMPUが行う決定はこのPIDのみに基づきますが、コードが実行されている特定のCPUは考慮されません。その後、内部メモリと周辺機器のMMU / MPU構成では、8つの異なるPIDのエントリのみが許可されます。対照的に、外部メモリへのMMUモデレートアクセスでは、PIDだけでなく、リクエストの送信元であるCPUも考慮されます。これは、MMUがAPP_CPUで実行されている場合はすべてのPID、PRO_CPUで実行されている場合はすべてのPIDの構成オプションがあることを意味します。実際には、両方のCPUからのアクセスは特定のプロセスに対して同じ結果になるように構成されますが、そうすることはハードウェア要件ではありません。
この情報に基づいてMPUが決定できるのは、プロセスがメモリ領域または周辺機器にアクセスすることを許可または拒否することです。 MMUにも同じ機能がありますが、さらに、プロセスが取得した仮想メモリアクセスを、まったく異なる物理メモリ領域に到達する可能性のある物理メモリアクセスにリダイレクトします。このようにして、MMUが制御するメモリをプロセスごとに再マッピングできます。

26.3.2.2 External Memory

外部フラッシュおよび外部SPI RAMへのアクセスはキャッシュを介して行われ、MMUによっても処理されます。このキャッシュMMUは、プロセスのPIDとプロセスが実行されているCPUに応じて、異なるマッピングを適用できます。 MMUは、内部メモリMMUと同様の方法でこれを行います。つまり、仮想メモリのすべてのページに対して、この仮想ページがどの物理ページにマッピングされるべきかを詳述するレジスタがあります。
ただし、内部メモリを管理するMMUとキャッシュMMUには違いがあります。まず、キャッシュMMUのページサイズは固定(外部フラッシュの場合は64 KB、外部RAMの場合は32 KB)で、次に、MMUエントリでアクセス権を指定する代わりに、キャッシュMMUは各PIDの明示的なマッピングテーブルとプロセッサコアがあります。この章の残りの部分では、MMUマッピング構成レジスタを「エントリ」と呼びます。これらのレジスタは、PIDが0または1のプロセスからのみアクセスできます。 PIDが2〜7のプロセスは、上記のプロセスのいずれかに委任して、MMU設定を変更する必要があります。
前述のように、MMUエントリは、仮想メモリページアクセスを物理メモリページアクセスにマッピングするために使用されます。 MMUは仮想アドレス空間の5つの領域を制御します(表103を参照)。VAddr1〜V Addr4は外部フラッシュへのアクセスに使用され、V AddrRAMは外部RAMへのアクセスに使用されます。 V Addr4はV Addr0のサブセットであることに注意してください。

Table 103: Virtual Address for External Memory

スポンサーリンク


Amazon.co.jp 当ブログのおすすめ
Amazon.co.jp
M5Stack Basic
スイッチサイエンス
Amazon.co.jp
ESPr Developer 32
スイッチサイエンス(Switch Science)
Amazon.co.jp
Amazon.co.jp

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください