インターフェース 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ビットずつになってるのでこのようになってます(
ABで識別)
              0から15BITは、 PINMODEx
A_Bxx
              16から31BITは、 PINMODEx
B_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)