mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-11-09 20:45:41 +08:00
*** EFM32 branch ***
1. Change the usage of the second parameter of Read and Write functions in IIC driver - to "Slave address" from (seldom used) "Offset" 2. Add a timer for IIC driver to prevent from forever waiting 3. Add digital (IIC) interface support for accelerometer driver (Freescale MMA7455L) git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1678 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
1 parent
da55b1857f
commit
11488d143a
5 files changed
+931
-190
No files matched your search
+721
-92
File diff suppressed because it is too large.
Load diff
+90
-8
@@ -13,28 +13,110 @@
|
||||
* Date Author Notes
|
||||
* 2011-07-13 onelife Initial creation for using EFM32 ADC module to
|
||||
* interface the Freescale MMA7361L
|
||||
* 2011-08-02 onelife Add digital interface support of using EFM32 IIC
|
||||
* module for the Freescale MMA7455L
|
||||
******************************************************************************/
|
||||
#ifndef __DEV_ACCEL_H__
|
||||
#define __DEV_ACCEL_H__
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#if (EFM32_USING_ACCEL == EFM32_INTERFACE_IIC)
|
||||
#include "mma7455l.h"
|
||||
#endif
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
struct efm32_accel_result_t
|
||||
{
|
||||
rt_uint32_t x;
|
||||
rt_uint32_t y;
|
||||
rt_uint32_t z;
|
||||
rt_int32_t x;
|
||||
rt_int32_t y;
|
||||
rt_int32_t z;
|
||||
};
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
#define ACCEL_X_ADC_CH ADC_SCANCTRL_INPUTMASK_CH2
|
||||
#define ACCEL_Y_ADC_CH ADC_SCANCTRL_INPUTMASK_CH3
|
||||
#define ACCEL_Z_ADC_CH ADC_SCANCTRL_INPUTMASK_CH4
|
||||
/* MMA7361LC
|
||||
g-Select g-Range Sensitivity
|
||||
0 1.5 g 800 mV/g
|
||||
1 6 g 206 mV/g
|
||||
|
||||
MMA7455L
|
||||
g-Select g-Range Sensitivity
|
||||
0 2 g 64 LSB/g
|
||||
1 4 g 32 LSB/g
|
||||
2 8 g 16 LSB/g
|
||||
*/
|
||||
#define ACCEL_G_SELECT (0)
|
||||
|
||||
#define ACCEL_CAL_SAMPLES (4) /* Must be multiple of 2 */
|
||||
#define ACCEL_CAL_ROUND (50)
|
||||
#define ACCEL_CAL_SIMPLE (0)
|
||||
#define ACCEL_CAL_INTERACT (1)
|
||||
|
||||
#if (EFM32_USING_ACCEL == EFM32_INTERFACE_ADC)
|
||||
/* Reading_at_1g = Sensitivity * Max_reading / Refference_voltage */
|
||||
#define ACCEL_CAL_1G_VALUE {993, 256}
|
||||
|
||||
#define ACCEL_X_ADC_CH ADC_SCANCTRL_INPUTMASK_CH2
|
||||
#define ACCEL_Y_ADC_CH ADC_SCANCTRL_INPUTMASK_CH3
|
||||
#define ACCEL_Z_ADC_CH ADC_SCANCTRL_INPUTMASK_CH4
|
||||
#elif (EFM32_USING_ACCEL == EFM32_INTERFACE_IIC)
|
||||
#define ACCEL_CAL_1G_VALUE {0x3f, 0x1f, 0x0f}
|
||||
#define ACCEL_IIC_SLAVE_ADDRESS (0x1d)
|
||||
|
||||
#define ACCEL_INT1_PORT (gpioPortD)
|
||||
#define ACCEL_INT1_PIN (13)
|
||||
#define ACCEL_INT2_PORT (gpioPortD)
|
||||
#define ACCEL_INT2_PIN (12)
|
||||
|
||||
#define ACCEL_MODE_STANDBY (1 << 0)
|
||||
#define ACCEL_MODE_MEASUREMENT (1 << 1)
|
||||
#define ACCEL_MODE_LEVEL (1 << 2)
|
||||
#define ACCEL_MODE_PULSE (1 << 3)
|
||||
#define ACCEL_RANGE_8G (1 << 4)
|
||||
#define ACCEL_RANGE_4G (1 << 5)
|
||||
#define ACCEL_RANGE_2G (1 << 6)
|
||||
#define ACCEL_INTPIN_INVERSE (1 << 7)
|
||||
#define ACCEL_INT_LEVEL_PULSE (1 << 8)
|
||||
#define ACCEL_INT_PULSE_LEVEL (1 << 9)
|
||||
#define ACCEL_INT_SINGLE_DOUBLE (1 << 10)
|
||||
#define ACCEL_DISABLE_X (1 << 11)
|
||||
#define ACCEL_DISABLE_Y (1 << 12)
|
||||
#define ACCEL_DISABLE_Z (1 << 13)
|
||||
#define ACCEL_THRESHOLD_INTEGER (1 << 14) /* For level detection only */
|
||||
#define ACCEL_BANDWIDTH_125HZ (1 << 15)
|
||||
#define ACCEL_LEVEL_AND (1 << 16)
|
||||
#define ACCEL_PULSE_AND (1 << 17)
|
||||
#define ACCEL_DRIVE_STRONG (1 << 18)
|
||||
#define ACCEL_SOURCE_LEVEL_X (1 << 19)
|
||||
#define ACCEL_SOURCE_LEVEL_Y (1 << 20)
|
||||
#define ACCEL_SOURCE_LEVEL_Z (1 << 21)
|
||||
#define ACCEL_SOURCE_PULSE_X (1 << 22)
|
||||
#define ACCEL_SOURCE_PULSE_Y (1 << 23)
|
||||
#define ACCEL_SOURCE_PULSE_Z (1 << 24)
|
||||
|
||||
#define ACCEL_SHIFT_MODE (0)
|
||||
#define ACCEL_SHIFT_RANGE (4)
|
||||
#define ACCEL_SHIFT_INT (8)
|
||||
#define ACCEL_SHIFT_DISABLE (11)
|
||||
#define ACCEL_SHIFT_SOURCE (19)
|
||||
|
||||
#define ACCEL_MASK_MODE (0X0000000f << ACCEL_SHIFT_MODE)
|
||||
#define ACCEL_MASK_RANGE (0X00000007 << ACCEL_SHIFT_RANGE)
|
||||
#define ACCEL_MASK_INT (0X00000007 << ACCEL_SHIFT_INT)
|
||||
#define ACCEL_MASK_DISABLE (0X00000007 << ACCEL_SHIFT_DISABLE)
|
||||
#define ACCEL_MASK_SOURCE (0X0000003f << ACCEL_SHIFT_SOURCE)
|
||||
#endif
|
||||
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
rt_err_t efm_accel_get_data(struct efm32_accel_result_t *data);
|
||||
rt_err_t efm_accel_auto_zero(rt_tick_t period);
|
||||
rt_err_t efm_accel_get_data(struct efm32_accel_result_t *data,
|
||||
rt_bool_t lowResolution);
|
||||
rt_err_t efm_accel_config(rt_uint32_t config,
|
||||
rt_uint8_t level_threshold,
|
||||
rt_uint8_t pulse_threshold,
|
||||
rt_uint8_t pulse_duration,
|
||||
rt_uint8_t pulse_latency,
|
||||
rt_uint8_t pulse_duration2);
|
||||
rt_err_t efm_accel_auto_zero(rt_uint8_t mode, rt_tick_t period);
|
||||
rt_err_t efm_accel_init(void);
|
||||
|
||||
#endif /*__DEV_ACCEL_H__ */
|
||||
+90
-76
File diff suppressed because it is too large.
Load diff
+11
-6
@@ -14,6 +14,9 @@
|
||||
* 2011-01-07 onelife Initial creation for EFM32
|
||||
* 2011-07-11 onelife Add lock (semaphore) to prevent simultaneously
|
||||
* access
|
||||
* 2011-08-04 onelife Change the usage of the second parameter of Read
|
||||
* and Write functions from (seldom used) "Offset" to "Slave address"
|
||||
* 2011-08-04 onelife Add a timer to prevent from forever waiting
|
||||
******************************************************************************/
|
||||
#ifndef __DRV_IIC_H__
|
||||
#define __DRV_IIC_H__
|
||||
@@ -33,14 +36,16 @@ struct efm32_iic_device_t
|
||||
rt_uint32_t counter;
|
||||
/* Lock */
|
||||
struct rt_semaphore *lock;
|
||||
/* Pointer to timer */
|
||||
rt_timer_t timer;
|
||||
/* Timeout flag */
|
||||
volatile rt_bool_t timeout;
|
||||
/* State */
|
||||
rt_uint8_t state;
|
||||
/* Pointer to IIC device structure */
|
||||
I2C_TypeDef *iic_device;
|
||||
/* Master address */
|
||||
rt_uint16_t master_address;
|
||||
/* Slave address */
|
||||
rt_uint16_t slave_address;
|
||||
/* Self address */
|
||||
rt_uint16_t address;
|
||||
/* RX structure */
|
||||
struct efm32_iic_int_mode_t *rx_buffer;
|
||||
};
|
||||
@@ -48,8 +53,7 @@ struct efm32_iic_device_t
|
||||
struct efm32_iic_control_t
|
||||
{
|
||||
rt_uint8_t config;
|
||||
rt_uint16_t master_address;
|
||||
rt_uint16_t slave_address;
|
||||
rt_uint16_t address;
|
||||
};
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
@@ -58,6 +62,7 @@ struct efm32_iic_control_t
|
||||
#define IIC_STATE_BROADCAST (1 << 1)
|
||||
//#define IIC_STATE_TX_BUSY (1 << 2)
|
||||
#define IIC_STATE_RX_BUSY (1 << 3)
|
||||
#define IIC_TIMEOUT_PERIOD (RT_TICK_PER_SECOND)
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
void rt_hw_iic_init(void);
|
||||
|
||||
+19
-8
@@ -49,7 +49,7 @@
|
||||
//#define RT_RTC_DEBUG
|
||||
|
||||
#define EFM32_DEBUG
|
||||
#define RT_ACCEL_DEBUG
|
||||
#define EFM32_ACCEL_DEBUG
|
||||
#define EFM32_SFLASH_DEBUG
|
||||
//#define EFM32_SDCARD_DEBUG
|
||||
//#define EFM32_ETHERNET_DEBUG
|
||||
@@ -119,7 +119,7 @@
|
||||
#endif
|
||||
|
||||
/* SECTION: IIC options */
|
||||
//#define RT_USING_IIC0 0x1UL
|
||||
#define RT_USING_IIC0 0x3UL
|
||||
#define RT_IIC0_NAME "iic0"
|
||||
|
||||
/* SECTION: ACMP options */
|
||||
@@ -162,23 +162,34 @@
|
||||
#define FINSH_USING_DESCRIPTION
|
||||
|
||||
/* SECTION: Peripheral devices */
|
||||
#define EFM32_INTERFACE_ADC (0)
|
||||
#define EFM32_INTERFACE_IIC (1)
|
||||
#define EFM32_INTERFACE_SPI (2)
|
||||
#if defined(EFM32_G290_DK)
|
||||
//#define EFM32_USING_ACCEL /* Three axis accelerometer */
|
||||
//#define EFM32_USING_SFLASH /* SPI Flash */
|
||||
//#define EFM32_USING_SPISD /* MicroSD card */
|
||||
#define EFM32_USING_ETHERNET /* Ethernet controller */
|
||||
#define EFM32_USING_ACCEL EFM32_INTERFACE_IIC /* Three axis accelerometer */
|
||||
//#define EFM32_USING_SFLASH /* SPI Flash */
|
||||
//#define EFM32_USING_SPISD /* MicroSD card */
|
||||
//#define EFM32_USING_ETHERNET /* Ethernet controller */
|
||||
#endif
|
||||
|
||||
#if defined(EFM32_USING_ACCEL)
|
||||
#if (EFM32_USING_ACCEL == EFM32_INTERFACE_ADC)
|
||||
#define ACCEL_USING_DEVICE_NAME RT_ADC0_NAME
|
||||
#define ACCEL_USING_DMA (0x3UL)
|
||||
#define ACCEL_USING_DMA (0x3UL) /* For multiple channels scan mode */
|
||||
#elif (EFM32_USING_ACCEL == EFM32_INTERFACE_IIC)
|
||||
#define ACCEL_USING_DEVICE_NAME RT_IIC0_NAME
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(EFM32_USING_SFLASH)
|
||||
#define SFLASH_USING_DEVICE_NAME RT_USART0_NAME
|
||||
#endif
|
||||
|
||||
#if defined(EFM32_USING_SPISD)
|
||||
#define SPISD_USING_DEVICE_NAME RT_USART0_NAME
|
||||
#define SPISD_DEVICE_NAME "spiSd"
|
||||
#endif
|
||||
|
||||
#if defined(EFM32_USING_ETHERNET)
|
||||
#define ETH_USING_DEVICE_NAME RT_USART2_NAME
|
||||
#define ETH_DEVICE_NAME "spiEth"
|
||||
@@ -205,7 +216,7 @@
|
||||
//#define hostName "onelife.dyndns.org"
|
||||
//#define userPwdB64 "dXNlcjpwYXNzd2Q="
|
||||
|
||||
#define RT_USING_LWIP
|
||||
///#define RT_USING_LWIP
|
||||
//#define RT_USING_NETUTILS
|
||||
/* LwIP uses RT-Thread Memory Management */
|
||||
#define RT_LWIP_USING_RT_MEM
|
||||
|
||||
Reference in new issue
Block a user