cc2530-projects/Zigbee无线通信/A板/Project/sensor_drv/BMA020.c
2021-10-04 22:26:10 +08:00

286 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//-------------------------------------------------------------------
// Filename: dma_bma.c
// Description: dma_bma module library (I2C)
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// INCLUDES
//-------------------------------------------------------------------
/******************************************************************************
* INCLUDES
*/
#include "ioCC2530.h"
//#include "hal_types.h"
#include "hal_defs.h"
#include "BMA020.h"
#define BM(n) (1 << (n))
#define MCU_IO_TRISTATE 1
#define MCU_IO_PULLUP 2
#define MCU_IO_PULLDOWN 3
#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val)
#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); P##port##_##pin## = val; P##port##DIR |= BM(pin); )
#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func)
#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); P##port##DIR &= ~BM(pin); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } )
#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin)
#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin))
#define HAL_BOARD_IO_SHT_SCK_PORT 1
#define HAL_BOARD_IO_SHT_SCK_PIN 6
#define HAL_BOARD_IO_SHT_SDA_PORT 1
#define HAL_BOARD_IO_SHT_SDA_PIN 5
#define HAL_BOARD_IO_E2PROM_SCL_PORT HAL_BOARD_IO_SHT_SCK_PORT
#define HAL_BOARD_IO_E2PROM_SCL_PIN HAL_BOARD_IO_SHT_SCK_PIN
#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0)
#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1)
#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0)
#define HAL_E2PROM_SCL_DIR_OUT HAL_E2PROM_SCK_DIR_OUT
#define HAL_E2PROM_SCL_SET HAL_E2PROM_SCK_SET
#define HAL_E2PROM_SCL_CLR HAL_E2PROM_SCK_CLR
#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1)
#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0)
#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1)
#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2)
#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN)
#define halMcuWaitUs McuWaitUs
#define NOP() asm("NOP")
//-------------------------------------------------------------------
// LOCAL FUNCTIONS
//-------------------------------------------------------------------
static void McuWaitUs2(uint16 usec);
void McuWaitUs2(uint16 usec)
{
usec >>= 1;
while (usec--)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
//NOP();
}
}
//-------------------------------------------------------------------
// LOCAL FUNCTIONS
//-------------------------------------------------------------------
static void M2_I2cStart(void);
void M2_I2cStart(void)//<2F><>SCL<43><4C><EFBFBD>ָߵ<D6B8>ƽ<EFBFBD>ڼ䣬SDA<44>ɸ߱<C9B8><DFB1>ͣ<EFBFBD>Ϊ<EFBFBD><CEAA>ʼ<EFBFBD>ź<EFBFBD>
{
HAL_E2PROM_SCL_SET(); //SCL=1
HAL_E2PROM_SDA_SET(); //SDA=1
McuWaitUs2(2);
HAL_E2PROM_SDA_CLR(); //SDA=0
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR(); //SCL=0
McuWaitUs2(2);
}
//-------------------------------------------------------------------
static void M2_I2cStop(void);
void M2_I2cStop(void)//<2F><>SCL<43><4C><EFBFBD>ָߵ<D6B8>ƽ<EFBFBD>ڼ䣬SDA<44>ɵͱ<C9B5><CDB1>ߣ<EFBFBD>Ϊֹͣ<CDA3>ź<EFBFBD>
{
HAL_E2PROM_SCL_SET(); //SCL=1
McuWaitUs2(2);
HAL_E2PROM_SDA_CLR(); //SDA=0
McuWaitUs2(2);
HAL_E2PROM_SDA_SET(); //SDA=1
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR(); //SCL=0
McuWaitUs2(2);
}
//-------------------------------------------------------------------
static void M2_I2cAck(void);
void M2_I2cAck(void)//<2F><>SDA=0ʱ<30><CAB1><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
{
HAL_E2PROM_SCL_SET();
McuWaitUs2(2);
HAL_E2PROM_SDA_CLR();
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR();
McuWaitUs2(2);
}
//-------------------------------------------------------------------
static void M2_I2cNack(void);
void M2_I2cNack(void)//<2F><>SDA=1ʱ<31><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
{
HAL_E2PROM_SCL_SET();
McuWaitUs2(2);
HAL_E2PROM_SDA_SET();
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR();
McuWaitUs2(2);
}
//-------------------------------------------------------------------
static void M2_I2cWrite(uint8 dat);
void M2_I2cWrite(uint8 dat)//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
uint8 i;
for (i = 0; i < 8; i++)
{
if (dat &0x80)
{
HAL_E2PROM_SDA_SET();
}
else
{
HAL_E2PROM_SDA_CLR();
}
HAL_E2PROM_SCL_SET();//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ(SCL=1)ʱ<><CAB1>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dat = dat << 1;
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ߣ<EFBFBD>SCL=0<><30>
McuWaitUs2(2);
}
}
//-------------------------------------------------------------------
static uint8 M2_I2cRead(void);
uint8 M2_I2cRead(void)
{
uint8 res = 0;
uint8 cnt;
HAL_E2PROM_SDA_SET();//<2F>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>datesheet<65><74><EFBFBD>н<EFBFBD><D0BD>ܣ<EFBFBD>,Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶˿ڶ<CBBF>CPU<50><55><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
HAL_E2PROM_SDA_DIR_IN();
McuWaitUs2(2);
for (cnt = 0; cnt < 8; cnt++)
{
HAL_E2PROM_SCL_SET();
res <<= 1;
if (HAL_E2PROM_SDA_VAL())//cpu<70><75>ȡSDA<44>˿<EFBFBD><CBBF>ϵ<EFBFBD>ֵ
{
res |= 0x01;
}
McuWaitUs2(2);
HAL_E2PROM_SCL_CLR();
McuWaitUs2(2);
}
HAL_E2PROM_SDA_DIR_OUT();//cpu<70><75>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD><EFBFBD>ٽ<EFBFBD>SDA<44>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>øߴ˶˿<CBB6>
return res;
}
//-------------------------------------------------------------------
// GLOBAL FUNCTIONS
//-------------------------------------------------------------------
static void M2_Init(void);
void M2_Init(void)//<2F><>ʼ<EFBFBD><CABC> SDA=1<><31>SCL=1
{
HAL_E2PROM_SDA_DIR_OUT();
MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1);
}
//-------------------------------------------------------------------
static void M2_WriteEEPROM(uint8 addr, uint8 ch);
void M2_WriteEEPROM(uint8 addr, uint8 ch)//<2F><>EEPROM<4F><4D>д<EFBFBD><D0B4><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>д<EFBFBD><D0B4>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ݣ<EFBFBD>
{
M2_I2cStart();
M2_I2cWrite(0x70);//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT24C02<30><32>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>̶<EFBFBD>Ϊ1010,<2C><><EFBFBD><EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD><EFBFBD>壬<EFBFBD><E5A3AC><EFBFBD><EFBFBD>һλΪ0ʱд<CAB1><D0B4>Ϊ1ʱ<31><CAB1>
M2_I2cAck();
M2_I2cWrite(addr);
M2_I2cAck();
M2_I2cWrite(ch); //data
M2_I2cAck();
M2_I2cStop();
// halMcuWaitMs(5);
}
//-------------------------------------------------------------------
static uint8 M3_ReadEEPROM(uint8 addr);
uint8 M3_ReadEEPROM(uint8 addr)
{
uint8 res;
M2_I2cStart();
M2_I2cWrite(0x70); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊд״̬
M2_I2cAck();
M2_I2cWrite(addr);
M2_I2cAck();
M2_I2cStart();
M2_I2cWrite(0x71); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊд״̬
M2_I2cAck();
res = M2_I2cRead();
M2_I2cNack();
M2_I2cStop();
return res;
}
/******************************************************************************
* <20><><EFBFBD><EFBFBD> BMA_Pooling
* <20><><EFBFBD><EFBFBD> <20><>ȡbma020<32><30>X,Y Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ
* <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD> (int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value)
*BMA_X_Value<75><65>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ŵ<EFBFBD>ַ
*BMA_Y_Value<75><65>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ŵ<EFBFBD>ַ
*BMA_Z_Value<75><65>Z<EFBFBD><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ŵ<EFBFBD>ַ
<20><><EFBFBD>ٶ<EFBFBD>ֵΪ16λ<36>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>Ϊ 2/512 (g), g=9.8m/s
* <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD> <20><>
*****************************************************************************/
void BMA_Pooling(int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value)
{
uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value;
uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value;
int16 value;
M2_Init();
BMA_XL_Value = M3_ReadEEPROM(0x02);
BMA_XM_Value = M3_ReadEEPROM(0x03);
BMA_YL_Value = M3_ReadEEPROM(0x04);
BMA_YM_Value = M3_ReadEEPROM(0x05);
BMA_ZL_Value = M3_ReadEEPROM(0x06);
BMA_ZM_Value = M3_ReadEEPROM(0x07);
value = (BMA_XM_Value << 8) | ((BMA_XL_Value&0xc0));
*BMA_X_Value= value/64;
value = (BMA_YM_Value << 8) | ((BMA_YL_Value&0xc0));
*BMA_Y_Value= value/64;
value = (BMA_ZM_Value << 8) | ((BMA_ZL_Value&0xc0));
*BMA_Z_Value= value/64;
}