2011年5月26日木曜日

秋月300円液晶応用準備の巻 (Part-7.5)

週は、どうも本業が忙しく、それに XMegaへの FatFS移植でちょっとした試行錯誤が続いたため、別ネタの用意は「ゴメンナサイ」させていただきたいと思う。

ということで、当初 (SPIモジュールではなく)USARTを使ってSDメモリカードとSPI通信しようと画策していたのだが、ちょいと予想外の展開になってきたため、今日のところは回路を少しいぢったことを、ごく軽く紹介しておきたいと思う。


速内容の方なのだが・・・
ジャンパーがまた増えちゃいました

基板の空きスペースが少ないので、本当はもうCPUボード上のハードはこれでFixにしておきたかったんだけど・・・ USARTとSPIのピン割り当てが違っているので、両者を切り替えて試したければ ジャンパーピンを立てるしか道はないということですな。

細かい話で恐縮だが、SPIインターフェースに1バイトのデータを投げる(結果は受け取らない)処理を例にしてみた。

元々のFatFSのサンプルプロジェクト(megaシリーズAVR)に入っていた処理は、こんな感じ。

 #define xmit_spi(dat) \
  SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF)


簡単でしょ?!
SPIのデータレジスタに値を書いて、送信完了まで待つだけだ。
ちなみに便宜上改行を入れてあるが、実際には1行で書いてある。

これが、XMegaの USARTを使う場合はこうなる。

 #define xmit_spi(dat) \
  while((USARTE1.STATUS & USART_DREIF_bm) == 0); USARTE1.DATA=(dat); \
  while((USARTE1.STATUS & USART_RXCIF_bm) == 0); USARTE1.DATA


送信データレジスタに空きができるまで待ち、データを書く。
そして送信(ダミーデータ受信)完了まで待って、ダミーデータを読まないといけない。

どうやら、ステータスレジスタやデータレジスタの読み込みが内部動作と関連付けられているようで、手順を省略してしまうと、理屈では問題ないはずなのに正しく動作しないという結果が待っている。
※初心にもどってちゃんと手順どおり書けば良いんだろうけど、「最初はデータがないからフラグは常に立ちっぱなし」などと端折るとハマることになる。 私も恥ずかしながら、何時間か無駄にしたからね~

ちょっと長くなったので、先を急ごう。

そして、XMegaのSPIを使う場合はこう。

 #define xmit_spi(dat) \
  SPIE.DATA=(dat); \
  while((SPIE.STATUS & SPI_IF_bm) == 0); SPIE.DATA


余分なフラグチェックは少しでも減らした方が幸せになれるはずだよね



際の基板はこんな感じに。
下側の基板(上辺中央やや右)にある黄色いジャンパーピンが、今回の追加部分ね。

そもそも何故にUSARTかというと、DMAが送受信とも使えるからという理由だったと記憶している。 でも今はまだDMA使っていないし、このまま使う必要が出てこない可能性もあると

まぁ、あとしばらくコードをいぢりながら悩んでみますかね・・・


・ ・ ・


★ 関連記事一覧 ★

4 件のコメント: