2013年10月30日水曜日

LPC1114FN28 で ユニバーサルモジュールを使う

ユニバーサル モジュールの使い方について詳細な説明です。
サンプルプログラムでは以下のように設定し動作確認できます。

サンプルプログラムの回路は以下のような物を想定しています。
LEDの回路などを接続し、スイッチに連動して任意のLEDを光らせます。

main.cは以下のように構成されています。
1、実際に関数の使い方
2、マイコンのピン設定(入出力設定など)
3、マイコンからモジュールに接続する配線情報の関数

#define SimpleUART 0
#define AD12bit2 0
#define AD12bit8 0
#define DA12bit 0
#define LCDM 0
#define SigHold 0
#define Universal2 1//今回はユニバーサルモジュールだけ使うので、ここを1にするだけで動きます。

#define MultiFunctionModule 0
#define PWM_MODE 0
#define AD_MODE 0
#define I2C_MODE 0



#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

// TODO: insert other include files here//必要なファイルをインクルードします
#include "MCUGear.h"
#include "type.h"
#include "i2c.h"
#include "spi.h"
#include "common.h"

//使う関数の宣言
void ModuleIOConfig(void);
void IOUni2M(MCUGear *mcugear, char address);


int main(void) {

// TODO: insert code here
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock/10000);//Timer (1/10000) Sec = 0.1 msec//delay用にタイマーを使うための関数

//I2C setting
init_I2C();//I2Cの初期化

//IO setting
ModuleIOConfig();//マイコンのIO設定が書いてあります。

//Baseboard setting
init_BASEboard();//ベースボードの初期化

//2 connector Universal module setting
MCUGear Uni2M;//モジュールの名前を定義します。
IOUni2M(&Uni2M, N_VDD_VDD_VDD);//定義したモジュールのアドレスを設定します。

uint8_t switch0, switch1;//スイッチ入力の状態を一旦保存する変数

while(1) {//以下、ループさせます

  //Universal module )------------------------------
//INPUT : PIO1_8, PIO1_9
//OUTPUT : PIO0_11, PIO1_0, PIO1_1, PIO1_2, PIO1_3, PIO1_4
LPC_GPIO0->DATA |= (1<<11);//あらかじめ全ての出力をHigh(LEDがOFFになる)にしておきます
LPC_GPIO1->DATA |= (1<<0);
LPC_GPIO1->DATA |= (1<<1);
LPC_GPIO1->DATA |= (1<<2);
LPC_GPIO1->DATA |= (1<<4);
LPC_GPIO1->DATA |= (1<<5);

connectModule(&Uni2M);//モジュールにマイコンの端子を動的に配線します。
               //配線が完了すれば、あとは普通のデジタル回路として使えます。

//check switch0 PIO1_8
switch0 = LPC_GPIO1->MASKED_ACCESS [1<<8]>>8;//スイッチの状態を読み込みます。
//check switch0 PIO1_9
switch1 = LPC_GPIO1->MASKED_ACCESS [1<<9]>>9;

if(switch0){//スイッチの状態に合わせて各出力端子でLEDをONOFFさせます。
LPC_GPIO0->DATA |= (1<<11); //High
}else{
LPC_GPIO0->DATA &= ~(1<<11); //Low
}

if(switch1){
LPC_GPIO1->DATA |= (1<<0); //High
}else{
LPC_GPIO1->DATA &= ~(1<<0); //Low
}

//上記のif else文を短く書いたもので、同じものです。
// (switch0 == 1)? (LPC_GPIO0->DATA |= (1<<11)) : (LPC_GPIO0->DATA &= ~(1<<11));
// (switch1 == 1)? (LPC_GPIO1->DATA |= (1<<0)) : (LPC_GPIO1->DATA &= ~(1<<0));
(switch0 == 1)? (LPC_GPIO1->DATA |= (1<<1)) : (LPC_GPIO1->DATA &= ~(1<<1));
(switch0 == 1)? (LPC_GPIO1->DATA |= (1<<2)) : (LPC_GPIO1->DATA &= ~(1<<2));
(switch1 == 1)? (LPC_GPIO1->DATA |= (1<<4)) : (LPC_GPIO1->DATA &= ~(1<<4));
(switch1 == 1)? (LPC_GPIO1->DATA |= (1<<5)) : (LPC_GPIO1->DATA &= ~(1<<5));

//mwait01(1000); //100msec//必要であれば数msec遅れを入れてください。

disconnectModule(&Uni2M);//モジュールの配線を切断します。

}

return 0 ;
}

//マイコンの入出力やバスの機能など設定しています。今回使用するのは青い所だけです。
void ModuleIOConfig(void){
//Reserved IOs for SPI, UART, I2C and Debugger.
//Pin1 PIO0_8 MISO
//Pin2 PIO0_9 MOSI
//Pin6 PIO0_6 SCK0
//Pin25 PIO0_2 SSL0
//Pin15 PIO1_6 RXD
//Pin16 PIO1_7 TXD
//Pin5 PIO0_5 SDA
//Pin27 PIO0_4 SCL

//This is for LCD and simple digital out.
//Pin4 R_PIO0_11
//Pin9 R_PIO1_0
//Pin10 R_PIO1_1
//Pin11 R_PIO1_2
//Pin26 PIO0_3
//Pin28 PIO0_7

LPC_IOCON->PIO0_3 = 0xd0;
LPC_IOCON->PIO0_7 = 0xd0;
LPC_IOCON->R_PIO0_11 = 0xd1;
LPC_IOCON->R_PIO1_0 = 0xd1;
LPC_IOCON->R_PIO1_1 = 0xd1;
LPC_IOCON->R_PIO1_2 = 0xd1;

LPC_GPIO0->DIR  |= (1<<3);
LPC_GPIO0->DIR  |= (1<<7);
LPC_GPIO0->DIR  |= (1<<11);
LPC_GPIO1->DIR  |= (1<<0);
LPC_GPIO1->DIR  |= (1<<1);
LPC_GPIO1->DIR  |= (1<<2);


//You can change setting of IOs. Input or output
//Pin13 PIO1_4 output
//Pin14 PIO1_5 output
//Pin17 PIO1_8 input
//Pin18 PIO1_9 input

//sample code : set out put for signal hold and universal module
LPC_IOCON->PIO1_4 = 0xd0;
LPC_IOCON->PIO1_5 = 0xd0;
LPC_IOCON->PIO1_8 = 0xd0;
LPC_IOCON->PIO1_9 = 0xd0;

LPC_GPIO1->DIR  |= (1<<4);
LPC_GPIO1->DIR  |= (1<<5);
LPC_GPIO1->DIR  &= ~(1<<8); //input
LPC_GPIO1->DIR  &= ~(1<<9); //input
}



//ユニバーサルモジュールの配線情報を保存します。
void IOUni2M(MCUGear *mcugear, char address){
mcugear->address = address;//基板裏面に設定したアドレスが入ります。
mcugear->PinNum = 8;//モジュールに配線するIOの数ここでは8つ
//detect module
detectModule(mcugear);//モジュールの取り付け位置を把握します。

//LPC1114FN28の「17番ピンをモジュールの0番端子に割り当て、マイコンから見て入力側です」と指定しています。
    savePinSetting(mcugear, 0, IO_LPC1114FN_17, IO_REG_IN_DIR); //PIO1_8 input

//同様に以下のように設定します。
    savePinSetting(mcugear, 1, IO_LPC1114FN_18, IO_REG_IN_DIR); //PIO1_9 input
    savePinSetting(mcugear, 2, IO_LPC1114FN_4, IO_REG_OUT_DIR); //R_PIO0_11 output
    savePinSetting(mcugear, 3, IO_LPC1114FN_9, IO_REG_OUT_DIR); //R_PIO1_0 output
    savePinSetting(mcugear, 4, IO_LPC1114FN_10, IO_REG_OUT_DIR); //R_PIO1_1 output
    savePinSetting(mcugear, 5, IO_LPC1114FN_11, IO_REG_OUT_DIR); //R_PIO1_2 output
    savePinSetting(mcugear, 6, IO_LPC1114FN_13, IO_REG_OUT_DIR); //R_PIO1_4 output
    savePinSetting(mcugear, 7, IO_LPC1114FN_14, IO_REG_OUT_DIR); //R_PIO1_5 output

    mcugear->Bank = 0;//これは高速化のためのものです。追々説明しますがBankは0~7まであり、デジタル回路を7レイヤー作れるようなイメージです

}











0 件のコメント:

コメントを投稿