インターフェース 2008.5月号の付録基板 でいろいろ
2010.4 宮前
改定 2011.10
MCUは、LPC2388 が付いてます。
1. 開発環境
@ Cコンパイラ WINARM (20060606) を使用します。 arm-elf-gcc になります。
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm
リンク切れです
ここに置きます
解凍し C:\WinARM に置いた場合は、c:\WinARM\bin にパスを通します。
make で xxx.hex が作成される。
A ROM書込み
chanさんのが 速く快適です。(これしかない)
http://elm-chan.org/works/sp78k/report.html LPC2000用
これは、エラーが起きてもDOSプロンプトが一瞬で消えてしまうので、最初は面食らいます。
(バッチファイルにして、PAUSE とすれば止りますが)
書き込み時のメッセージを確認したい場合や、エラー時にメッセー時を見たい場合があるので
改造しました。 lpcsp-new.lzh
エラー時は必ず停止。正常でも停止したり、一定時間停止できます。(-wn)
(注) 2011.4.25付けでchan
さんが新しい版を公開しています。 -w の処理に修正が入りました。
-w1 を使用すれば、 エラーの場合停止します。
準備
1) lpcsp.exe と同じ場所に lpcsp.ini を作成する
中身は 1行です。 私のは COM4 なので。
-p4
これでエラーがあっても無くても、一旦停止します。
エラーが無い場合、一定時間表示させたい場合は、(この例は、8秒停止)
-w8
のように1行追加(合計2行)します。
-w1
これを指定すれば、エラー時に停止します。
又 ボーレートは、デフォルトでは、115200bpsです。もっと速く230400bpsにする場合は、
-p4:230400
のように追加します。私の環境では、問題なく動きました。
2) この場所にパス通す。
3) lpcsp.exe のショートカットを作成し、任意の場所に作成する。
書込み
1) JP2を押した(閉じた)状態でリセットボタン(JP1)押して放す。
JP2を放す。
2 ) lpcsp.exe のショートカットに 目的のhexファイルをドロップする。
うまく動作するとこんな感じになります。
Loading
"D:\xxxx\xxxx\lpcmci.hex"...Passed. Loaded address range is 00000h-163D7h. Entering ISP mode....Passed. Detected device is LPC2388. Erasing...Passed. Writing............Passed. |
A lpc21isp で ROM書込み
lpc21isp を 使用してみました。 結構速いです。 (でもpcspより約3倍かかります)
http://sourceforge.net/projects/lpc21isp/
makeする必要あります。
書き込み完了で。リセットがかかります。 lpcspでは、配線の関係でリセットがかけられないので、
リセットをかけたい場合は、こちらを使用しようかと思います。(書き込みサイズ小さい場合)
パラメータは、こんなかんじで試しました。
lpc21isp.exe xxx.hex com4 230400 14746
書き込み時は、こうなります。
lpc21isp fftest.hex com4 230400 14746 lpc21isp version 1.83 File fftest.hex: loaded... converted to binary format... image size : 3980 Image size : 3980 Synchronizing (ESC to abort). OK Read bootcode version: 3 3 Read part ID: LPC2388, 512 kiB ROM / 98 kiB SRAM (0x1800FF35) Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last. Erasing sector 0 first, to invalidate checksum. OK Sector 0: ........................................................................... ................... Download Finished... taking 1 seconds Now launching the brand new code |
2. 追加部品
USBのコネクタと、タクトSWを2個(ピンヘッダを立ててそこに半田付け)
安全のため2009.5月号 pxx のコンデンサと、放電用ショットキーダイオード
3. ベースとなるサンプルプログラム
chanさんのです
@ MP3プレーヤ
http://elm-chan.org/junk/cq_lpc/report.html
リアルタイムOSで動作してます。 リンクスクリプトなど使用できます。
A FATFs のサンプル
http://elm-chan.org/fsw/ff/00index_j.html
サンプルに lpc2k があります。LPC2368ですので、LPC2388に改造します。
リンクスクリプトとヘッダーファイルをLPC2388用に入れ替えたら、開始メッセージは出ました。
4. 成果
I2C,SPIは、ハードウエアで機能を出来そうですが、いつになるか分かりません。
そこで第一段階では、ここを無理やりソフトウエアで(今までの資産)実現します、
少なくともポートの操作方法は、身に付くハズです。
(0) 2009.5月号誤植発見 (すんさんの掲示板に投稿しました)
インターフェイス 2009月5月号の付録ARM基板の記事の誤りですが
ここで公開されています。
http://www.kumikomi.net/interface/contents/correction.php
最近使用したら誤りを発見したので、コネクタで接続している汎用I/Oポートをすべて、
LEDチカチカさせてみました。
P41(41ページ)で発見した別の誤り
@ CN1のピン番号17(P1_29)、ピン番号18(P1_28)の内容全てが逆。
A CN3のピン番号A20(P0_18)、ピン番号B20(PO_21)の内容全てが逆。
尚この部分のp42,p43の回路図は正しいようです。
また下記のポートは、抵抗+LEDをアース接続とテストしたところ
LEDが光りませんでした。調べたらオープンドレインということで、抵抗+LEDをアノード接続としたら
無事LED点滅しました。
CN2のピン番号12(PO_27) (I2C0で使用可能ポート)
CN3のピン番号B6(PO_28) (I2C0で使用可能ポート)
(1) ビットアクセス用ヘッダーファイル
ビットアクセスが容易なように作りました。
FIO0PIN_B_B21
= 1; // ポート0の21ビット目にをONに
FIO4PIN_B_B31
= 1; // ポート4の31ビット目にをONに
FIO2DIR_B_B4
= 1; // ポート4の4ビット目を出力に
この他 FIO0SET FIO4CLR も _Bを追加すれば 同じように使えます
PULL-UP PULL-DOWM 用も
PINMODE0A_A.B8 = 3: // PINMODE0での B8の指定を3(bitで11)
PINMODE0A_B.B13 = 2: // PINMODE0での B18の指定を2(bitで10)
16ビットずつになってるのでこのようになってます(AとBで識別)
0から15BITは、 PINMODExA_Bxx
16から31BITは、 PINMODExB_Bxx ヘッダソース LPC23xxu.lzh 2011.1 これは問題(誤り)がありました。
ヘッダソース LPC23xxu-2.lzh 2011.10 改定版
Chan さんのFatfsのLPC2388サンプルでは、 便利なマクロを使用しています。LPC2388.h 入っています。
(たぶん Sourcery
G++ Lite のものらしいのですが)
煩雑なものを一気に解決しています。 ここのマクロ部分だけでも、WINARMと共存できます。(あたりまえか)
電源制御は, こんなかんじ。
_set_PCONP(PCSDC, 1);
_set_PCONP(PCGPDMA, 1);
クロック指定は、シンボルで。
_set_PCLKSEL(PCLK_MCI,
PCLKDIV_1);
ピンの機能選択は、ポート番号で指定できます!。
_set_PINSEL(0, 2, 1); /* P0.2
-> TXD0 */
_set_PINSEL(0, 3, 1); /* P0.3
-> RXD0 */
プルアップ等の指定も
_set_PINMODE(0, 26,
PINMODE_HIZ); これは、ハイインピーダンス
LPC23xx-add.lzh 2011.10.24
オリジナル Lpc23xx.h
に _set_XXXX のマクロと
FIO4PIN_B_B31 = 1 等の ビットアクセスを可能にしたヘッダー。
(2) LEDチカチカ (ボード上のLED1)
・ タイマーで ソース等 led-blk-FGPIO.lzh
・ SWを使って ソース等
exint.lzh
(3) 浮動少数表示
chanさんの printf は、対応してなかったので、簡易版を追加。
ソース等 c-10-float-prt.lzh 2011.11.3 改 %Eでゼロを考慮した
%D を廃止 して %f %F にした。
%fで四捨五入を考慮
(4)soft-I2C
アクセス部分は、FATFSサンプルAVR用のrtc.c(I2Cを使用)を改造しました。
// CLK PIN.83 P0.20 CN3-B18
// DAT PIN.85 PO.19 CN3-A18
・リアルタイムクロック
秋月電子から購入したセイコーのリアルタイムクロックIC(RTC-8564NB)を
使ったクロックモジュールです。
モジュール内に、プルアップ用抵抗がありますがあえて使用せず、小さい基板上の
抵抗でプルアップしてます。
(理由は、他の基板とインターフェイスを合わせる為)
端子は、上から、VCC、GND、SCL、SDAです。
ソース i2c-rtc.lzh
chanさんのサンプルのリアルタイムクロックの読み書き関数を
RTC-8564NB用に改造してます。
ターミナルソフトで
S : 時間のセット(プログラム固定)
以降10毎秒青色LEDがフラッシュします
N : 現在時刻の読出し
となっています。
実行例)
S2010/3/25
10:30:10
***
rtc_settime st=1
***
rtc_settime st=1
2010/3/25
10:30:10
N2010/3/25
10:30:16
N2010/3/25
10:30:16
N2010/3/25
10:30:17
N2010/3/25
10:30:17s
・EEPROM
ソース i2c-eeprom.lzh
最低限の確認しかしていません。
端子は、上から、VCC、GND、SCL、SDAです。
アドレスの端子は、オープン(内部でプルダウン)です。
2本の抵抗(2.7KΩ)は、SCLとSDAのプルアップ抵抗です。
24C1024 および 24LCL64
(5) soft-spi
spiの部分は、FATFSのサンプル H8用をLPC2388用に改造しました。
・ADコンバータ
MCP3208 を接続しました。 相手がSPIでコマンドがシンプルなら何でも良かったんですが。
ソース等 spi-2-adc.lzh
0-21 CN3_A19 CS → ICの10ピン 0-19 CN3_A18 DI → ICの11ピン 0-20 CN3_B18 DO ← ICの12ピン 0-18 CN3_B19 CLK → ICの13ピン |
MCP3208 |
・SDカード Fatfs アクセスサンプル
元はSPIではありませんが、SDカードI/Fの部分は、使いまわし用があったので
SPI用に改造しました。
電源制御なし
SDカードの有無チェックなし
SDカードのWPチェックなし
で使用してます。
ソース等 lpc2k-2388-01.lzh
SPIアクセスの部分は、chanさんのFatfsサンプル(確かH8用)を
ベースにしました。
リアルタイムクロックの部分は改定していないので、機能しません。
最初
>di
でエラーになりましたが、SPI送受信で少しクロックを遅く(delayを入れた)したら
動作するようになりました。
>di
>fi
>fl
が動いたので、その他のコマンドを動かしてみましたが、今のところOKです。
「実行例」
FatFs module test monitor for
LPC2300/MCI
>di
rc=0
>fi
rc=0 FR_OK
>fl
----A 2007/05/01 00:00 4675
080531.log
----A 2007/05/01 00:00 22622
V1-080~1.LOG v1-080531.log
----A 2007/05/01 00:00 4675
V2-080~1.LOG v2-080531.log
----A 2007/05/01 00:00 4675
V3-080~1.LOG v3-080531.log
4 File(s), 36647 bytes total
0 Dir(s), 14729216 bytes free
>
(5) ハードでアクセス 2011.10
(4)では、ソフトで動かしましたが、ハードウエアで機能を使ってみます。
全てターミナルソフトから、コマンドで操作します。
後で分かったのですが、ポイントは chanさんが使用している(誰が作ったか知りません) _set_xxxx の
マクロを使用する事でしょう。 chanさんのFatfsのサンプルに入っている。
これでつまらないミスを激減出来ると思います。(私は、使用せず、つまらんミスを連発しました)
(1) SPI
マスターでは、SSEL(選択端子)は、使用できないようです。 必要なら自力で操作が必要。
スレーブでは、使用できます。
LPC2388-SPI-02 2011.10.8 ロジアナで送信信号のみ。(MISO信号の受信処理は、未完成)
コマンドFのみ送信処理確認(実際に、SPIデバイスとの接続は未。)
(ソースは、ゴミだらけです)
LPC2388-SPI-02-2 2011.10.24 AD変換IC()との送受信確認しました。
SSEL(セレクト)操作は、自力で。
コマンドは、EとDコマンドです。
_set_xxxx のマクロを使用しています。
信号名 | ポート | コネクタ | |
SSEL | P0.16 | CN2の11 | |
CLK | P0.15 | CN2の14 | |
MISO | P0.17 | CN2の35 | |
MOSI | P0.18 | CN3の19A |
コネクタがアッチコッチで使いにくい。
(2) SSPでSPI
複数機能のうち選択でSPIを選びます。
SSP0、SSP1 のSSP1を使用 (コネクタが集中していて使いやすい)
信号名 | ポート | コネクタ | |
SSEL1 | P0.6 | CN2の31 | |
CLK1 | P0.7 | CN2の32 | |
MOSI1 | P0.9 | CN2の33 | |
MISO1 | P0.8 | CN2の34 |
SPIクロックの指定 (コアは72Mhzです)は、3箇所でプリスケーラが働きます。
PCLKSEL0 のSSP1 L=1,2,4,8
(分の1)
SSP1DR
M= 4、6,8、・・・・254 (偶数に限る)
指定しないと256と同じになる。
但し、0,2を書き込むと、クロックが出ない!(ゼロは、書くなと書いてある)
0,2は、クロックが出ない。 (2は使えないと、マニュアルには無いのに!!)
SSP1CR0 の32から16ビット N=0,1,3、・・・・・255
トータルでは(72Mhzの場合)
72MHZ/(L*M*(N+1)) となる
SSP−SPI−01 2011.10.8 ロジアナで送信信号のみチェック。(MISO信号の受信処理は、未完成)
Fコマンドのみ確認。
実際に、SPIデバイスとの接続は未。(Dコマンド)
ロジアナで見ると、SSEL信号は、1バイトの送信毎に、on/offしています。
又送信バッファは、FIFOになっていてバッファが空でも送信は完了していません。
自力でSSEL信号を制御する場合は、 SSP1SR
の8ビット(Busy)がゼロになるまで
待つ必要があります。
SSP−SPI−06 2011.10.22
送信受信を確認。(AD変換がそれらしい)
SSELは、自力でやっています。 3回送受信毎に。(デバイスの都合)
SPIクロックは、1Mhz
SSP−SPI−07 2011.10.24
_set_xxxx マクロ使用。 内容は、SSP-SPI-06と同じ。
ヘッダーまとめました。
SDCARD-SPI-HARD 2011.10.22
SDカードアクセス FatFsは、 R0.07e と大分古いです。
上記ソフトSPIをハードSPIに置き換えました。
ファイルリスト(flコマンド)とファイルコピー(fxコマンド)を確認。
SPIクロックは、1Mhz。
電源制御なし、SDカードの有無チェックなし、SDカードのWPチェックなしは、
変更していません。
SDCARD-SPI-HARD-3 2011.10.24
_set_xxxx のマクロを使用しています。(内容は、同じ)
SPIクロックスピードを1.6Mhzに上げています。
(3) I2C
I2C0,I2C1,I2C2の内、I2C1を使用
信号名 | ポート | コネクタ | |
CLK1 | PO.19 | CN3の19A | |
SDA1 | P0.20 | CN3の19B |
@ 24LCL64 (eeprom) を接続 (始めの一歩)
I2Cサンプル1 2011.10.8 24LCL64 (eeprom)接続。 マスター送信、マスター受信
画像は、ロジアナの画像
割り込み処理内で、次の操作をするので、少し違和感があります。
使いやすいアクセス関数を工夫する必要があります。
ロジックとしては、未完成。 少し動いた程度。
Zコマンド : 3バイト書き込み
yコマンド : 4バイト読み出し
A 24LCL64 (eeprom) を接続(アクセス関数使用)
I2Cサンプル2 2011.10.14
24LCL64 (eeprom)接続。 アクセス関数作りました。
データアドレス1回(1バイト)送る関数も作りました。
読み書きは、安定しています。
エラーコード、エラー情報がいい加減です。(作業未完了)
Wコマンド i2c_write で書き込みテスト
Rコマンド i2c_read で読み込みテスト
wコマンド i2c_write1 で書き込みテスト (アドレス1バイト)
rコマンド i2c_read1 で読み込みテスト
(アドレス1バイト)
i2c.c の8行目
#define
XDEBUG を
#define
DEBUG に変更すると、内部データが、出力されます。
I2Cサンプル2-5 2011.10.24 _set_xxxx マクロを使用しました。内容は変更なし。
B リアルタイムクロック RTC-8564NB を接続
I2Cサンプル3 2011.10.14 上記リアルタイムクロックのサンプル(ソフトi2c)を、(ハード)I2Cに書き換えました。
Sコマンドで時刻設定(固定値)。 Nコマンドで、現在時刻を表示。
I2Cサンプル4 2011.10.24 _set_xxxx マクロを使用しました。内容は変更なし。
(5) コノパイラ Sourcery G++ Lite
を使用してみる
環境設定のガイドは、ここに書いてあります。 コマンドラインからのmakeだけなら、面倒ではありません。
http://homepage3.nifty.com/zus/ARM_LPC2388_Dev_Flame.html
コンパイラだけココ(一番上)からダウンローしてインストール
https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription?@template=lite
make.exe など別途用意する必要ありと書いてあったが、私の場合現在の環境があったためか
何もせず、 make や make clean が実行できました。
上記のサンプルを Sourcery G++ Lite でコンパイルしました。
ベースのプログラムは、chanさんの Fatfs のサンプル(LPC2388用)に変更しています。
割り込み処理や、スタートアップのモジュールが変わっています。
gl-i2c-3.lzh
2011.10.30 24LCL64 接続
( bool が使用出来ず面くらいました。)
gl-spi-2-ssp-01-8.lzh 2011.10.30 SSPで SPI (AD変換IC MCP3208)
gl-spi-2-adc-06.lzh
2011.11.11 SPI (AD変換IC MCP3208) 送信データのみロジアナで確認
gl-lpc2k-2388-01-hard-04.lzh 2011.10.30 SDカードアクセス (SSP で SPI 使用)
double-print-04.lzh
2011.11.3 簡易版の浮動少数表示 (chanさんの xprintf を改造)
ADコンバータ (SPI) |
eeprom I2C |
|||
SDカード接続基板 |
SDカード接続ユニット |
リアルタイムクロック(I2C) | ||