[mw_shl_code=c,true]#ifndef MPU6000_H_
#define MPU6000_H_
#include"sys.h"
//****************************************
// ?¨??MPU6050???????·
//****************************************
#define MPUREG_AUX_VDDIO 0x01
#define SMPLRT_DIV 0x19 //?????????ù????????????0x07(125Hz)
#define CONFIG 0x1A //???¨???¨??????????????0x06(5Hz)
#define GYRO_CONFIG 0x1B //??????×??ì?°????·??§??????????0x18(??×??ì??2000deg/s)
#define ACCEL_CONFIG 0x1C //??????×??ì??????·??§?°???¨???¨??????????????0x01(??×??ì??2G??5Hz)
#define INT_ENABLE 0x38 //????????
#define ACCEL_XOUT_H 0x3B //???????? x?á?????? ??8??
#define ACCEL_XOUT_L 0x3C //???????? x?á?????? ??8??
#define ACCEL_YOUT_H 0x3D //???????? y?á?????? ??8??
#define ACCEL_YOUT_L 0x3E //???????? y?á?????? ??8??
#define ACCEL_ZOUT_H 0x3F //???????? z?á?????? ??8??
#define ACCEL_ZOUT_L 0x40 //???????? z?á?????? ??8??
#define TEMP_OUT_H 0x41 //???? ??8??
#define TEMP_OUT_L 0x42 //???? ??8??
#define GYRO_XOUT_H 0x43 //?????? x?á?????? ??8??
#define GYRO_XOUT_L 0x44 //?????? x?á?????? ??8??
#define GYRO_YOUT_H 0x45 //?????? y?á?????? ??8??
#define GYRO_YOUT_L 0x46 //?????? y?á?????? ??8??
#define GYRO_ZOUT_H 0x47 //?????? z?á?????? ??8??
#define GYRO_ZOUT_L 0x48 //?????? z?á?????? ??8??
#define WHO_AM_I 0x75 //IIC???·?????÷(????????0x68??????)
#define SlaveAddress 0xD0 //IIC?????±?????·×?????????+1??????
#define MPU_Address 0x68 //?÷?????·
#define USER_CONTROL 0x6A //0x10 I2C_IF_DIS ENABLE
#define PWR_MGMT_1 0x6B //???????í??????????0x00(????????)
#define SPI_MPU6000_CS PBout(12) //????MPU6000
//????????????????????????????????????
extern double angle_m,gyro_m;
extern double measure[6];
extern s16 Original_measure[6]; //??????????????
void SPI_MPU6000_Init(void);//??????
void MPU6000_Init(void);//??????
u8 SPI_Write_Reg(u8 address,u8 data);
void GetData(void);
[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]//SPI_BaudRatePrescaler_2 2·???
//SPI_BaudRatePrescaler_8 8·???
//SPI_BaudRatePrescaler_16 16·???
//SPI_BaudRatePrescaler_256 256·???
void SPI2_Init(u8 SPI_BaudRatePrescaler)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
// RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,ENABLE);//?????±??
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB?±??????
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//SPI2?±??????
//GPIOB.13/14/15????
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//???????ì????
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//????????
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14;
GPIO_Init(GPIOB,&GPIO_InitStruct);
// GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//GPIOB.13/14/15????
//SPI2??????
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//?????¤
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;//?÷SPI
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;//8?????á??
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;//?®???????±??????×???????????
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;//?????????????????±????
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;//NSS???????í??????
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler;//?¤·???
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;//???????? ???????°
SPI_InitStruct.SPI_CRCPolynomial=7;//CRC???é???à????
SPI_Init(SPI2,&SPI_InitStruct);
SPI_Cmd(SPI2,ENABLE);//????SPI
// SPI2_ReadWriteByte(0xff);//????????
}
//SPI????????×???
//TxData ????????×???
u8 SPI2_ReadWriteByte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:·?????????±ê????
{
printf("????\r\n");
}
SPI_I2S_SendData(SPI2, TxData); //?¨?????èSPIx·???????????
printf("·???\r\n");
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:????????·???±ê????
{
printf("????\r\n");
}
printf("????\r\n");
return SPI_I2S_ReceiveData(SPI2); //·????¨??SPIx×??ü??????????
}
[/mw_shl_code]
[/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]void SPI_MPU6000_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB?±??????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PB12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_12);//???è±?????????
SPI2_Init(SPI_BaudRatePrescaler_8); //??????SPI
}
void MPU6000_Init()//±???????????SPI
{
delay_ms(20);
/* GPIO_ResetBits(GPIOB,GPIO_Pin_14);//MISO=0
GPIO_SetBits(GPIOB,GPIO_Pin_12);//CS=1
GPIO_SetBits(GPIOB,GPIO_Pin_15);//MOSI=1
GPIO_SetBits(GPIOB,GPIO_Pin_13);//SCK=1
GPIO_SetBits(GPIOB,GPIO_Pin_12);//CS=1
GPIO_ResetBits(GPIOB,GPIO_Pin_13);//SCK=0
*/
SPI_MPU6000_CS=0; //?????è±?
delay_ms(2);
// SPI_Write_Reg(PWR_MGMT_1,0x80);//?±??reset
// delay_us(100);
// SPI_Write_Reg(MPUREG_AUX_VDDIO,0);// Auxiliary I2C Supply Selection, set to zero for MPU-6000
// delay_ms(1);
SPI_Write_Reg(PWR_MGMT_1,0x00);
delay_ms(20);
SPI_Write_Reg(USER_CONTROL,0x10);//Disable I2C Enable SPI /0x30 Enable I2C Enable SPI
SPI_Write_Reg(SMPLRT_DIV,0x07);
SPI_Write_Reg(CONFIG,0x07);
SPI_Write_Reg(GYRO_CONFIG,0x18); //2000 ??/s ?é???? 16.4 LSB
SPI_Write_Reg(ACCEL_CONFIG,0x01); //??2g ?é???? 16384LSB
//SPI_Write_Reg(INT_ENABLE,0x40);//????????
delay_ms(20);
SPI_MPU6000_CS=1;
}
//?ò?????÷address ??data
u8 SPI_Write_Reg(u8 address,u8 data)
{
u8 status;
SPI_MPU6000_CS=0; //?????÷??
delay_ms(1);
status=SPI2_ReadWriteByte(address); //?????????÷???·
SPI2_ReadWriteByte(data); //????????
SPI_MPU6000_CS=1; //????????
return status;
}
void GetData(void)
{
s16 H=0,L=0;
SPI_MPU6000_CS=0; //?????÷??
delay_ms(1);
H=SPI2_ReadWriteByte(ACCEL_XOUT_H|0x80);
L=SPI2_ReadWriteByte(ACCEL_XOUT_L|0x80);
Original_measure[0]=(H<<8)+L; //????????
measure[0]=(double)Original_measure[0]/16384; //???? ?????? g
H=SPI2_ReadWriteByte(ACCEL_YOUT_H|0x80);
L=SPI2_ReadWriteByte(ACCEL_YOUT_L|0x80);
Original_measure[1]=(H<<8)+L; //????????
measure[1]=(double)Original_measure[1]/16384; //???? ?????? g
H=SPI2_ReadWriteByte(ACCEL_ZOUT_H|0x80);
L=SPI2_ReadWriteByte(ACCEL_ZOUT_L|0x80);
Original_measure[2]=(H<<8)+L; //????????
measure[2]=(double)Original_measure[2]/16384; //???? ?????? g
H=SPI2_ReadWriteByte(GYRO_XOUT_H|0x80);
L=SPI2_ReadWriteByte(GYRO_XOUT_L|0x80);
Original_measure[3]=(H<<8)+L; //????????
measure[3]=(double)Original_measure[3]/16.4; //???? ?????? ??/s
H=SPI2_ReadWriteByte(GYRO_YOUT_H|0x80);
L=SPI2_ReadWriteByte(GYRO_YOUT_L|0x80);
Original_measure[4]=(H<<8)+L; //????????
measure[4]=(double)Original_measure[4]/16.4; //???? ?????? ??/s
H=SPI2_ReadWriteByte(GYRO_ZOUT_H|0x80);
L=SPI2_ReadWriteByte(GYRO_ZOUT_L|0x80);
Original_measure[5]=(H<<8)+L; //????????
measure[5]=(double)Original_measure[5]/16.4; //???? ?????? ??/s
SPI_MPU6000_CS=1;
}
[/mw_shl_code]
|