Sunday, 2 June 2013

AXDL345 Accelerometer on SPI Raspberry PI with bcm2835

AXDL345 Accelerometer on SPI Raspberry PI with bcm2835

I have this accelerometer ADXL345. I am trying to read data from it from SPI using the BCM2835 Library here.
When I run this, I SOMETIMES get a value back (other than zero), but it's never consistent.
Please advise!
SPI Class that wraps BCM2835 Library
public class SPI {
    private readonly GPIOPins cs;

    public SPI(GPIOPins cs) {
        this.cs = cs;
    }

    static SPI() {
        // initialize the mapped memory
        if (!bcm2835_init())
            throw new Exception("Unable to initialize bcm2835.so library");
    }

    public void Begin(){          
        bcm2835_spi_setClockDivider(42);
        bcm2835_spi_setDataMode(3);
        bcm2835_spi_chipSelect(cs);
        bcm2835_spi_setChipSelectPolarity(cs, false);
        bcm2835_spi_begin();           
    }

    public void End(){
        bcm2835_spi_end();
    }

    public byte Transfer(byte val){
        return bcm2835_spi_transfer(val);
    }

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_init")]
    static extern bool bcm2835_init();

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_begin")]
    static extern void bcm2835_spi_begin();

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_end")]
    static extern void bcm2835_spi_end();

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_transfer")]
    static extern byte bcm2835_spi_transfer(byte val);

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_chipSelect")]
    static extern byte bcm2835_spi_chipSelect(GPIOPins pin);

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_setClockDivider")]
    static extern byte bcm2835_spi_setClockDivider(int val);

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_setDataMode")]
    static extern byte bcm2835_spi_setDataMode(int val);

    [DllImport("libbcm2835.so", EntryPoint = "bcm2835_spi_setChipSelectPolarity")]
    static extern byte bcm2835_spi_setChipSelectPolarity(GPIOPins pin, bool activeHigh);
}
Main Program
   SPI accel = new SPI(GPIOPins.GPIO_17);

    Byte wBuff = new Byte();
    Byte rBuff = new Byte();

    while (true) {
        accel.Begin();
        wBuff = 0x00;           
        rBuff = accel.Transfer(wBuff);

        Console.WriteLine("Reading device id from register: " + wBuff);
        Console.WriteLine("Received device id: " + rBuff);
        accel.End();
        Thread.Sleep(500);
    }

No comments:

Post a Comment