このライブラリーはテストに作ったものです。近いうちに他の関数を加えた形でアップデートするつもりです。 read_8(int reg)、read_16(int reg) で レジスターregの値を8bit、16bitで読み込み、そのまま返します。受け取り側の変数をint8_t、int16_t で定義すれば正負に分かれた値を得られます。 write_8(int reg,int data)、write_16(int reg,int data)で レジスターregに8bit、16bit 書き込み、成功したら0、失敗したら1を返します。確認はread_8、read_16を用いています。 conect() でデバイスが使用可能かを調べ、見つかれば0、なければ1を返します。 reg_reset() で全てのレジスタの値を0にします。成功したら0、失敗したらその時点で処理を停止し、失敗したレジスタを返します。 レジスタは公式のデータシートに書いてあるものと文字は同じです。 もしかしたらうまく行かない関数があるかもしれません。次のアプデのときに修正予定です。

Dependents:   Nucleo_L3GD20_MMA7361_Kalman

l3gd20.cpp

Committer:
hirokimineshita
Date:
2015-01-28
Revision:
0:f2770227e24c
Child:
1:354deb9168c0

File content as of revision 0:f2770227e24c:

#include "mbed.h"
#include "l3gd20.h"

/*---------------------------------constracta------------------------------------------*/

l3gd20::l3gd20(): l3gdev(PB_15,PB_14,PB_13),l3gcs(PB_12)
{
    l3gdev.frequency(1000000);
    l3gdev.format(8,3);
}

l3gd20::l3gd20(int fhz): l3gdev(PB_15,PB_14,PB_13),l3gcs(PB_12)
{
    l3gdev.frequency(fhz);
    l3gdev.format(8,3);
}

l3gd20::l3gd20(PinName cs,int fhz): l3gdev(PB_15,PB_14,PB_13),l3gcs(cs)
{
    l3gdev.frequency(fhz);
    l3gdev.format(8,3);
}

l3gd20::l3gd20(PinName mosi,PinName miso,PinName sck,PinName cs,int fhz): l3gdev(mosi,miso,sck),l3gcs(cs)
{
    l3gdev.frequency(fhz);
    l3gdev.format(8,3);
}

l3gd20::l3gd20(PinName miso,PinName mosi,PinName sck,PinName cs,int fhz,int mode): l3gdev(mosi,miso,sck),l3gcs(cs)
{
    l3gdev.frequency(fhz);
    l3gdev.format(8,mode);
}

/*---------------------------------constracta------------------------------------------*/
/*-----------------------------------member--------------------------------------------*/

int l3gd20::reg_reset(){
    int err;
    for(int i=CTRL_REG1; i<=REFERENCE; i++){
        err=l3gd20::write_8(i,0x00);
        if(err){
            return i;
        }
    }
    err=l3gd20::write_8(FIFO_CTRL_REG,0x00);
    if(err){
        return FIFO_CTRL_REG;
    }
    err=l3gd20::write_8(INT1_CFG,0x00);
    if(err){
        return INT1_CFG;
    }
    for(int i=INT1_TSH_XH; i<=INT1_DURATION; i++){
        err=l3gd20::write_8(i,0x00);
        if(err){
            return i;
        }
    }
    return 0;
}

int l3gd20::conect(){
    int err;
    err=l3gd20::read_8(WHO_AM_I);
    if(err==0xD4){
        err=0;
    }else{
        err=1;
    }
    return err;
}

uint8_t l3gd20::read_8(uint8_t reg){
    uint8_t re;
    reg=reg|READ;
    l3gcs=0;
    l3gdev.write(reg);
    re=l3gdev.write(0x00);
    l3gcs=1;
    return re;
}

uint16_t l3gd20::read_16(uint8_t reg){
    uint8_t re1,re2;
    uint16_t re;
    reg=reg|READ;
    l3gcs=0;
    l3gdev.write(reg);
    re1=l3gdev.write(0x00);
    re2=l3gdev.write(0x00);
    re=(re1<<8)|re2;
    return re;
}

int l3gd20::write_8(uint8_t reg,uint8_t data){
    int err;
    reg=reg|WRITE;
    l3gcs=0;
    l3gdev.write(reg);
    l3gdev.write(data);
    l3gcs=1;
    err=l3gd20::read_8(reg);
    if(err==data){
        err=0;
    }else{
        err=1;
    }
    return err;
}

int l3gd20::write_16(uint8_t reg,uint16_t data){
    int err;
    uint8_t d1,d2;
    d2=data&0xFF;
    d1=data>>8;
    reg=reg|WRITE;
    l3gcs=0;
    l3gdev.write(reg);
    l3gdev.write(d1);
    l3gdev.write(d2);
    l3gcs=1;
    err=l3gd20::read_16(reg);
    if(err==data){
        err=0;
    }else{
        err=1;
    }
    return err;
}