// Esse programa ainda não foi testado. // É uma adaptação para utilizar vários acelerômetros utilizando a classe // BUSOUT ligado no CS dos acelerômetros; //Baseado na biblioteca de aaronn berek

Dependencies:   ADXL345 mbed

Fork of ADXLHELLOWORD by Thiago .

main.cpp

Committer:
Jamess
Date:
2015-05-04
Revision:
2:6f5f2342d0a5
Parent:
1:b54671e37e54
Child:
3:56c16ca210d1

File content as of revision 2:6f5f2342d0a5:

//Arquivo exemplo de se como utilizar a SPI em com a biblioteca do mbed feita por aaron.
//Programa temporario. logo será republicado

// TO do:
        //Ver o tempo em que leva para realizar cada função.
        //Trocar o printf pelo putc
                
//DONE:
        //Instalação do acc na protoboard.
        
#include "mbed.h"

/*-------ADXL345-------*/

// When SDO grounded
#define ADXL1_ADDR_WRITE 0xA6
#define ADXL1_ADDR_READ 0xA7
#define ADXL1_ADDR 0X53

//When SDO high
#define ADXL2_ADDR_WRITE 0x3A
#define ADXL2_ADDR_READ 0x3B
#define ADXL2_ADDR 0x53

//Registers

#define POWER_CTL 0x2D
#define DATA_FORMAT 0x31
#define DATAX0 0x32       //X
#define DATAX1 0x33
#define DATAY0 0x34       //Y
#define DATAY1 0x35
#define DATAZ0 0x36       //Z
#define DATAZ1 0x37
#define OFSX 0x1D         //accelerometer offset calibration
#define OFSY 0x1F         
#define OFSZ 0x20
#define BW_RATE 0x2C      //define Baudrate

//SPI Comunication
#define ADXL345_SPI_READ    0x80
#define ADXL345_SPI_WRITE   0x00
#define ADXL345_MULTI_BYTE  0x60

/*----Transmicao----*/

#define PORT_MASK_ACC0 002
#define PORT_MASK_ACC1 001
#define PORT_MASK_ACC2 003
#define PORT_MASK_ACC3 005
#define PORT_MASK_ACC4 004
#define PORT_MASK_ACC5 000
#define PORT_MASK_ACC6 000
#define PORT_MASK_ACC7 000
#define PORT_MASK_ACC8 000
#define PORT_MASK_ACC9 000
#define CS_ON 001

/*----Chip Select----*/
#define CS_ACC0 PTE31
#define CS_ACC1 PTE19
#define CS_ACC2 PTE18
#define CS_ACC3 PTE17
#define CS_ACC4 PTE16
#define CS_ACC5 PTE6
#define CS_ACC6 PTE3
#define CS_ACC7 PTE2
#define CS_ACC8 PTE20
#define CS_ACC9 PTE21

SPI spi(PTD2,PTD3,PTD1);                    //PTD0);//PinName mosi, PinName miso, PinName sck,     PinName cs)
BusOut CS_Accel(CS_ACC0,CS_ACC1,CS_ACC2,CS_ACC3,CS_ACC4,CS_ACC5,CS_ACC6,CS_ACC7,CS_ACC8,CS_ACC9);  //NA PLACA 46z
Serial pc(USBTX, USBRX);
DigitalOut PIN(PTD5);

/********************---------FUNÇÕES ACELERÔMETRO**********************************/

//Escrita:
void RegisterWrite(char,int,char);                                      //char acelerômetro, int endereço, char dado.
void MultRegisterWrite(char acc,char address,char data);               //Faz isso

//Leitura:
void GetOutputs(void);                                                  //Faz aquilo          
void MultRegisterRead(int,char*, int);                                            //
int RegisterRead(char);
/******************************Variáveis Acelerômetro********************************/




/************************************************************************************/

int main() {
 
    int readings[3] = {0, 0, 0};
     
    //Go into standby mode to configure the device.
  //  pc.printf("Starting setting the accelerômeters");
    //accelerometer.setPowerControl(0x00);
    RegisterWrite(PORT_MASK_ACC1,POWER_CTL,0x00);
    //Full resolution, +/-16g, 4mg/LSB.
    //accelerometer.setDataFormatControl(0x0B);
    RegisterWrite(PORT_MASK_ACC1,DATA_FORMAT,0x0B);
    
    //3.2kHz data rate.
    //accelerometer.setDataRate(ADXL345_3200HZ);
    RegisterWrite(PORT_MASK_ACC1,BW_RATE,0x0F);
    
    //Measurement mode.
    //accelerometer.setPowerControl(0x08);
    RegisterWrite(PORT_MASK_ACC1,POWER_CTL,0x08);
 
    while (1) {
        
        pc.printf("main");
        
        PIN = 1;
       
        PIN = 0;
    }
 
}
/*---------------------------FUNÇÕES-------------------------*/

int RegisterRead(char portMaskRead,char address){
    
    int tx = (ADXL345_SPI_READ | (address & 0x3F));
    int rx = 0;

    CS_Accel = portMaskRead;
    //Send address to read from.
    spi.write(tx);
    //Read back contents of address.
    rx = spi.write(0x00);
    CS_Accel = CS_ON;       //Finishes the comunication putting CS in HIGH

    return rx;
}

void RegisterWrite(char portMaskWrite,int address, char data) {
    
         //Char acc para definir qual CS será setado

    int tx = (ADXL345_SPI_WRITE | (address & 0x3F));

    CS_Accel = portMaskWrite; // Aqui na verdade vai ficar uma márcara para decidirvários pinos aomesmo tempo
    //Send address to write to.
    spi.write(tx);
    //Send data to be written.
    spi.write(data);
    CS_Accel = CS_ON;

}
void MultRegisterRead(char portMaskMRead,int startAddress, char* buffer, int size) {

    int tx = (ADXL345_SPI_READ | ADXL345_MULTI_BYTE | (startAddress & 0x3F));

    CS_Accel = portMaskMRead;
    //Send address to start reading from.
    spi.write(tx);

    for (int i = 0; i < size; i++) {
        buffer[i] = spi.write(0x00);
    }

    CS_Accel = CS_ON;

}

void MultRegisterWrite(char portMaskMWrite, int startAddress, char* buffer, int size) {

    int tx = (ADXL345_SPI_WRITE | ADXL345_MULTI_BYTE | (startAddress & 0x3F));

    CS_Accel = portMaskMWrite;
    //Send address to start reading from.
    spi.write(tx);

    for (int i = 0; i < size; i++) {
        buffer[i] = spi.write(0x00);
    }

    CS_Accel = portMaskMWrite;

}

void GetOutput(void){
    //Lê Acelerômetro 1
    //Lê Acelerômetro 2
    //Lê Acelerômetro 3
    //Lê Acelerômetro 4
    //Lê Acelerômetro 5
    //Lê Acelerômetro 6
    //Lê Acelerômetro 7
    //Lê Acelerômetro 8
    //Lê Acelerômetro 9
    //Lê Acelerômetro 10
}


/*===============================FUNCOES COPIADAS======================================*/
/*int ADXL345::oneByteRead(int address) {

    int tx = (ADXL345_SPI_READ | (address & 0x3F));
    int rx = 0;

    PIN = 0;
    //Send address to read from.
    spi_.write(tx);
    //Read back contents of address.
    rx = spi_.write(0x00);
    PIN = 1;

    return rx;

}

void ADXL345::oneByteWrite(int address, char data) {

    int tx = (ADXL345_SPI_WRITE | (address & 0x3F));

    PIN = 0;
    //Send address to write to.
    spi_.write(tx);
    //Send data to be written.
    spi_.write(data);
    PIN = 1;

}

void ADXL345::multiByteRead(int startAddress, char* buffer, int size) {

    int tx = (ADXL345_SPI_READ | ADXL345_MULTI_BYTE | (startAddress & 0x3F));

    PIN = 0;
    //Send address to start reading from.
    spi_.write(tx);

    for (int i = 0; i < size; i++) {
        buffer[i] = spi_.write(0x00);
    }

    PIN = 1;

}

void ADXL345::multiByteWrite(int startAddress, char* buffer, int size) {

    int tx = (ADXL345_SPI_WRITE | ADXL345_MULTI_BYTE | (startAddress & 0x3F));

    PIN = 0;
    //Send address to start reading from.
    spi_.write(tx);

    for (int i = 0; i < size; i++) {
        buffer[i] = spi_.write(0x00);
    }

    PIN = 1;

}*/