Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
fwatch
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
8
Issues
8
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
fwatch
Commits
ab4df796
Commit
ab4df796
authored
Aug 04, 2014
by
Grzegorz Daniluk
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
acc/mag driver: fixed and filled with read/write spi functions
parent
9e4bb444
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
203 additions
and
34 deletions
+203
-34
LSM303C_ACC_driver.c
sw/common/drivers/LSM303C/LSM303C_ACC_driver.c
+11
-18
LSM303C_MAG_driver.c
sw/common/drivers/LSM303C/LSM303C_MAG_driver.c
+9
-16
lsm303c.c
sw/common/drivers/LSM303C/lsm303c.c
+114
-0
lsm303c.h
sw/common/drivers/LSM303C/lsm303c.h
+66
-0
Makefile
sw/freewatch/Makefile
+3
-0
No files found.
sw/common/drivers/LSM303C/LSM303C_ACC_driver.c
View file @
ab4df796
...
...
@@ -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
;
...
...
sw/common/drivers/LSM303C/LSM303C_MAG_driver.c
View file @
ab4df796
...
...
@@ -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 ---------------------------------------------------------*/
...
...
sw/common/drivers/LSM303C/lsm303c.c
0 → 100644
View file @
ab4df796
#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
;
}
sw/common/drivers/LSM303C/lsm303c.h
0 → 100644
View file @
ab4df796
#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
sw/freewatch/Makefile
View file @
ab4df796
...
...
@@ -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
\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment