2013年10月24日木曜日

LPC1114FN28 で AD 12bit 2chモジュールを使う

AD 12bit 2ch モジュールの使い方について詳細な説明です。
サンプルプログラムでは以下のように設定し、シリアル通信で結果をPCに表示できます。

main.cの説明です。
1、実際に関数の使い方
2、マイコンのピン設定(入出力設定など)
3、マイコンからモジュールに接続する配線情報の関数
4、AD変換のためのデバイスを動かす関数


//define your module and function
//1=ON, 0=OFF
#define SimpleUART 1 //今回はシリアル通信を使うので1にしてON
#define AD12bit2 1 //今回はAD2chを使うので1にしてON
#define AD12bit8 0
#define DA12bit 0
#define LCDM 0
#define SigHold 0
#define Universal2 0

#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"

#if SimpleUART

#include "SimpleUart.h"
#endif

//save SPI data
uint32_t src_addr[SPI_BUFSIZE];
uint32_t dest_addr[SPI_BUFSIZE];

void ModuleIOConfig(void);
void IOSimpleSPI(MCUGear *mcugear, char address);

#if AD12bit2
int read12bitAD(MCUGear *mcugear, char ch);
#endif

//main関数 初期化してADデータをそのままシリアル通信を介してPCに送っています。
//シリアル通信のボーレートは115200としました。
int main(void) {

// TODO: insert code here

        //色々初期化します
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock/10000);//Timer (1/10000) Sec = 0.1 msec

//I2C setting

init_I2C();

//IO setting

ModuleIOConfig();

//SPI setting

SPI_IOConfig();//port 0 PIO0_8 _9 _6 _2
SPI_Init();

#if SimpleUART


double dData;

//UART setting
initUART(115200);
UART_Puts("TEST\r\n");

#endif


//Baseboard setting

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


#if AD12bit2
    uint32_t data[2];
//12bit 2ch AD module setting
MCUGear AD12bit2ch;
IOSimpleSPI(&AD12bit2ch, N_SCL_SCL_VSS);//モジュールの裏面に設定したアドレスを入れます。
#endif


while(1) {


#if AD12bit2

//12bit 2ch AD test ---------------------------------------------
connectModule(&AD12bit2ch);//モジュールとマイコン端子の配線を自動的に行います
                //上の一行で再構築が終わっているので、あとは普通のデジタル回路として扱えます
data[0] = read12bitAD(&AD12bit2ch, 0);//0chの電圧を12bitのデータとして取得します
data[1] = read12bitAD(&AD12bit2ch, 1);//1chの電圧を12bitのデータとして取得します
disconnectModule(&AD12bit2ch);//モジュールとマイコン端子の配線を切断します
#endif

#if SimpleUART

//UART test -----------------------------------------------------
#if AD12bit2
                //シリアル通信でPCにデータを送ります
UART_Puts("Ch0: ");
UART_PutData(data[0],0);

UART_Puts(" Ch1: ");

UART_PutData(data[1],0);

#endif


}


return 0 ;


}




マイコンのピン設定

I2C、SPI、UART、IN、OUTの設定です。これは普通にマイコン使うときには必要な処理です。

//----------------------------------------------------------------------------------

//IO config for module
//This function is IO setting for MCUgear sample code.
//Modify this function to fit your program
//----------------------------------------------------------------------------------
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
}



マイコンからモジュールに接続する配線情報の関数

どのマイコンの端子をモジュールの何番ピンに当てはめるかという情報を保存します

//----------------------------------------------------------------------------------

//Simple SPI
//----------------------------------------------------------------------------------
void IOSimpleSPI(MCUGear *mcugear, char address){

mcugear->address = address;

mcugear->PinNum = 4;//使用する端子の数がSPIの4ピン
//Pin1 PIO0_8 MISO
//Pin2 PIO0_9 MOSI
//Pin6 PIO0_6 SCK0
//Pin25 PIO0_2 SSL0
detectModule(mcugear);
    savePinSetting(mcugear, 0, IO_LPC1114FN_1, IO_REG_IN_DIR);//モジュールの0番端子にMISOIN
    savePinSetting(mcugear, 1, IO_LPC1114FN_2, IO_REG_OUT_DIR);//モジュールの1番端子にMOSIOUT
    savePinSetting(mcugear, 2, IO_LPC1114FN_6, IO_REG_OUT_DIR);//モジュールの2番端子にSCK:OUT
    savePinSetting(mcugear, 3, IO_LPC1114FN_25, IO_REG_OUT_DIR);//モジュールの3番端子にCS:OUT
    mcugear->Bank = 0;//ここは追々説明します。今回はこのまま

}




AD変換のためのデバイスMCP3202を動かす関数


#if AD12bit2

//----------------------------------------------------------------------------------
//Simple read 12bit 2ch AD module
//----------------------------------------------------------------------------------
int read12bitAD(MCUGear *mcugear, char ch){

SPI_changeFrequency(0x0A07);//SPIバスの周波数を変更しています


    char sendData;

    int whoami[3];

LPC_GPIO0->DATA &= ~(1<<2); //CS pin Low


    if(ch == 0){

        //sendData = 0x80;
        sendData = 0x08;
    }else if(ch == 1){
        //sendData = 0xC0;
        sendData = 0x0C;
    }else{
        return -1;
    }

// Master transmit

// src_addr[0]=0x01;
    src_addr[0]=0x10 + sendData;
SPI_Send( (uint32_t *)src_addr, SPI_BUFSIZE); //port0

SPI_Receive( (uint32_t *)dest_addr, 1 );

whoami[0] = dest_addr[0]<<8;

SPI_Receive( (uint32_t *)dest_addr, 1 );

whoami[1] = whoami[0] + dest_addr[0];
whoami[1] = whoami[1] >> 4;

LPC_GPIO0->DATA |= (1<<2); //CS pin High


    return whoami[1];

}
#endif

0 件のコメント:

コメントを投稿