• 目次 -Page-
  • コンテンツ -Menu-
  • リンク -link-
  • PIC24FJ64GA002のピン設定 C30
  • PIC24FJ64GA002の入出力ピンにはCPUの機能を任意に設定できます。どういうことかと言うと、「このピンにこの機能を付ける」と自分で決めれるという事です。 これはとても便利な機能で、部品を配置する際にも強制的に割付られていない事から配置が楽になります。 しかし、これはPIC16FやPIC18Fに無かった機能なのでPIC24Fを使用する場合は新たに習得する必要があります。 覚えるのは難しいと思いますので表にして掲載しておく事にします。ほとんど自分用の覚書です。
     
    ピン入力割付の表は下記のようになります。
    モジュール名機能レジスタビット
    SPI1データ入力SDI1RPINR20SDI1R
    SPI1クロック入力SCK1INRPINR20SCK1R
    SPI1スレーブ選択入力SS1INRPINR21SS1R
    SPI2データ入力SDI2RPINR22SDI2R
    SPI2クロック入力SCK2INRPINR22SCK2R
    SPI2スレーブ選択入力SS2INRPINR23SS2R
    UART1入力U1RXRPINR18U1RXR
    UART1CTS入力U1CTSRPINR18U1CTSR
    UART2入力U2RXRPINR19U2RXR
    UART2CTS入力U2CTSRPINR19U2CTSR
    外部割込み1INT1RPINR0INTR1
    外部割込み2INT2RPINR1INT2R
    タイマ2外部clockT2CKRPINR3T2CKR
    タイマ3外部clockT3CKRPINR3T3CKR
    タイマ4外部clockT4CKRPINR4T4CKR
    タイマ5外部clockT5CKRPINR4T5CKR
    入力キャプチャ1IC1RPINR7IC1R
    入力キャプチャ2IC2RPINR7IC2R
    入力キャプチャ3IC3RPINR8IC3R
    入力キャプチャ4IC4RPINR8IC4R
    入力キャプチャ5IC5RPINR9IC5R
    出力コンペア入力AOCFARPINR11OCFAR
    出力コンペア入力BOCFBRPINR11OCFBR
    設定方法:レジスタ.ビット=RPxx
    設定例:RP9をSPI1データ入力に設定する場合
    RPINR20.SDI1R = 9; //RP9の9だけを記載する
     
    ピン出力割り当ては入力とは逆にピンに機能を割り当てます。
    ピンの指定
    レジスタ上位下位
    RPOR0RP1RP0
    RPOR1RP3RP2
    RPOR2RP5RP4
    RPOR3RP7RP6
    RPOR4RP9RP8
    RPOR5RP11RP10
    RPOR6RP13RP12
    RPOR7RP15RP14
    RPOR8RP17RP16
    RPOR9RP19RP18
    RPOR10RP21RP20
    RPOR11RP23RP22
    RPOR12RP25RP24
    機能番号
    機能名機能番号モジュール名
    NULL0NULL
    コンパレータ1出力1C1OUT
    コンパレータ2出力2C2OUT
    UART1送信3U1TX
    UART1 RTS4U1RTS
    UART2送信5U2TX
    UART2 RTS6U2RTS
    SPI1データ出力7SDO1
    SPI1clock出力8SCK1OUT
    SPI1スレーブ出力9SS1OUT
    SPI2データ出力10SDO2
    SPI2clock出力11SCK2OUT
    SPI2スレーブ出力12SS2OUT
    出力コンペア118OC1
    出力コンペア219OC2
    出力コンペア320OC3
    出力コンペア421OC4
    出力コンペア522OC5
    設定方法:ピンを指定し、そこに機能を割り当てます。 RPORx.RPx=0〜22
    設定例:RP8にSPI1データ出力を設定する場合
    RPOR4.RP8 = 7; //RP8はRPOR4でSPIデータ出力は「7」です。
     
    内部プルアップの設定はRPxピン1本毎に行えます。
    上位bit15141312111098
    CNPU1CN15CN14CN13CN12CN11CN10CN9CN8
    CNPU2nonCN30CN29CN28CN27CN26CN25CN24
    下位bit76543210
    CNPU1CN7CN6CN5CN4CN3CN2CN1CN0
    CNPU2CN23CN22CN21CN20CN19CN18CN17CN16
    PinDiagramsのピン配置にCNxxと記載されている所が上の表とマッチします。
    例えばPIC24FJ64GA002のRP14をプルアップしたい場合はCN12となっているので、CNPU1のCN12を「1」にすればRP14がプルアップされます。
     
    記載方法:CNPU1 = 0x1000;//0001000000000000
  • SPI通信のテスト  SDカードとこんにちは  プログラム編 C30
  • PIC24F64GA002のSPI通信をテストしようと思いましたが、相手がいないと通信できません。 目の前にはSDカードのソケットが付いたサンハヤトの基板があるので、これとSPIで通信して「こんにちは」を行う事にしました。 こんにちはとは初期化を行ってSDカードから初期化完了のレスポンスをもらう作業を僕はこう呼んでます。
     
    MMC(SD)カードのSPIモードへの初期化手順
    1.立ち上げ(立ち上げ時はSPIモードではない)
    2.チップセレクトを「H」にする
    3.80以上のクロックを与える(ダミークロック)
    4.チップセレクトを「L」にする
    5.コマンド0(CMD0)を送信 0x400000000095
    6.カードからレスポンス(0x01)が返ってくるまで待つ
    7.コマンド1(CMD1)を送信 0x410000000095
    8.カードからのレスポンスが「0x00」になるまで7番を繰り返す
    9.初期化完了
     
    CMD0を送ってレスポンス(0x01)が有ればLED1を点灯させ、CMD1を繰り返し送ってレスポンス(0x00)があればLED2を点灯させています。 こうする事によりどこまで進んでいるか把握できます。いわゆるデバッグ用です。
     
    プログラムはこんな感じ。mmc_spi(void)が初期化ルーチンです。スイッチを押すと初期化します。LED1とLED2が点灯すれば成功です。
    プログラムのテキストファイルはこちら
     
    アナログ機能のついたI/Oは初期状態でアナログ使用となっています。プログラムの初期でこれをデジタルに設定しないとデジタルに使えません。 これを忘れてて結構悩む事があります。コンパイルは通るのに入力が機能しない場合などはこれを疑って下さい。
     
    ついでにプロジェクトに追加しないといけないものはこちら。

     
    テスト風景
    SDカード基板はブレッドボードの背板の穴を利用して固定しました。基板にソケットを逆に取り付けてワイヤー線を挿入出切る様にしました。 これで気楽にSDカードとお友達になれます。
     
    回路図書くの忘れてた・・・(汗)。また後日にアップします。
  • SPI通信のテスト  SDカードとこんにちは  ハード編
  • 順序が異なりますが、今回は回路の方を載せます。サンハヤトの使用したSD変換基板はSDカードのピンと対応した端子が出ています。 端子には番号が打ってあるので迷うことはありません。SDソケットだけを使用してもブレッドボードでは使用できないのでこういうものがあれば便利です。
     
    RPINR20bits.SDI1R = 9;//SPI1入力をRP9に設定しているのでSDの出力と接続します。
    RPOR4bits.RP8R = 7;//RP8をSPI1の出力に設定しているのでSDの入力に接続します。
    RPOR3bits.RP7R = 8;//RP7をSPI1のクロックに設定しているのでSDのクロックに接続します。
    他にLED2つとスイッチ1つを接続しています。
     
    入出力の設定とプルアップ・アナログの設定はこうなります。
    入出力と信号線は全てプルアップを有効にしましょう。
    TRISA = 0x0000;//0x0000,0000,0000,0000
    TRISB = 0x0224;//0x0000,0010,0010,0100
    CNPU1 = 0x0040;//0x0000,0000,0100,0000
    CNPU2 = 0x09E0;//0x?000,1001,1110,0000
    AD1PCFG = 0xFFFF;//アナログ入力設定0でアナログ1でデジタル。初期はオール0。
     
    最後に回路図ですが下図のようになりました。
    プログラムと回路の説明を逆にしてしまったので読みにくいかも知れませんが感じはつかめると思います。 SDカードの10番は書き込み許可となりますので、読み込み専用の場合はLOWにしておくと間違って書き込まれる事はありません。 11番はカード挿入確認ようです。マイコン側では入力で受けます。カード挿入されていないのに初期化ルーチンまわすと無限ループに入ります。 今回は無視していますが、何か作る際にはこの入力もちゃんと判断してやる必要があります。
  • アドレス0の読み込み
  • 今回はSDカードのアドレスを指定して読み込むテストを行います。 初期設定でSPIモードに切り替えたカードへのアクセスとなりますので、上記の初期設定をクリアーしていないと出来ません。
     
    データの読み出しはアドレスを指定すると、設定したブロック分が順に送信されてきます。 コマンド16で設定するのですが、今回は初期設定のまま512で行います。つまり、一度アドレス指定して読み込むと512個のデータが続けて送信されてきます。 これを順にメモリに確保していく手順を示します。
     
    1)CSをLにする
    2)0x5100000001を送信する(コマンド17)
    3)受信用ダミークロック0XFFを送信し続け0x00のレスポンスを受け取る
    (レスポンスが0x04の場合エラーなので再度2のコマンドを送信する)
    4)受信用ダミークロック0xFFを送信し0xFE(送信開始の合図)を受信する
    5)0xFFを順に送信(ダミー)するとデータが順に送られてくるのでメモリに格納する
    6)CSをHに戻してダミークロック送信
     
    する事はたったこれだけです。
    同じ処理が繰り返されるのでまとめてみました。アドレスを指定してこの関数を呼び出すと必要なデータが得られます。 (メモリの割り当てなど適当にやってください)
     
    前回からの変更点
    1)SPICONValuelのSEC_PRESCAL_1_1をSEC_PRESCAL_2_1にしました。
    2)ReadSPI1()をgetcSPI1()に変更しました。(大文字が一個少なくなるので)
     
    読み込んだ結果です。
    ソフトを使ってカードのアドレス0を確認
    0x01C0が448なので合っている事がわかります。
     
    これでオフセット値を入手する事が出来ます。
  • セクタ0の読み込み
  • オフセットが入手できればセクタ0へアクセスが可能となります。
     
    アドレス0でオフセットを入手し、セクタ0の場所を知る。
    セクタ0から必要なデータを抽出する。
     
    static long offset;//オフセット
    static int sect;//セクタ
    -------------
    sect = 0;//セクタ0
    mmc_Read((sect * 512) + (offset * 512));
     
    以上でセクタ0にアクセスできるはずです。オフセットは4つのデータを1つにまとめる処理を先にして置いて下さい。
     
    読み込んだデータ
    ソフトを使ってカードのアドレス0を確認
    セクタ0からはディレクトリーのエントリー数や総セクタ数など色々知る事ができます。
     
    アドレス指定でデータが読めれば後はFATに従ってデータを読み込むだけなので、FATについて知るとデータの読み出しは簡単に行えるようになります。
  • MP3モジュール基板
  • せっかくなのでMP3を再生してみようと思います。それにはまず準備が必要です。 今回は以前に購入したMP3デコーダICの乗った基板を使用します。 ストロベリーリナックスで購入した「VS1011B」というICが乗った基板です。
     
    基板の接続端子
    1.Rout(右音声出力)
    2.AGND(アナロググランド)
    3.Lout(左音声出力)
    4.SO
    5.SI
    6.SCK
    7.CS
    8.RESET
    9.BSYNC
    10.DCLK
    11.DREQ
    12.POWER
    13.GND
     
    割と接続端子が多い事がわかります。28ピンのPICではピン配置が難しくなります。
    以前に28ピンの18Fで動かしているのでまぁ大丈夫だと思います。
     
    この基板にカードから読み込んだデータを順に送れば繋いだスピーカーから音がなります。
     
     
    モジュールの初期化手順
    1.ソフトウェアリセット(アドレス0x00に0x0004を書き込む)
    2.モード設定(アドレス0x00に0x0800を書き込む)
    3.クロックの設定(アドレス03)
    4.ボリュームの設定(アドレス0x0B 0x0000最大、0xFFFF最小)
     
    またプログラムを書く時に説明します。
    Design & Programming - 天姫 -
    Copyright (c) 2007-2022 amahime All Rights Reserved.