286 lines
8.5 KiB
C
286 lines
8.5 KiB
C
//-------------------------------------------------------------------
|
||
// 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;
|
||
}
|
||
|