スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FM3のSPIを使ってみる

秋月にAQM1248Aを使ったSPI接続のLCDモジュール(とピッチ変換キット)が売られていたので、これに何かを表示させてみることにしました。

FM3でSPIを使う場合、CSIO(クロック同期シリアルインターフェイス)を使います。CSIOのモードはノーマル転送(I), ノーマル転送(II), SPI転送(I), SPI転送(II)の4種類あります。これは一般的なSPIモードと対応付けると下表の様になります。Spansion特有の書き方なのか、名称が紛らわしいです。なるべく一般的に出回っている規格に沿った名称にして欲しいものです。

SPI_01.png

ST7565R(AQM1248AのLCDコントローラ)はどのタイプを受け付けるかというと、ノーマルレベル=High, 立ち上がりエッジ読み込み…いわゆるmode3ってやつですね。つまり、FM3で実装する場合はノーマル転送(I)を使用する事になります。

ST7565RのSPI接続のクロックは、Max=20MHzの様です。一方、MB9AF312KではデータシートよりMFSはAPB2バスクロックに繋がっていてペリフェラルマニュアルの CHAPTER 2-1: クロック よりPCLK2の値になります。今回はPCLK2=20MHzとするので、ボーレートジェネレータの制約(注意事項にリロード値は3以上とあります)によりMAX=5MHzとなります。APB2バスクロックの上限は42MHzなので頑張れば8MHzとか出るみたいなので余裕があればやろうかな…。

SPI_03.png

USBSTICKのCSIO端子で比較的自由に使えるのが SOT3_1, SCK3_1 です。ch3はFIFOなしチャネルになります。AQM1248Aは出力をしないので、SIN3_1は必要ないです。これらを有効にする為に、GPIO周りの設定をします(PDOR5, EPFR07等々)。ペリフェラルマニュアルの CHAPTER 10:I/Oポートの 図2-1 を見るとだいたい必要なレジスタが分かってきます。もちろん、該当の章の内容をしっかりと読んでおかないと思わぬ落とし穴にはまってしまうことが往々にありますので、読むべき所は読んでおいてください。

SPI_04.png

CSIO関連レジスタの設定は表3-1に概要が記載されています。今回はFM3をマスターとして使用するので、SCR:MS=0, SMR:SCKE=1 です。

SPI_02.png

上記の表で決定しないといけない値はそれぞれのレジスタの詳細を参考にして設定します。注意点は…設定してから送信、受信を開始するって事くらいでしょうか。5MHz, 8bit, MSB firstで 0xA0 の出力が出ているかをオシロで確認してみました。やはりオシロで確認するのが一番ですね。といいつつ、まだまだ岩通のオシロ(UI)に慣れてなく、マニュアルを手放せませんが…。

SPI_07.jpg SPI_05.png

実は素のUSBSTICKとAQM1248Aを繋ぐのには問題があります。USBSTICKはその特性を生かして5Vで駆動されているのですが、AQM1248Aは3.3V動作なのです。USBSTICKの電源を外部から取り入れて3.3V動作させるというのもありるのですが、それではUSBSTICの手軽さが失われてしまいます。なので、今回はTC74VHC244FTを使って5.0V→3.3Vの電圧変換をすることにしました。入力側が5VトレラントになっているICなんです。幸いAQM1248Aは入力しかしないのでこのICで十分です。USB用に3.3Vを作っているのでVccを5.0Vと3.3Vで切り替えられる様に作ってくれても良かったのに…。

SPI_08.jpg

制御線はCS, RS, SCK, SOTの4本です。CS, RSはGPIOとして駆動させたピンを使います。

秋月の説明書ではAQM1248Aの昇圧様のコンデンサは2ms置きに段階的に有効にしていく様に記載されています。メーカ推奨手順と書いてありましたが、この2msが記述されている仕様書を見つける事ができませんでした。今回のプログラムでは2msという短い時間を作る構成になっていないので、min=10ms空けています。2ms以上なら良いだろうとの判断です。

SPI_06.jpg

画像データはWindows付属のペイントでモノクロ・ビットマップ画像を作成してモー配。でC言語用の配列に変換して使いました。そうです、自前品の宣伝です。便利ですよ~(^^

ソースコードは【物置】に置きました。
DMA転送を絡めてもよかったのですが、少し凝った作りを考えてますのでそのうちチャレンジしてみようと思います。
スポンサーサイト

tag : FM3ペリフェラル

FM3のDMACの使い方

USB-STICK(MB9AF312K)でDMACを使おうとして調べていると、非常に読み辛いマニュアル構成になっているので、自分なりにまとめてみました。当面の使用目的はUART0の送信データエンプティ割込み発生時にDMACを使って送信データをセットする事です。

ARMコアを扱うようになって、Spansion(旧富士通)のマニュアルは共通化されるようになり、その副作用で必要な部分が複数のマニュアルにまたがる構成になってしまっています。慣れるまではとにかく全てをDLしてきて検索しまくるのが手っ取り早いでしょう。今回もそうやって検索していてようやく見えてきました。

DMACを大々的に扱っているのが ペリフェラルマニュアル です。これのCHAPTER 9にDMACの事が書かれています。で、小難しい話はすっ飛ばし、使用するレジスタはなんだ? と 5.1 レジスタ一覧 を見てみると、DMACR, DMACAx, DMACBx, DMACSAx, DMACDAx を使うんだな~というのが分かります。「これらを設定すれば使えるんだ…」なんて思っているとしっぺ返しを食らいます。実際食らいました…。


mb9af312k_DMAC_02.png


5.1 レジスタ一覧 の内容はあくまでもDMACへの設定内容だけ。ペリフェラルの割り込みをトリガにする場合は、この割り込み側にも細工をする必要があり、それらはレジスタ一覧に載っている内容以外の所にあります。

CHAPTER 9 を熟読すると「あれっ、このレジスタの説明は何処にあるの?」となる部分があります。流し読みしてしまった私はこれにはまりました。2.1 DMACとシステム構成 の項目です。ブロック図と各の説明が書かれています。


mb9af312k_DMAC_01.png


要は、DMACのトリガとして対応しているペリフェラルの割り込み信号をDMACが受け取るには、割り込み信号をDMACかNVICのどちらに伝えるかを DRQSEL/DRQSEL1 で切り替え、DQESEL を設定する必要があるということです。DRQSEL/DRQSEL1, DQESEL のレジスタは上記レジスタ一覧に出てきません。これが何処にあるのかと言うと…、CHAPTER 7の割込みの章にあるんですよね。MB9AF312Kの製品TYPEはTYPE5に該当します(データシートの概要部分に記載されています)。割り込みベクタのリロケート機能は使わないので 割込み(A)を参照する事になる(表1-1より)。


mb9af312k_DMAC_03.png


DQESELはTYPE2だけに存在するレジスタらしく、TYPE5には関係ないらしいので無視しておきましょう。残るは DRQSEL/DRQSEL1 の2レジスタ。これは各割込み信号を伝える先を選択するレジスタで、今回はUART0の送信割込みをDMACで使うので、MFS ch0 の送信割込み信号をDMACへ伝える様にします。

これで、MFS ch0 送信割込みが来るとDMACが起動して、DMACでの転送が全て完了するとDMAC ch0 の割込み(NVIC経由)が入る。というストーリーができあがります。ここで忘れてはいけないのが、転送完了した時の処理方法です。そのまま放っておくと送信完了割込みはDMACに繋がったまま。で実際に送信完了になるとDMACを呼び出すが、DMACは転送完了しているので何もしない。何もしないので、このままにしておくって手もありますが、次の送信をDMA転送を使うとは限らないので、DMAC割込みが上がったタイミングで送信完了割込みをNVIC側へ繋いでおくのが良いでしょう。設計思想次第ですが…。それと、NVICの手前で割込み信号を振り分けているので割込み禁止にしてもDMACへの転送トリガは入ってしまう事に注意です。

あっ、ここまできて何ですが、各ペリフェラルでDMAC転送可能かをCHAPTER 1: システム概要 の 表 1-1 ペリフェラル・アドレスマップ にDMAC転送可能/不可能の表があるので、確認しておく必要があります。MFSは "可" になってます。


mb9af312k_DMAC_04.png


上記の事を踏まえて、プログラムを作成してみました。
SWを押下するとUART出力に文字列を出力する例です。


mb9af312k_DMAC_05.png


UARTの送信設定をしておいて、実際に出力する時はDMACにその内容を設定→割込み要因通知先をDMACに切り替えてDMAC開始→UARTの送信バッファは既に空なので即時にDMA転送開始→UART送信→DMA転送→ … → UART送信完了→DMAC割込み発生→ここで割込み要因通知先をNVIC側に設定→UART送信割込み発生→UART送信割込みを無効化する。といった流れにしています。

連打は考慮していないので、SWを1回押したら文字が全て出力されるのを待ってから押すようにしないとよろしくない動きをしてくれたりします。今の文字サイズだとチャタリング除去処理でおそらくそんなことにはならないと思いますが。DMACの汎用ライブラリとしてはまだまだ作り込みが必要ですね。

mb9af312k_uart_tx_dma_sw.zip

ここで1つ疑問があります。
UARTの送信データレジスタ(TDR)は16bitレジスタです。bit0~bit8の計9bit分を転送するときは16bitアクセスする必要があると書かれているが、bit0~bit7の計8bit分を転送する場合の設定方法は記載されていません。TDR直書きの時は気にせず8bit感覚で設定していましたが、DMACの場合は明確に書き込みのbit幅を設定しなくてはいけなく、また8bitでないとデータの渡し方が面倒なので、8bit幅で書き込んでます。これで動いているから良しとしましょう。この辺、マニュアルに書いてくれないと分からないですよ~、Spansionさん。

tag : FM3ペリフェラル

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。