カメラからの入力をSPI通信にて転送する仕組みを作っています。
カメラからの入力を転送する部分でアドバイス頂けると助かります。
PDC(カメラモジュール)のFIFOに入力されたYUV422データをDMAを使用して、内蔵RAM( H’0004 0000)へと32Bit ずつブロック転送しています。
カメラモジュールの解像度を変更(480×272→640×480)に伴い内蔵RAMでは容量不足になるためDMAの転送先を内蔵RAM→SDRAM(H’0800 0000)へと変更したところ FIFOオーバラン発生(PDC.PCSR.OVRF)が発生しています。「カメラ→PDC FIFO > DMA転送時間」となっていることが原因と考えておりますが、調査方法がわかっていません。
640×480のカメラを使用する必要があり、カメラ解像度≒内蔵RAMに収まるサイズになるのか、DMA、PDCの設定で対応可能なのかを知りたいです。
下記に確認した内容、質問を記載いたします。
・カメラの解像度を480×272にし、DMA転送先を変更 ▼内蔵RAMへ転送:オーバーラン発生せず
▼SDRAMへ転送:オーバラン発生
→転送先に依存、解像度に依存しない
・カメラモジュールからの入力をDMAを使用してSDRAMへと転送すること自体が問題?転送速度、量の問題?
SDRAM初期化はサンプルコードのままです。
・FIFOオーバラン発生時にDMA再実施などの処理を入れましたが、頻度が高すぎるため根本的な原因を調査しておきたい。
hirakuni45さんふぐりんさんこんにちはTTSSです。早速のアドバイスありがとうございます。オシロにて書込み速度を測定しました。100KBの書き込みで内蔵RAMのほうが1.6倍高速でした。
内蔵RAM:5.5ms
SDRAM:8.8ms
SDCCRは16bitとなります。(デバイス:M12L128168A)CPUからは読み書きとも出来ていました。
今回使用しているカメラからのデータは、320…
こんんちは、TTSSさん
DMAでは無く、CPUで転送するとどうなるでしょうか?
※そもそも、SDRAM領域は、CPUで正しく読み書き出来るでしょうか?
※SDRAMの初期化は、SDRAMの仕様に合っていますか?
又、内蔵RAMと、SDRAMで、書き込み速度を計測して、どのくらい違うのかを調べてみてはどうでしょうか?
※TPUなどで、なるべく分解能が高いカウンタを作り、100Kバイトくらいを埋めるのにかかる時間を計測するなど
---
ウエィトの無効ループは、最適化すると、無くなると思うので、何か対策が必要だと思います。
TTSSさんこんにちはSDRAMのデータバス幅は16bitですか?(SDCCRレジスタ)16bitであれば内蔵RAMに比べてだいぶ遅いのではないでしょうか?hirakuni45さんのおっしゃるように、まずは書き込み速度の確認が必要だと思います。
今回使用しているカメラからのデータは、320×272×2 =255KBです。
内蔵RAMなら14ms
SDRAMなら22.4msフレームレートが60fpsの場合はSDRAMではオーバーフローしてしまうのかとも考えています。
>DMAでは無く、CPUで転送するとどうなるでしょうか?こちらの関しても調査してみます。
追加で調査をしオーバーフローしない対応はわかりました。使っていたサンプルコードの使用方法が悪かったです。
サンプルコードはカメラからの入力をLCDへと表示するプログラムでした。
LCDは未接続で、プログラムはLCDありの状態(そのまま)で使用していました。LCDへはSDRAMからEXDMAを使用してLCDへと転送しています。いったんEXDMAを有効にしないようにしたところ、カメラ→SDRAMでオーバーフローが発生しなくなりました。オーバーフローの原因はDMA(カメラ→SDRAM)とEXDMA(SDRAM→LCD)に起因しているところまでわかりました。EXDMAの仕組みは理解できていませんので、根本理由はわかっておりません。