当前位置:文档之家› 倾斜角传感器MMA8451

倾斜角传感器MMA8451


/*******************************************************************************
// 陀螺仪 MPU6050 IIC测试程序
*******************************************************************************/

#include "stm32f10x_lib.h"
#include //Keil library

GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;

#define uchar unsigned char
#define uint unsigned int

/*--------定义MMA845x内部地址----------*/

//内部数据定义
unsigned char IIC_ad_main; //器件从地址
unsigned char IIC_ad_sub; //器件子地址
unsigned char *IIC_buf; //发送|接收数据缓冲区
unsigned char IIC_num; //发送|接收数据个数

#define ack 1 //主应答
#define no_ack 0 //从应答

#define MMA845x_IIC_ADDRESS 0x38

/***********************************************************************************************
**
** MMA845xQ Sensor Internal Registers
*/
enum
{
MMA845x_STATUS_00 = 0, // 0x00
MMA845x_OUT_X_MSB, // 0x01
MMA845x_OUT_X_LSB, // 0x02
MMA845x_OUT_Y_MSB, // 0x03
MMA845x_OUT_Y_LSB, // 0x04
MMA845x_OUT_Z_MSB, // 0x05
MMA845x_OUT_Z_LSB, // 0x06
MMA845x_F_STATUS, // 0x08
MMA845x_F_SETUP, // 0x09
MMA845x_TRIG_CFG, // 0x0A
MMA845x_SYSMOD, // 0x0B
MMA845x_INT_SOURCE, // 0x0C
MMA845x_WHO_AM_I, // 0x0D
MMA845x_XYZ_DATA_CFG, // 0x0E
MMA845x_HP_FILTER_CUTOFF, // 0x0F
MMA845x_PL_STATUS, // 0x10
MMA845x_PL_CFG, // 0x11
MMA845x_PL_COUNT, // 0x12
MMA845x_PL_BF_ZCOMP, // 0x13
MMA845x_PL_P_L_THS_REG, // 0x14
MMA845x_FF_MT_CFG, // 0x15
MMA845x_FF_MT_SRC, // 0x16
MMA845x_FF_MT_THS, // 0x17
MMA845x_FF_MT_COUNT, // 0x18
MMA845x_TRANSIENT_CFG, // 0x1D
MMA845x_TRANSIENT_SRC, // 0x1E
MMA845x_TRANSIENT_THS, // 0x1F
MMA845x_TRANSIENT_COUNT, // 0x20
MMA845x_PULSE_CFG, // 0x21
MMA845x_PULSE_SRC, // 0x22
MMA845x_PULSE_THSX, // 0x23
MMA845x_PULSE_THSY, // 0x24
MMA845x_PULSE_THSZ, // 0x25
MMA845x_PULSE_TMLT, // 0x26
MMA845x_PULSE_LTCY, // 0x27
MMA845x_PULSE_WIND, // 0x28
MMA845x_ASLP_COUNT, // 0x29
MMA845x_CTRL_REG1, // 0x2A
MMA845x_CTRL_REG2, // 0x2B
MMA845x_CTRL_REG3, // 0x2C
MMA845x_CTRL_REG4, // 0x2D
MMA845x_CTRL_REG5, // 0x2E
MMA845x_OFF_X, // 0x2F
MMA845x_OFF_Y, // 0x30
MMA845x_OFF_Z // 0x31

};

/*
** STATUS Registers
*/
#define STATUS_00_REG 0x00



/*
**

XYZ Data Registers
*/
#define OUT_X_MSB_REG 0x01
#define OUT_X_LSB_REG 0x02
#define OUT_Y_MSB_REG 0x03
#define OUT_Y_LSB_REG 0x04
#define OUT_Z_MSB_REG 0x05
#define OUT_Z_LSB_REG 0x06


/*
** WHO_AM_I Device ID Register
*/
#define WHO_AM_I_REG 0x0D
#define MMA8451Q_ID 0x1A
#define MMA8452Q_ID 0x2A
#define MMA8453Q_ID 0x3A

/*
** F_STATUS FIFO Status Register
*/
#define F_STATUS_REG 0x00



/*
** F_SETUP FIFO Setup Register
*/
#define F_SETUP_REG 0x09



/*
** TRIG CFG Register
*/

#define TRIG_CFG_REG 0x0A
//



/*
** SYSMOD System Mode Register
*/
#define SYSMOD_REG 0x0B

//
#define FGERR_MASK 0x80
#define FGT_4MASK 0x40
#define FGT_3MASK 0x20
#define FGT_2MASK 0x10
#define FGT_1MASK 0x08
#define FGT_0MASK 0x04
#define FGT_MASK 0x7C
#define SYSMOD1_MASK 0x02
#define SYSMOD0_MASK 0x01
#define SYSMOD_MASK 0x03

/*
** INT_SOURCE System Interrupt Status Register
*/
#define INT_SOURCE_REG 0x0C

//
#define SRC_ASLP_MASK 0x80
#define SRC_FIFO_MASK 0x40
#define SRC_TRANS_MASK 0x20
#define SRC_LNDPRT_MASK 0x10
#define SRC_PULSE_MASK 0x08
#define SRC_FF_MT_1_MASK 0x04
#define SRC_FF_MT_2_MASK 0x02
#define SRC_DRDY_MASK 0x01

/*
** XYZ_DATA_CFG Sensor Data Configuration Register
*/
#define XYZ_DATA_CFG_REG 0x0E
//
#define HPF_OUT_BIT Bit._4
#define FS1_BIT Bit._1
#define FS0_BIT Bit._0
//
#define HPF_OUT_MASK 0x10
#define FS1_MASK 0x02
#define FS0_MASK 0x01
#define FS_MASK 0x03

#define FULL_SCALE_8G FS1_MASK
#define FULL_SCALE_4G FS0_MASK
#define FULL_SCALE_2G 0x00

/*
** HP_FILTER_CUTOFF High Pass Filter Register
*/
#define HP_FILTER_CUTOFF_REG 0x0F

//
#define PULSE_HPF_BYP Bit._5
#define PULSE_LPF_EN Bit._4
#define SEL1_BIT Bit._1
#define SEL0_BIT Bit._0
//
#define PULSE_HPF_BYP_MASK 0x20
#define PULSE_LPF_EN_MASK 0x10
#define SEL1_MASK 0x02
#define SEL0_MASK 0x01
#define SEL_MASK 0x03

/*
** PL_STATUS Portrait/Landscape Status Register
** PL_PRE_STATUS Portrait/Landscape Previous Data Status Register
*/
#define PL_STATUS_REG 0x10


//
#define NEWLP_MASK 0x80
#define LO_MASK 0x40
#define LAPO1_MASK 0x04
#define LAPO0_MASK 0x02
#define LAPO_MASK 0x06
#define BAFRO_MASK 0x01


/*
** PL_CFG Portrait/Landscape Configuration Register
*/
#define PL_CFG_REG 0x11
//
#define DBCNTM_BIT Bit._7
#define PL_EN_BIT Bit._6
//

#define DBCNTM_MASK 0x80
#define PL_EN_MASK 0x40

/*
** PL_COUNT Portrait/Landscape Debounce Register
*/
#define PL_COUNT_REG 0x12

/*
** PL_BF_ZCOMP Back/Front and Z Compensation Register
*/
#define PL_BF_ZCOMP_REG 0x13

//
#define BKFR1_MASK 0x80
#define BKFR0_MASK 0x40
#define ZLOCK2_MASK 0x04
#define ZLOCK1_MASK 0x02
#define ZLOCK0_MASK 0x01
#define BKFR_MASK 0xC0
#define ZLOCK_MASK 0x07

/*
** PL_P_L_THS Portrait to Landscape Threshold Registers
*/
#define PL_P_L_THS_REG 0x14
/*
** FF_MT_CFG Freefall and Motion Configuration Registers
*/
#define FF_MT_CFG_1_REG 0x15
#define FF_MT_CFG_2_REG 0x19

#define ELE_MASK 0x80
#define OAE_MASK 0x40
#define ZEFE_MASK 0x20
#define YEFE_MASK 0x10
#define XEFE_MASK 0x08

/*
** FF_MT_SRC Freefall and Motion Source Registers
*/
#define FF_MT_SRC_1_REG 0x16
#define FF_MT_SRC_2_REG 0x1A
//
#define EA_MASK 0x80
#define ZHE_MASK 0x20
#define ZHP_MASK 0x10
#define YHE_MASK 0x08
#define YHP_MASK 0x04
#define XHE_MASK 0x02
#define XHP_MASK 0x01

/*
** FF_MT_THS Freefall and Motion Threshold Registers
** TRANSIENT_THS Transient Threshold Register
*/
#define FT_MT_THS_1_REG 0x17
#define FT_MT_THS_2_REG 0x1B
#define TRANSIENT_THS_REG 0x1F

//
#define DBCNTM_MASK 0x80
#define THS6_MASK 0x40
#define THS5_MASK 0x20
#define THS4_MASK 0x10
#define THS3_MASK 0x08
#define THS2_MASK 0x04
#define TXS1_MASK 0x02
#define THS0_MASK 0x01
#define THS_MASK 0x7F

/*
** FF_MT_COUNT Freefall Motion Count Registers
*/
#define FF_MT_COUNT_1_REG 0x18
#define FF_MT_COUNT_2_REG 0x1C

/*
** TRANSIENT_CFG Transient Configuration Register
*/
#define TRANSIENT_CFG_REG 0x1D
//
#define TELE_MASK 0x10
#define ZTEFE_MASK 0x08
#define YTEFE_MASK 0x04
#define XTEFE_MASK 0x02
#define HPF_BYP_MASK 0x01

/*
** TRANSIENT_SRC Transient Source Register
*/
#define TRANSIENT_SRC_REG 0x1E

//
#define TEA_MASK 0x40
#define ZTRANSE_MASK 0x20
#define ZTRANSEPOL_MASK 0x10
#define YTRANSE_MASK 0x08
#define YTRANSEPOL_MASK 0x04
#define XTRANSE_MASK 0x02
#define XTRANSEPOL_MASK 0x01

/*
** TRANSIENT_COUNT Transient Debounce Register
*/
#define TRANSIENT_COUNT_REG 0x20

/*
** PULSE_CFG Pulse Configuration Register
*/
#define PULSE_CFG_REG 0x21

//
#define DPA_MASK 0x80
#define PELE_MASK 0x40
#define ZDPEFE_MASK 0x20
#define ZSPEFE_MASK 0x10
#d

efine YDPEFE_MASK 0x08
#define YSPEFE_MASK 0x04
#define XDPEFE_MASK 0x02
#define XSPEFE_MASK 0x01

/*
** PULSE_SRC Pulse Source Register
*/
#define PULSE_SRC_REG 0x22

//
#define PEA_MASK 0x80
#define PAXZ_MASK 0x40
#define PAXY_MASK 0x20
#define PAXX_MASK 0x10
#define PDPE_MASK 0x08
#define POLZ_MASK 0x04
#define POLY_MASK 0x02
#define POLX_MASK 0x01

/*
** PULSE_THS XYZ Pulse Threshold Registers
*/
#define PULSE_THSX_REG 0x23
#define PULSE_THSY_REG 0x24
#define PULSE_THSZ_REG 0x25
//
#define PTHS_MASK 0x7F

/*
** PULSE_TMLT Pulse Time Window Register
*/
#define PULSE_TMLT_REG 0x26

/*
** PULSE_LTCY Pulse Latency Timer Register
*/
#define PULSE_LTCY_REG 0x27

/*
** PULSE_WIND Second Pulse Time Window Register
*/
#define PULSE_WIND_REG 0x28

/*
** ASLP_COUNT Auto Sleep Inactivity Timer Register
*/
#define ASLP_COUNT_REG 0x29

/*
** CTRL_REG1 System Control 1 Register
*/
#define CTRL_REG1 0x2A
//
#define ASLP_RATE1_MASK 0x80
#define ASLP_RATE0_MASK 0x40
#define DR2_MASK 0x20
#define DR1_MASK 0x10
#define DR0_MASK 0x08
#define LNOISE_MASK 0x04
#define FREAD_MASK 0x02
#define ACTIVE_MASK 0x01
#define ASLP_RATE_MASK 0xC0
#define DR_MASK 0x38
//
#define ASLP_RATE_20MS 0x00
#define ASLP_RATE_80MS ASLP_RATE0_MASK
#define ASLP_RATE_160MS ASLP_RATE1_MASK
#define ASLP_RATE_640MS ASLP_RATE1_MASK+ASLP_RATE0_MASK
//
#define DATA_RATE_1250US 0x00
#define DATA_RATE_2500US DR0_MASK
#define DATA_RATE_5MS DR1_MASK
#define DATA_RATE_10MS DR1_MASK+DR0_MASK
#define DATA_RATE_20MS DR2_MASK
#define DATA_RATE_80MS DR2_MASK+DR0_MASK
#define DATA_RATE_160MS DR2_MASK+DR1_MASK
#define DATA_RATE_640MS DR2_MASK+DR1_MASK+DR0_MASK

/*
** CTRL_REG2 System Control 2 Register
*/
#define CTRL_REG2 0x2B
//
#define ST_MASK 0x80
#define BOOT_MASK 0x40
#define SMODS1_MASK 0x20
#define SMODS0_MASK 0x10
#define SLPE_MASK 0x04
#define MODS1_MASK 0x02
#define MODS0_MASK 0x01
#define SMODS_MASK 0x18
#define MODS_MASK 0x03

/*
** CTRL_REG3 Interrupt Control Register
*/
#define CTRL_REG3 0x2C
//
#define FIFO_GATE_MASK 0x80
#define WAKE_TRANS_MASK 0x40
#define WAKE_LNDPRT_MASK 0x20
#define WAKE_PULSE_MASK 0x10
#define WAKE_FF_MT_1_MASK 0x08
#define WAKE_FF_MT_2_MASK 0x04
#define IPOL_MASK 0x02
#define PP_OD_MASK 0x01

/*
** CTRL_REG4 Interrupt Enable Register
*/
#define CTRL_REG4

0x2D
//
#define INT_EN_ASLP_MASK 0x80
#define INT_EN_FIFO_MASK 0x40
#define INT_EN_TRANS_MASK 0x20
#define INT_EN_LNDPRT_MASK 0x10
#define INT_EN_PULSE_MASK 0x08
#define INT_EN_FF_MT_1_MASK 0x04
#define INT_EN_FF_MT_2_MASK 0x02
#define INT_EN_DRDY_MASK 0x01

/*
** CTRL_REG5 Interrupt Configuration Register
*/
#define CTRL_REG5 0x2E
//
#define INT_CFG_ASLP_MASK 0x80
#define INT_CFG_FIFO_MASK 0x40
#define INT_CFG_TRANS_MASK 0x20
#define INT_CFG_LNDPRT_MASK 0x10
#define INT_CFG_PULSE_MASK 0x08
#define INT_CFG_FF_MT_1_MASK 0x04
#define INT_CFG_FF_MT_2_MASK 0x02
#define INT_CFG_DRDY_MASK 0x01

/*
** XYZ Offset Correction Registers
*/
#define OFF_X_REG 0x2F
#define OFF_Y_REG 0x30
#define OFF_Z_REG 0x31

#define MMA845x_Addr 0x1C



unsigned char TX_DATA[4]; //显示据缓存区
unsigned char BUF[10]; //接收数据缓存区
char test=0; //IIC用到
int T_X,T_Y,T_Z; //X,Y,Z轴

//************************************
/*模拟IIC端口输出输入定义*/
#define SCL_H GPIOB->BSRR = GPIO_Pin_6
#define SCL_L GPIOB->BRR = GPIO_Pin_6

#define SDA_H GPIOB->BSRR = GPIO_Pin_7
#define SDA_L GPIOB->BRR = GPIO_Pin_7

#define SCL_read GPIOB->IDR & GPIO_Pin_6
#define SDA_read GPIOB->IDR & GPIO_Pin_7

/* 函数申明 -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART1_Configuration(void);
void WWDG_Configuration(void);
void Delay(u32 nTime);
void Delayms(vu32 m);
/* 变量定义 ----------------------------------------------*/

/*******************************/
void DATA_printf(uchar *s,int temp_data)
{
if(temp_data<0){
temp_data=-temp_data;
*s='-';
}
else *s=' ';
*++s =temp_data/1000+0x30;
temp_data=temp_data%1000; //取余运算
*++s =temp_data/100+0x30;
temp_data=temp_data%100; //取余运算
*++s =temp_data/10+0x30;
temp_data=temp_data%10; //取余运算
*++s =temp_data+0x30;
}

/*******************************************************************************
* Function Name : I2C_GPIO_Config
* Description : Configration Simulation IIC GPIO
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStru

cture);
}

/*******************************************************************************
* Function Name : I2C_delay
* Description : Simulation IIC Timing series delay
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_delay(void)
{

u8 i=30; //这里可以优化速度 ,经测试最低到5还能写入
while(i)
{
i--;
}
}

void delay5ms(void)
{

int i=5000;
while(i)
{
i--;
}
}
/*******************************************************************************
* Function Name : I2C_Start
* Description : Master Start Simulation IIC Communication
* Input : None
* Output : None
* Return : Wheather Start
****************************************************************************** */
bool I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_Stop
* Description : Master Stop Simulation IIC Communication
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_Ack
* Description : Master Send Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_NoAck
* Description : Master Send No Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_WaitAck
* Description : Master Reserive Slave Acknowledge Single
* Input : None
* Output : None
* Return : Wheather Reserive Slave Acknowledge Single
****************************************************************************** */
bool I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;


I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
I2C_delay();
return FALSE;
}
SCL_L;
I2C_delay();
return TRUE;
}
/*******************************************************************************
* Function Name : I2C_SendByte
* Description : Master Send a Byte to Slave
* Input : Will Send Date
* Output : None
* Return : None
****************************************************************************** */
void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/*******************************************************************************
* Function Name : I2C_RadeByte
* Description : Master Reserive a Byte From Slave
* Input : None
* Output : None
* Return : Date From Slave
****************************************************************************** */
unsigned char I2C_RadeByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;

SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
//ZRX
//单字节写入*******************************************

bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data) //void
{
if(!I2C_Start())return FALSE;
I2C_SendByte(SlaveAddress); //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
I2C_SendByte(REG_Address ); //设置低起始地址
I2C_WaitAck();
I2C_SendByte(REG_data);
I2C_WaitAck();
I2C_Stop();
delay5ms();
return TRUE;
}

//单字节读取*****************************************
unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
{ unsigned char REG_data;
if(!I2C_Start())return FALSE;
I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址
if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
I2C_SendByte((u8) REG_Address); //设置低起始地址
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1);
I2C_WaitAck();

REG_data= I2C_RadeByte();
I2C_NoAck();
I2C_Stop();
//return TRUE;
return REG_data;

}

/*
********************************************************************************
** 函数名称 : RCC_Configuration(void)
** 函数功能 : 时钟初始化


** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();

/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);

/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL */
RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}

/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE);
}

/*
********************************************************************************
** 函数名称 : GPIO_Configuration(void)
** 函数功能 : 端口初始化
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE );
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选中管脚9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口

/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选中管脚10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //选择A端口

}

/*
********************************************************************************
** 函数名称 : USART1_Configuration(void)
** 函数功能 : 串口1初始化
**

输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void USART1_Configuration(void)
{

USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE );

USART_https://www.doczj.com/doc/fd9841538.html,ART_Clock = USART_Clock_Disable; // 时钟低电平活动
USART_https://www.doczj.com/doc/fd9841538.html,ART_CPOL = USART_CPOL_Low; // 时钟低电平
USART_https://www.doczj.com/doc/fd9841538.html,ART_CPHA = USART_CPHA_2Edge; // 时钟第二个边沿进行数据捕获
USART_https://www.doczj.com/doc/fd9841538.html,ART_LastBit = USART_LastBit_Disable; // 最后一位数据的时钟脉冲不从SCLK输出
/* Configure the USART1 synchronous paramters */
USART_ClockInit(USART1, &USART_ClockInitStructure); // 时钟参数初始化设置

USART_https://www.doczj.com/doc/fd9841538.html,ART_BaudRate =9600; // 波特率为:115200
USART_https://www.doczj.com/doc/fd9841538.html,ART_WordLength = USART_WordLength_8b; // 8位数据
USART_https://www.doczj.com/doc/fd9841538.html,ART_StopBits = USART_StopBits_1; // 在帧结尾传输1个停止位
USART_https://www.doczj.com/doc/fd9841538.html,ART_Parity = USART_Parity_No ; // 奇偶失能
USART_https://www.doczj.com/doc/fd9841538.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控制失能
USART_https://www.doczj.com/doc/fd9841538.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 发送使能+接收使能
/* Configure USART1 basic and asynchronous paramters */
USART_Init(USART1, &USART_InitStructure);

/* Enable USART1 */
USART_ClearFlag(USART1, USART_IT_RXNE); //清中断,以免一启用中断后立即产生中断
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //使能USART1中断源
USART_Cmd(USART1, ENABLE); //USART1总开关:开启
}


/*
********************************************************************************
** 函数名称 : NVIC_Configuration(void)
** 函数功能 : 中断初始化
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_Init(&NVIC_InitStructure);

}

/*
********************************************************************************
** 函数名称 : WWDG_Configuration(void)
** 函数功能 : 看门狗初始化
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void WWDG_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8); // WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms)
WWDG_SetWindowValue(0x41);

// Set Window value to 0x41
WWDG_Enable(0x50); // Enable WWDG and set counter value to 0x7F, WWDG timeout = ~4 ms * 64 = 262 ms
WWDG_ClearFlag(); // Clear EWI flag
WWDG_EnableIT(); // Enable EW interrupt
}

/*
********************************************************************************
** 函数名称 : Delay(vu32 nCount)
** 函数功能 : 延时函数
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

/*
********************************************************************************
** 函数名称 : void Delayms(vu32 m)
** 函数功能 : 长延时函数 m=1,延时1ms
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void Delayms(vu32 m)
{
u32 i;

for(; m != 0; m--)
for (i=0; i<50000; i++);
}

/*
********************************************************************************
** 函数名称 : WWDG_IRQHandler(void)
** 函数功能 : 窗口提前唤醒中断
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/

void WWDG_IRQHandler(void)
{
/* Update WWDG counter */
WWDG_SetCounter(0x50);

/* Clear EWI flag */
WWDG_ClearFlag();
}
//************************************************
void USART1_SendData(uchar SendData)
{
USART_SendData(USART1, SendData);
Delayms(1);
}
//初始化MMA845x,根据需要请参考pdf进行修改************************
void Init_MMA845x(void)
{
Single_Write(MMA845x_IIC_ADDRESS,CTRL_REG1,ASLP_RATE_20MS+DATA_RATE_5MS);
Single_Write(MMA845x_IIC_ADDRESS,XYZ_DATA_CFG_REG, FULL_SCALE_2G);
Single_Write(MMA845x_IIC_ADDRESS,CTRL_REG1, ACTIVE_MASK);
}

//******读取MMA845x数据****************************************
void READ_MMA845x(void)
{

BUF[0]=Single_Read(MMA845x_IIC_ADDRESS,OUT_X_LSB_REG);
BUF[1]=Single_Read(MMA845x_IIC_ADDRESS,OUT_X_MSB_REG);
T_X= (BUF[1]<<8)|BUF[0];
T_X/=16.4; //读取计算X轴数据

BUF[2]=Single_Read(MMA845x_IIC_ADDRESS,OUT_Y_LSB_REG);
BUF[3]=Single_Read(MMA845x_IIC_ADDRESS,OUT_Y_MSB_REG);
T_Y= (BUF[3]<<8)|BUF[2];
T_Y/=16.4; //读取计算Y轴数据
BUF[4]=Single_Read(MMA845x_IIC_ADDRESS,OUT_Z_LSB_REG);
BUF[5]=Single_Read(MMA845x_IIC_ADDRESS,OUT_Z_MSB_REG);
T_Z= (BUF[5]<<8)|BUF[4];
T_Z/=16.4; //读取计算Z轴数据

}
//********串口发送数据***************************************
void Send_data(uchar axis)
{uchar i;
USART1_SendData(axis);
USART1_SendData(':');
for(i=0;i<4;i++)USART1_SendData(TX_DATA[i]);
USART1_SendData(' ');
USART1_SendData(' ');
}

/*
*********************

***********************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
int main(void)
{
RCC_Configuration(); //配置RCC
GPIO_Configuration(); //配置GPIO
USART1_Configuration(); //配置串口1
I2C_GPIO_Config(); //配置IIC使用端口
Delayms(10); //延时
Init_MMA845x(); //初始化MMA845x
Single_Read(MMA845x_IIC_ADDRESS,WHO_AM_I_REG);
while(1)
{
READ_MMA845x(); //读取MMA845x数据
DATA_printf(TX_DATA,T_X);//转换X轴数据到数组
Send_data('X'); //发送X轴数
DATA_printf(TX_DATA,T_Y);//转换Y轴数据到数组
Send_data('Y'); //发送Y轴数
DATA_printf(TX_DATA,T_Z);//转换Z轴数据到数组
Send_data('Z'); //发送Z轴数
USART1_SendData(0X0D); //换行
USART1_SendData(0X0A); //回车
Delayms(5); //延时
}
}

/*************结束***************/

相关主题
文本预览
相关文档 最新文档