L3GD20 動作テスト①

急に作りたくなったものがあるので、L3GD20をmbedから使ってみる。

I2Cはちょっと面倒なのでSPIで通信する。

f:id:katakanan:20170714232309p:plain

図にするほどのものでもない図。
akizukidenshi.com
ライブラリがあるいが面白くないので自分で

のチップデータシートによるとSPIの波形は

f:id:katakanan:20170714232625p:plain
のようなタイミングで
SPI - SPIマスター | Mbed

によるとMode3
bitは8で
最初はWho am Iアドレスを読む。

#include "mbed.h"
#include "L3GD20.h"

DigitalOut myled(LED1);

Serial pc(USBTX, USBRX);
//SPI spi(p5, p6, p7); // mosi, miso, sclk
L3GD20 gyro(p5, p6, p7, p8/*, PinName interrupt1=NC, PinName interrupt2=NC*/);

int main() {
    
    pc.baud(115200);

    pc.printf("0x%02X\r\n", gyro.read_byte(0x0F));
    gyro.write_byte(0x20, 0x0F);

    while(1) {
        myled = 1;
        wait(0.5);
        myled = 0;
        wait(0.5);
        pc.printf("0x%02X\r\n", gyro.read_byte(0x0F));
    }
}
#pragma once
#include "mbed.h"

class L3GD20
{
    SPI _spi; // mosi, miso, sclk
    DigitalOut _cs;
    
    public:
    L3GD20(PinName mosi, PinName miso, PinName sclk, PinName cs):_spi(mosi, miso, sclk),_cs(cs)
    {
        _spi.format(8,3);
        _spi.frequency(10000000);
    }
    
    uint8_t write_byte(uint8_t reg, uint8_t val)
    {
        _cs = 0;
        _spi.write(reg);
        _spi.write(val);
        _cs = 1;
        return 0;
    }

    uint8_t read_byte(uint8_t reg)
    {
        _cs = 0;
        _spi.write(reg|0x80);
        uint8_t ret = _spi.write(0x00);
        _cs = 1;
        return ret;
    }
};

これで0xD4が送られてくればOK