2020年06月27日

Nucleo144 Memory Shield

大容量のデータをマイコンで扱う場合、一時的なデータ保存に揮発性のSRAMやSDRAM、バックアップデータに不揮発性のNAND FlashメモリやNOR Flashメモリを使うことが多いと思います。不揮発性のデータの場合、仕様によってはSDカードを使うこともあるかもしれません。また、昨今はSPI接続の大容量PSRAMも増えています。そのような中でメモリを選択する場合、容量拡張性や部品供給安定性を考慮するとパラレル接続のメモリを選択することが多くなります。一方でSTM32マイコン等でもパラレルメモリを搭載した評価ボードは一部のEvalボードにSDRAMが搭載されるくらいでSRAM、NOR Flash、2つのSDRAM、2つのSRAMといった評価まで対応したボードがありませんでした。

そこでNucleo144のメモリシールドを設計してみました。一般的なパラレル接続のメモリに対応しており、SDRAM x2、SRAM x2、NAND Flash x1、NOR Flash x1を搭載しています。STM32H743Zをターゲットに設計しましたが、他のSTM32F743といったボードでも利用できると思います。なお、Nucleo144の外側のCN11とCN12のみ使用しています。内側のCN7、CN8、CN9、CN10はボードのレビジョンによってピンアサインが異なるため使用していません。

ターゲットとしているフットプリントとメモリは下記の通りです。

SDRAMx2TSSOP-U 54ピンMT48LC16M16A2P
SRAMx2TSSOP-U 44ピンCY62157EV30LL
NOR Flashx1TSSOP-T 56ピンMT28EW512A
NAND Flashx1TSSOP-T 48ピンMT29F8G08A

SDRAMやNAND Flashはピンアサインやフットプリントがほぼ統一されているため、他のメモリでも動作すると思いますが、SRAMやNOR Flashはメーカによってパッケージが様々でピンアサインも異なる場合があり注意が必要です。ただ、多くはデータやアドレスピンの順番が互い違いになっているだけのことが多く、フットプリントが同じで一部の順番が互い違いあれば、異なるメモリの場所に互い違いに保存されるだけで動作上は問題ありません。


ns.jpg

実際に基板に実装してSDRAM x2とNAND Flash x1の動作確認ができました。

mem-shield.JPG

必要な配線はNucleo144の外側のCN11とCN12のみ使用しています。内側のCN7、CN8、CN9、CN10にピンを立てる必要はありません。また、CN11、CN12の片側のGNDはピンがデフォルトで立っているため、当該箇所のソケットを除いて実装しました。

今後、SRAM x2 NOR Flashの動作確認を行い、問題なければこちらで基板のデータの他にCubeMXのプロジェクトファイル、コードを合わせて公開したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年06月13日

オーディオADコンバータCS53L30

以前に紹介したUSB-I2S変換IC CP2615に接続するオーディオ用のADコンバータ、Cirrus Logic製CS53L30について紹介します。

CS53L30はTDM or I2S接続のオーディオ用ADCです。24bit 48kHzのサンプリングレートに対応しています。また、最大4つのアナログマイクorPDM出力のデジタルマイクを接続可能です。なお、4つのマイクを同時に使用するためにはTDM接続か、2チャンネルのI2S接続が必要です。I2S変換ICのCP2615は1つのI2S入出力を備えるため、CS53L30とCP2615の組み合わせでは左右2つのマイク接続となります。

デジタル入力、アナログ入力の切り替え、アンプ増幅ゲイン、サンプリングレート等の設定はI2Cを介して設定します。CS53L30のI2Cを介した設定の注意点として、各レジスタの値書き換え、値読み込みは1byte毎に行う点です。連続でレジスタの値書き換え、値読み込みはできません。よくあるI2Cデバイスの場合、デバイスアドレス、レジスタアドレス、データの順にデータを送った後にそのままデータを送ると、自動的にレジスタアドレス+1されて値の書き換えや読み込みが可能です。CS53L30の場合、自動的にレジスタアドレスがインクリメントされません。最後の値が適用されます。この仕様に気づくまで意図した設定が有効にならず、苦戦してしまいました。


ブレッドボード上でCS53L30とCP2615を組み合わせてPDMデジタルマイク、SPH0641LU4H-1を2つ接続し、USBステレオオーディオとして音を取り込むことを確認することができました。PDMデジタルマイクの評価検討用の基板としてCS53L30とCP2615を組み合わせてUSB-PDM変換基板を設計してみました。CP2615を利用することで接続すると自動的にUSB標準オーディオデバイスとして認識されます。PDMマイクを接続することで簡単にPCやMac等のオーディオ入力に変換することができます。CP2615のパラメータを書き換えることでアナログマイクを接続したり、ゲインやフィルタを設定することもできます。


usb_pdm.jpg

USB-PDM変換基板の検証が問題なければ、諸情報を公開したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年06月06日

高感度磁界センサDRV425

今回はTI製高感度磁界センサDRV425について紹介します。通常のホール素子やホールスイッチよりも非常に高感度で±2mT、帯域最大47kHzで磁界をアナログ出力を得ることができます。また、DRV425に接続するシャント抵抗を変更することで感度を調整して、より高感度(データシート上では±0.1mT)に設定することができます。

用途としては電流センサや磁石検出、位置センサの用途を想定しているようです。今回はDRV425の評価ボード、DRV425EVMを使用して簡単な実験をしてみました。

DRV425.JPG


DRV425EVMはデフォルトの感度設定は±0.5mTとなっています。±0.5mTの場合、1mT/3.3V=0.3mT/Vとなります。一方、日本の地磁気は45uTとなるため、0.33Vの範囲で出力されると予想されます。DRV425EVMを回転させてオシロで観察してみました。

rotate-range.jpg

ほぼ0.33Vのレンジで出力されており、地磁気も検出できる感度であることが分かりました。



続いて、ネオジム磁石NE099(表面磁束140mT)を近づけて検出範囲を調べてみると70mm前後の離れた10mm前後動かすと100mV程度の変化を捉えることができました。

osc-range.jpg

DRV425は非常に高感度で感度調整が可能な使いやすい磁界センサだと思いました。ただ、電流センサとして使用する場合はデータシートにも記載されていますが、2つDRV425を使用して地磁気をキャンセルさせるように差動で構成しないと、設置向きによって地磁気の影響を受けてしまいます。

cs.jpg

DRV425を使いやすく固定穴をつけたボートを作成してみました。設計したボードで評価を行い、問題なければ、諸情報を公開したいと思います。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年05月30日

Win環境でのRust試食

安全性、速度、並行性にフォーカスしたシステムプログラミング言語としてRustが昨今、話題です。今回は手持ちのSTM32F042のNucleoボードを用いて、Windows環境でRust組み込みプログラミングをしてみました。Rust+STM32組み込み系の場合、MacやUbuntuを使った例が多いですが、今回はWindows環境でopenocdを使用せずに行いました。Rust版STM32HALライブラリを使用してLチカをやってみました。


@Rust環境構築
Rust公式サイトからインストーラーをダウンロードしてインストールします。CLIベースなので最初は戸惑うかもしれませんが、コマンドラインに従ってインストールを行います。インストール後、コマンドラインからcargoと打って下記の様なメッセージが出ればインストール成功です。

cargo.jpg


Aクロスコンパイル環境構築
Windows環境でArmバイナリを生成するためのクロスコンパイル環境のパッケージをインストールします。使用するマイコンによって選択する必要があります。今回はSTM32F042でM0系なので、thumbv6m-none-eabiを使用しました。下記のコマンドを打ってパッケージをインストールします。

rustup target add thumbv6m-none-eabi

なお、環境によって選択するパッケージは下記の通りです。

ARM Cortex-M0 and Cortex-M0+thumbv6m-none-eabi
ARM Cortex-M3thumbv7m-none-eabi
ARM Cortex-M4 and Cortex-M7 (FPUなし) thumbv7em-none-eabi
ARM Cortex-M4F and Cortex-M7F(FPUあり) thumbv7em-none-eabihf


BArm Embedded Toolchainインストール
Rustで生成されるバイナリをbinファイルに変換したり、バイナリデータを確認する際に使用します。Armサイトからインストーラーをダウンロードしてインストールします。インストール設定のpath追加にチェックを入れてコマンドラインからアクセスできるようにします。

gcc-arm-none-eabi-*-20**-q*-major-win32.exe

CRust版HALライブラリ
Rust版HALライブラリをgithubサイトからダウンロードします。Zipファイルなので解凍します。

Dライブラリ書き換え
今回はLチカを行うため、stm32f0xx-hal-master\examples内のblinky.rsを使用します。デフォルトはPA1を点滅させるコードとなっているため、NucleoF042に搭載されているLED、LD3のポートPB3に書き換えます。blinky.rsをテキストエディタで開いて、17行目付近を下記のように書き換えます。

let gpiob = p.GPIOB.split(&mut rcc);
// (Re-)configure PB3 as output
let mut led = cortex_m::interrupt::free(|cs| gpiob.pb3.into_push_pull_output(cs));

Eコードコンパイル
初回は関連パッケージのダウロードとビルドが行われるため、時間が多少多くかかります。下記のコマンドでblinkyサンプルコードをコンパイルします。

cargo build --example blinky --release --features=stm32f042

Fバイナリデータ変換
コンパイルされたバイナリデータは下記のフォルダに生成されます。フォルダ内の拡張子がないblinkyというファイルがRustバイナリデータです。
\stm32f0xx-hal-master\target\thumbv6m-none-eabi\release\examples

下記のコマンドを打って、Rustバイナリデータをbinファイルに変換します。

arm-none-eabi-objcopy -O binary blinky blinky.bin

Gbinファイル書き込み
ST-LINK UtilityやCubeProgrammer等でbinファイルを書き込みます。LD3が点滅すれば成功です。for文の回数等を変更して点滅周期が変えたりしてみてください。

blink.jpg


今回はWindows環境でRust版STM32HALライブラリを使用してサンプルコードのLチカを行いました。Rustは安全性、速度、並行性に優れているということはよく言われますが、それ以外にメリットとして、組み込み系にもパッケージ管理が使えるようになったことです。パッケージ管理はLinuxやnodejs等では当たり前ですが、組み込み系では足りないファイルを追加したり、手動で管理する必要がありました。Rustの場合はパッケージ管理がデフォルトで有効になっているため、必要な記述を事前にしておけば、ビルド時に足りないファイルが自動的に取得されます。組み込み系で頻繁にパッケージのバージョンが変わるor変えることはあまりないかもしれませんが、足りないファイルが自動的に取得できるのはパッケージ管理の大きなメリットだと思いました。Rust版STM32HALライブラリは完成度も高いので、今後、ST公式でもサポートされればさらに面白くなると思いました。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年05月09日

外部高速ADC接続方法検討

アナログ信号をマイコンに取り込む場合、内蔵ADCを使用することが多いですが、入力電圧範囲、分解能、精度、絶縁、同時サンプリングといった制約でADCを外付けすることが必要な場合があります。低速な外部ADCの場合はI2C(~1MHz)やSPI(~数10MHz)の通信帯域で十分ですが、マルチチャンネルで高速なADCの場合はSPIでも帯域が足りないため、パラレルバスを採用したADCが多くなります。

一方、AnalogDevicesのLTC2358、LTC2458といった高速ADCではSPIと互換性を保ちつつ、パラレルバス接続するインターフェースを採用しています。具体的には一般的なSPI接続のCS、CLK、MOSI、MISOに加えて、MISO2、MISO3といった具合にMISOがパラレルになっています。MISOをパラレルにして増やすことで1回の通信時間を短くし、高速サンプリングを実現しています。今回はMISOがパラレルになっている外付けADCをどうSTM32マイコンと接続するか検討してみました。

検討に際してざっと思いつく通信方式を並べてみました。

方法@ QSPIを利用
方法A FMC/FSMCを利用
方法B GPIOで個別制御(bit-bang)
方法C 内蔵ADCでSDO読み込み 
方法D SPIを複数接続


方法@ QSPIを利用
STM32マイコンの一部にはQSPIインターフェスがあります。QSPIは主にNOR Flash接続するインタフェースとして使われています。QSPIは通信ラインが双方向です。一方、今回のインタフェースは通信方向は常に一定で決まっており、双方向ではありません。QSPIは次にデータを書き込むのか読み込むのかマスターからコマンドを送って通信方向を決定します。QSPIを個別にレジスタで制御して通信方向を決定できれば実現可能かもしれませんが、STM32マイコンのQSPI HALライブラリがNOR Flash用になっているため、あまり適切ではなさそうです。

方法A FMC/FSMCを利用
LCDや外付けRAM、パラレルバスとしてFMC/FSMCインタフェースがあります。FMCとFSMCの違いはFSMCにSDRAMリフレッシュ機能等をつけたのがFMCでFMCの方が高機能です。LCDのように一方的にマイコンからLCDに書き込む場合やメモリのようにリードライトを切り替えて処理する場合にFMC/FSMCが最適です。今回の場合はパラレルインタフェースでありながら、ADCに変換指令を送信しつつ、ADC変換結果を受信するため、同時に送受信を行う必要があります。FMC/FSMCがパラレルバスの同時送受信に対応しているか確認が必要です。また、既にバスラインをSDRAMで使用する予定があるため、この方法も厳しいと判断しました。


方法B GPIOで個別制御(bit-bang)
GPIOを個別に制御してソフトウェアSPIを実現する方法です。この方法であれば、MISOがパラレルになっている外付けADCでも対応可能です。ただ、課題として個別にGPIOを制御するために時間がかかるため、数MHzは容易に実現できそうですが、数10MHz以上のクロックを実現できるか分かりません。STからパラレルバス用のDMA転送ライブラリが提供されており、DMA転送もできなくはなさそうです。GPIOの個別制御は最終手段として取っておきたいと思います。


方法C 内蔵ADCでSDO読み込み 
SPIでCS、CLK、MOSI、MISOの通信に加えて、それ以外のMISO2、MISO3といったバスをADCで同時に取り込んでデジタル化する方法です。邪道な方法ですが、STM32マイコンのリソースを活用して実現するという意味では実現できそうです。問題点として取り込んだアナログ値をデジタル化するために処理が必要で連続で取り込むためにはRAMの制約を大きく受けます。ADCで取り込むことはできなくはなさそうですが、マイコンのリソース制約を大きく受けるため非現実的だと思いました。

方法D SPIを複数接続
STM32マイコンではSPIが複数利用できます。1つのSPIを送受信マスタとしてADCと接続し、それ以外を受信専用スレーブとしてのADCのSDOxと接続します。具体的には下記のような配線になります。複数SPIを同時に利用するためにDMA転送は必須です。事前に受信専用スレーブをDMA受信設定してから、マスタSPIから送信することで同時通信を実現します。

また、MISOがパラレルになっている外付けADCで今回使用予定のLTC2458はSDOのレーン数を常に8ライン使用する必要はなく、2レーン、4レーン選択できるようになっています。SPIが8つなくても、2つ、4つであれば、中規模以上のSTM32マイコンであれば搭載されているため、十分実現できそうです。

SPIの機能をそのまま使用しているため、通常はSPIを1レーンで使用し、帯域が必要な場合にのみ複数レーンを使用するといった切り分けが容易に実現できます。

ADC.jpg



実際に方法D SPIを複数接続で検討してみました。下記のようにDMA転送のPriorityを設定しました。また、SPIはNSS Signal TypeのHardwareを選択しました。

adc_dma.jpg


処理をprintfで出力すると下記のようになりました。STM32F411で検証した結果、Priority設定にもよりますが、SPI2が先に呼び出される前にSPI4、3が呼び出されました。

Init OK
Rx Cplt Callback:SPI4
Rx Cplt Callback:SPI3
RxTx Cplt Callback:SPI2
Rx Cplt Callback:SPI5

LTC2458は下記のように各SDOから順番循環して各チャンネルのAD変換結果が出力されます。1レーンで使用する場合はSDO0から1x8回データ取得し、2レーンの場合はSDO0とSDO4から2x4回データ取得、4レーンの場合はSDO0、SDO2、SDO4、SDO6の4x2回データ取得する感じです。

SDO0:[CH0]、[CH1]、[CH2]、[CH3]、[CH4]、[CH5]、[CH6]、[CH7]...
SDO1:[CH1]、[CH2]、[CH3]、[CH4]、[CH5]、[CH6]、[CH7]、[CH0]...
SDO2:[CH2]、[CH3]、[CH4]、[CH5]、[CH6]、[CH7]、[CH0]、[CH1]...
.
.
.

8回分のAD変換結果を書き出した結果が下記の通りになり、同じ値が循環して取得できていることから複数のSDOを読み込めていることが確認できました。

SDO0: 10459, 55041, 8220, 1782, 133, 64062, 62606, 61580,
SDO2: 8220, 1782, 133, 64062, 62606, 61580, 10459, 55041,
SDO4: 133, 64062, 62606, 61580, 10459, 55041, 8220, 1782,
SDO6: 62606, 61580, 10459, 55041, 8220, 1782, 133, 64062,


海外サイトでも同様の議論があり、実際に動いたかどうかまで書かれていませんでしたが、方法D SPIを複数接続で実現できることが確認できました。SPIの機能をそのまま利用しており、DMA転送や数10MHz程度のクロックを容易に実現できるため、DMA転送を利用した方法D SPIを複数接続は外部高速ADC接続方法として良いと思いました。

追記:アナログデバイセズのサイトでも接続方法について解説がありました。こちらも参考にしてください。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする