前回の記事で書いたようにSAM3S4AにつないだSPI LCDが初期化もできずにハマッテいましたが、ようやくとその原因がわかりました。
SPI LCDは書き込むだけで読み出しができません。そのため思いどおりに動いてくれていない状態では、正しく書き込めているかどうかが確認できません。そこで問題の切り分けのために、同じSPIにつながっているSPIフラッシュ(serial flash)の方の動作確認を先にとることにしました。SAM-BAを使ってAT25DF641への書き込みと読み出し確認がおこなえますので、SAM-BAで使うためのSAM3S4用のAppletを作成するところから作業を開始。SAM-BAに含まれるソースコードにはSAM3S用にはserial flash用appletのソースが用意されていなかったので、SAM3N用のコードに若干手をいれてやらねばならず時間とられましたが何とか無事にapplete作成に成功。さっそく試してみると、AT25DF641への書き込み/読み込みともに問題無く動作することが確認できました。これで少なくともSAM3S側のSPIが正しく動いていることは確認できました。
SPI LCD側を気づかぬうちに壊してしまったのかと、不安になりながらも作業続行。LCD側の配線は何度確認しても間違いないですし、ショートしている箇所もありません。しかたないのでLCDは後回しにして、I2C(TWI)でつないだCODECへのアクセス確認をしておこうと思い、レジスタへの書き込みとダンプ試験を実施。するとレジスタへ書き込んだつもりが、正しく読み出せない場合があることが判明。さらに調べると、初期化データを連続してPDCを使ったDMAで書き込み後、読み出してみると全く書き込めていないことがわかりました。
LCDの初期化でも初期化データを連続してPDCを使ったDMAで書き込んでいますので、どうやらDMAでの書き込みに問題があるということがわかりました。DMAでの読み出しの方は、リセット後のレジスタ初期値が正しく読み出せていますので、問題があるのは書き込みの場合だけのようです。
そこで改めてマニュアルを読み直してみたところ、バス・マトリックス(MATRIX)の説明部分でようやくと問題の原因を発見! PDCがマスターになった場合には、内蔵フラッシュメモリをスレーブとするアクセスができないという仕様になっています。そのためにフラッシュに書き込んである初期化データをDMAで書き込もうとしても書けないようです。試しにフラッシュから読み出した初期化データをいったんSRAMにコピーしてからDMAするように変更してやると、無事にCODECへの書き込みができるようになりました。LCDのアクセスにも同様の変更を施すことで、無事に初期化もできて文字表示できるようになりました。

SAM7Sではこんな制約はなかったので、すっかりはまってしまいました。これまでごく普通にフラッシュ上に配置したメッセージやデータをPDCによるDMAでデバイスに転送していましたので、今後もコードを移植する際には注意する必要がありそうです。
SPI LCDは書き込むだけで読み出しができません。そのため思いどおりに動いてくれていない状態では、正しく書き込めているかどうかが確認できません。そこで問題の切り分けのために、同じSPIにつながっているSPIフラッシュ(serial flash)の方の動作確認を先にとることにしました。SAM-BAを使ってAT25DF641への書き込みと読み出し確認がおこなえますので、SAM-BAで使うためのSAM3S4用のAppletを作成するところから作業を開始。SAM-BAに含まれるソースコードにはSAM3S用にはserial flash用appletのソースが用意されていなかったので、SAM3N用のコードに若干手をいれてやらねばならず時間とられましたが何とか無事にapplete作成に成功。さっそく試してみると、AT25DF641への書き込み/読み込みともに問題無く動作することが確認できました。これで少なくともSAM3S側のSPIが正しく動いていることは確認できました。
SPI LCD側を気づかぬうちに壊してしまったのかと、不安になりながらも作業続行。LCD側の配線は何度確認しても間違いないですし、ショートしている箇所もありません。しかたないのでLCDは後回しにして、I2C(TWI)でつないだCODECへのアクセス確認をしておこうと思い、レジスタへの書き込みとダンプ試験を実施。するとレジスタへ書き込んだつもりが、正しく読み出せない場合があることが判明。さらに調べると、初期化データを連続してPDCを使ったDMAで書き込み後、読み出してみると全く書き込めていないことがわかりました。
LCDの初期化でも初期化データを連続してPDCを使ったDMAで書き込んでいますので、どうやらDMAでの書き込みに問題があるということがわかりました。DMAでの読み出しの方は、リセット後のレジスタ初期値が正しく読み出せていますので、問題があるのは書き込みの場合だけのようです。
そこで改めてマニュアルを読み直してみたところ、バス・マトリックス(MATRIX)の説明部分でようやくと問題の原因を発見! PDCがマスターになった場合には、内蔵フラッシュメモリをスレーブとするアクセスができないという仕様になっています。そのためにフラッシュに書き込んである初期化データをDMAで書き込もうとしても書けないようです。試しにフラッシュから読み出した初期化データをいったんSRAMにコピーしてからDMAするように変更してやると、無事にCODECへの書き込みができるようになりました。LCDのアクセスにも同様の変更を施すことで、無事に初期化もできて文字表示できるようになりました。

SAM7Sではこんな制約はなかったので、すっかりはまってしまいました。これまでごく普通にフラッシュ上に配置したメッセージやデータをPDCによるDMAでデバイスに転送していましたので、今後もコードを移植する際には注意する必要がありそうです。