Commit ab4df796 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

acc/mag driver: fixed and filled with read/write spi functions

parent 9e4bb444
......@@ -24,6 +24,7 @@
/* Includes ------------------------------------------------------------------*/
#include "LSM303C_ACC_driver.h"
#include "lsm303c.h"
//EXAMPLE to fill LSM303C_ACC_ReadReg and LSM303C_ACC_WriteReg
//#include "i2C_mems.h"
......@@ -42,14 +43,10 @@
* Output : Data REad
* Return : None
*******************************************************************************/
u8_t LSM303C_ACC_ReadReg(u8_t Reg, u8_t* Data) {
//To be completed with either I2c or SPI reading function
//i.e.: *Data = SPI_Mems_Read_Reg( Reg );
//EXAMPLE
//if(!I2C_BufferRead(Data, LSM303C_ACC_MEMS_I2C_ADDRESS, Reg, 1)) return MEMS_ERROR;
//else return MEMS_SUCCESS;
u8_t LSM303C_ACC_ReadReg(u8_t Reg, u8_t* Data)
{
*Data = spi_read(DEV_ACC, Reg);
return MEMS_SUCCESS;
}
/*******************************************************************************
......@@ -60,14 +57,10 @@ u8_t LSM303C_ACC_ReadReg(u8_t Reg, u8_t* Data) {
* Output : None
* Return : None
*******************************************************************************/
u8_t LSM303C_ACC_WriteReg(u8_t Reg, u8_t Data) {
//To be completed with either I2c or SPI writing function
//i.e.: SPI_Mems_Write_Reg(Reg, Data);
//EXAMPLE
//I2C_ByteWrite(&Data, LSM303C_ACC_MEMS_I2C_ADDRESS, Reg);
//return 1;
u8_t LSM303C_ACC_WriteReg(u8_t Reg, u8_t Data)
{
spi_send(DEV_ACC, Reg, Data);
return 1;
}
/* Private functions ---------------------------------------------------------*/
......@@ -1120,13 +1113,13 @@ status_t LSM303C_ACC_SetFIFO_threshold(u8_t buff) {
buff &= 0x1F; //coerce
if (!LSM303C_ACC_ReadReg(LSM303C_ACC_ACT_DUR, &value) )
if (!LSM303C_ACC_ReadReg(LSM303C_ACC_FIFO_CTRL, &value) )
return MEMS_ERROR;
value &= ~0x1F; //mask
value |= buff;
if( !LSM303C_ACC_WriteReg(LSM303C_ACC_ACT_DUR, value) )
if( !LSM303C_ACC_WriteReg(LSM303C_ACC_FIFO_CTRL, value) )
return MEMS_ERROR;
return MEMS_SUCCESS;
......
......@@ -24,6 +24,7 @@
/* Includes ------------------------------------------------------------------*/
#include "LSM303C_MAG_driver.h"
#include "lsm303c.h"
//EXAMPLE used to fill LSM303C_MAG_ReadReg and LSM303C_MAG_WriteReg
//#include "i2C_mems.h"
/* Private typedef -----------------------------------------------------------*/
......@@ -42,14 +43,10 @@ u8_t LSM303C_MAG_flags=0;
* Output : Data REad
* Return : None
*******************************************************************************/
u8_t LSM303C_MAG_ReadReg(u8_t Reg, u8_t* Data) {
//To be completed with either I2c or SPI reading function
//i.e.: *Data = SPI_Mems_Read_Reg( Reg );
//EXAMPLE
//if(!I2C_BufferRead(Data, LSM303C_MAG_MEMS_I2C_ADDRESS, Reg, 1)) return MEMS_ERROR;
//else return MEMS_SUCCESS;
u8_t LSM303C_MAG_ReadReg(u8_t Reg, u8_t* Data)
{
*Data = spi_read(DEV_MAG, Reg);
return MEMS_SUCCESS;
}
/*******************************************************************************
......@@ -60,14 +57,10 @@ u8_t LSM303C_MAG_ReadReg(u8_t Reg, u8_t* Data) {
* Output : None
* Return : None
*******************************************************************************/
u8_t LSM303C_MAG_WriteReg(u8_t Reg, u8_t Data) {
//To be completed with either I2c or SPI writing function
//i.e.: SPI_Mems_Write_Reg(Reg, Data);
//EXAMPLE
//I2C_ByteWrite(&Data, LSM303C_MAG_MEMS_I2C_ADDRESS, Reg);
//return 1;
u8_t LSM303C_MAG_WriteReg(u8_t Reg, u8_t Data)
{
spi_send(DEV_MAG, Reg, Data);
return 1;
}
/* Private functions ---------------------------------------------------------*/
......
#include <em_cmu.h>
#include <em_gpio.h>
#include <em_usart.h>
#include <efm32gg330f1024.h>
#include "lsm303c.h"
/************************************************/
/* First functions to initialize and access SPI */
/************************************************/
static void spi_init()
{
USART_InitSync_TypeDef cfg = USART_INITSYNC_DEFAULT;
USART_TypeDef *spi = SPI_USART;
CMU_ClockEnable(cmuClock_USART0, true);
/* basic configuration */
cfg.baudrate = SPI_BAUDRATE;
cfg.clockMode = usartClockMode3; //Clock idle high, sample on rising edge
cfg.msbf = true; //MSB first
USART_InitSync(SPI_USART, &cfg);
/* signals routing to location 2 and loopback for half-duplex */
spi->CTRL |= USART_CTRL_LOOPBK; /* use half-duplex */
spi->ROUTE = USART_ROUTE_CLKPEN |
USART_ROUTE_TXPEN |
SPI_LOC;
CMU_ClockEnable(cmuClock_GPIO, true);
/* GPIO configuration */
GPIO_PinModeSet(gpioPortC, 11, gpioModePushPull, 0); /* MOSI/MISO */
GPIO_PinModeSet(gpioPortC, MAG_CS_PIN, gpioModePushPull, 1); /* CS Mag*/
GPIO_PinModeSet(gpioPortC, ACC_CS_PIN, gpioModePushPull, 1); /* CS Acc*/
GPIO_PinModeSet(gpioPortC, 9, gpioModePushPull, 1); /* Clock */
GPIO_PinModeSet(gpioPortD, 4, gpioModeInput, 0); /* Mag drdy */
}
void spi_send(uint8_t dev, uint8_t adr, uint8_t dat)
{
USART_TypeDef *spi = SPI_USART;
if (dev == DEV_ACC) {
/* drive ACC CS down */
GPIO_PinOutClear(gpioPortC, ACC_CS_PIN);
GPIO_PinOutSet(gpioPortC, MAG_CS_PIN);
}
else if (dev == DEV_MAG) {
/* drive MAG CS down */
GPIO_PinOutSet(gpioPortC, ACC_CS_PIN);
GPIO_PinOutClear(gpioPortC, MAG_CS_PIN);
}
USART_TxDouble(spi, adr << _USART_TXDOUBLE_TXDATA0_SHIFT |
dat << _USART_TXDOUBLE_TXDATA1_SHIFT);
/* wait until it's done */
while (!(USART_StatusGet(spi) & USART_STATUS_TXC)) ;
/* both CS up */
GPIO_PinOutSet(gpioPortC, ACC_CS_PIN);
GPIO_PinOutSet(gpioPortC, MAG_CS_PIN);
}
/* read byte from given a address */
uint8_t spi_read(uint8_t dev, uint8_t adr)
{
USART_TypeDef *spi = SPI_USART;
if (dev == DEV_ACC) {
/* drive ACC CS down */
GPIO_PinOutClear(gpioPortC, ACC_CS_PIN);
GPIO_PinOutSet(gpioPortC, MAG_CS_PIN);
}
else if (dev == DEV_MAG) {
/* drive MAG CS down */
GPIO_PinOutSet(gpioPortC, ACC_CS_PIN);
GPIO_PinOutClear(gpioPortC, MAG_CS_PIN);
}
spi->CMD = USART_CMD_RXBLOCKEN; /* Block loopbacked RX while we send adr to Slave */
spi->CMD = USART_CMD_CLEARRX; /* Clear old data, if any */
spi->TXDOUBLEX = (adr | 1<< 7) << _USART_TXDOUBLEX_TXDATA0_SHIFT |
USART_TXDOUBLEX_TXTRIAT0 | /* tristate Tx */
USART_TXDOUBLEX_UBRXAT0 | /* unblock Rx */
0x00 << _USART_TXDOUBLEX_TXDATA1_SHIFT | /* dummy Tx data for reading Slave */
USART_TXDOUBLEX_TXTRIAT1 | /* once again, errata USART_E101 */
USART_TXDOUBLEX_UBRXAT1;
/* wait for valid rx data */
while( !(USART_StatusGet(spi) & USART_STATUS_RXDATAV) );
/* we have new data, turn off tristate Tx */
spi->CMD = USART_CMD_TXTRIDIS;
/* both CS up */
GPIO_PinOutSet(gpioPortC, ACC_CS_PIN);
GPIO_PinOutSet(gpioPortC, MAG_CS_PIN);
return spi->RXDATA & 0xff;
}
/************************************************/
/* LSM303C stuff */
/************************************************/
int lsm303_init()
{
spi_init();
/*setup 3-wire SPI for Accelerometer & Magnetometer*/
LSM303C_ACC_SerialInterfaceMode(LSM303C_ACC_SIM_3WIRE_INTERFACE);
return LSM303_SUCCESS;
}
#ifndef __LSM303C_H__
#define __LSM303C_H__
#include <em_device.h>
#include "LSM303C_ACC_driver.h"
#include "LSM303C_MAG_driver.h"
#define HFRCO_FREQUENCY 14000000
#define SPI_PERCLK_FREQUENCY HFRCO_FREQUENCY
#define SPI_BAUDRATE 1000000
#define SPI_LOC USART_ROUTE_LOCATION_LOC2 //2
#define BUFSIZE 80
#define SPI_USART USART0
#define ACC_CS_PIN 8
#define MAG_CS_PIN 10
#define LSM303_SUCCESS 0
#define LSM303_ERROR -1
#define DEV_ACC 0
#define DEV_MAG 1
int lsm303_init();
uint8_t spi_read(uint8_t dev, uint8_t adr);
void spi_send(uint8_t dev, uint8_t adr, uint8_t dat);
/* Accelerometer & Magnetometer registers */
//#define LSM303C_ACC_TEMP_L 0x0B
//#define LSM303C_ACC_TEMP_H 0x0C
//#define LSM303C_ACC_ACT_TSH 0x1E
//#define LSM303C_ACC_ACT_DUR 0x1F
//#define LSM303C_WHO_AM_I_REG 0x0F
//#define LSM303C_CTRL1 0x20
//#define LSM303C_CTRL2 0x21
//#define LSM303C_CTRL3 0x22
//#define LSM303C_CTRL4 0x23
//#define LSM303C_CTRL5 0x24
//#define LSM303C_CTRL6 0x25 /* ACC only */
//#define LSM303C_CTRL7 0x26 /* ACC only */
//#define LSM303C_STATUS 0x27
//#define LSM303C_OUT_X_L 0x28
//#define LSM303C_OUT_X_H 0x29
//#define LSM303C_OUT_Y_L 0x2A
//#define LSM303C_OUT_Y_H 0x2B
//#define LSM303C_OUT_Z_L 0x2C
//#define LSM303C_OUT_Z_H 0x2D
//#define LSM303C_ACC_FIFO_CTRL 0x2E
//#define LSM303C_ACC_FIFO_SRC 0x2F
//#define LSM303C_ACC_IG_CFG1 0x30
//#define LSM303C_ACC_IG_SRC1 0x31
//#define LSM303C_ACC_IG_THS_X1 0x32
//#define LSM303C_ACC_IG_THS_Y1 0x33
//#define LSM303C_ACC_IG_THS_Z1 0x34
//#define LSM303C_ACC_IG_DUR1 0x35
//#define LSM303C_ACC_IG_CFG2 0x36
//#define LSM303C_ACC_IG_SRC2 0x37
//#define LSM303C_ACC_IG_THS2 0x38
//#define LSM303C_ACC_IG_DUR2 0x39
//#define LSM303C_ACC_XL_REFERENCE 0x3A
//#define LSM303C_ACC_XH_REFERENCE 0x3B
//#define LSM303C_ACC_YL_REFERENCE 0x3C
//#define LSM303C_ACC_YH_REFERENCE 0x3D
//#define LSM303C_ACC_ZL_REFERENCE 0x3E
//#define LSM303C_ACC_ZH_REFERENCE 0x3F
#endif
......@@ -147,6 +147,9 @@ C_SRC += \
../common/drivers/lcd_dma.c \
../common/drivers/i2cdrv.c \
../common/drivers/max17047.c \
../common/drivers/LSM303C/LSM303C_ACC_driver.c \
../common/drivers/LSM303C/LSM303C_MAG_driver.c \
../common/drivers/LSM303C/lsm303c.c \
../common/emlib/src/em_assert.c \
../common/emlib/src/em_cmu.c \
../common/emlib/src/em_dma.c \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment