#include "mpu9250.h"
#include "delay.h"
u8 BUF[10]; //½óêÕêy¾Y»o′æÇø
//·μ»Øbufê×μØÖ·
u8* Rtn_Buf(void)
{
return BUF;
}
/*******************************************************************************
* 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;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//3õê¼»ˉSCL1ü½Å
GPIO_InitStructure.GPIO_Pin = SCL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //¿a©êä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //ÎTéÏà-
GPIO_Init(SCL_PORT, &GPIO_InitStructure);
//3õê¼»ˉSDA1ü½Å
GPIO_InitStructure.GPIO_Pin = SDA_PIN;
GPIO_Init(SDA_PORT, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : I2C_delay
* Description : Simulation IIC Timing series delay
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_delay(void)
{
u8 i=200; //Õaàï¿éòÔóÅ»ˉËù¶è £¬¾-2aêÔ×îμíμ½5»1ÄüD′èë
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ÏßÎaμíμçƽÔò×üÏßÃ|,íË3ö
SDA_L;
I2C_delay();
if(SDA_read) return FALSE; //SDAÏßÎa¸ßμçƽÔò×üÏß3ö′í,íË3ö
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) //·μ»ØÎa:=1óDACK,=0ÎTACK
{
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) //êy¾Y′ó¸ßλμ½μíλ//
{
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) //êy¾Y′ó¸ßλμ½μíλ//
{
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
//μ¥×Ö½úD′èë*******************************************
bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data) //void
{
if(!I2C_Start())return FALSE;
I2C_SendByte(SlaveAddress); //·¢Ëíé豸μØÖ·+D′DÅoÅ//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//éèÖøßÆeê¼μØÖ·+Æ÷¼tμØÖ·
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
I2C_SendByte(REG_Address ); //éèÖÃμíÆeê¼μØÖ·
I2C_WaitAck();
I2C_SendByte(REG_data);
I2C_WaitAck();
I2C_Stop();
delay_ms(5);
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);//éèÖøßÆeê¼μØÖ·+Æ÷¼tμØÖ·
if(!I2C_WaitAck())
{
I2C_Stop();
return FALSE;
}
I2C_SendByte((u8) REG_Address); //éèÖÃμíÆeê¼μØÖ·
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1);
I2C_WaitAck();
REG_data= I2C_RadeByte();
I2C_NoAck();
I2C_Stop();
//return TRUE;
return REG_data;
}
//3õê¼»ˉMPU9250£¬¸ù¾YDèòaÇë2ο¼pdf½øDDDT¸Ä************************
void Init_MPU9250(void)
{
/*
Single_Write(GYRO_ADDRESS,PWR_M, 0x80); //
Single_Write(GYRO_ADDRESS,SMPL, 0x07); //
Single_Write(GYRO_ADDRESS,DLPF, 0x1E); //¡à2000¡ã
Single_Write(GYRO_ADDRESS,INT_C, 0x00 ); //
Single_Write(GYRO_ADDRESS,PWR_M, 0x00); //
*/
I2C_GPIO_Config();
Single_Write(GYRO_ADDRESS,PWR_MGMT_1, 0x00); //½a3yDYÃß×′ì¬
Single_Write(GYRO_ADDRESS,SMPLRT_DIV, 0x07);
Single_Write(GYRO_ADDRESS,CONFIG, 0x06);
Single_Write(GYRO_ADDRESS,GYRO_CONFIG, 0x18);
Single_Write(GYRO_ADDRESS,ACCEL_CONFIG, 0x01);
//----------------
// Single_Write(GYRO_ADDRESS,0x6A,0x00);//close Master Mode
}
//******¶áè¡MPU9250êy¾Y****************************************
Data_Tpye READ_MPU9250_ACCEL(void)
{
Data_Tpye Tmp_data;
BUF[0]=Single_Read(ACCEL_ADDRESS,ACCEL_XOUT_L);
BUF[1]=Single_Read(ACCEL_ADDRESS,ACCEL_XOUT_H);
Tmp_data.Data_x = (BUF[1]<<8)|BUF[0];
Tmp_data.Data_x /= 164; //¶á衼ÆËãXÖáêy¾Y
BUF[2]=Single_Read(ACCEL_ADDRESS,ACCEL_YOUT_L);
BUF[3]=Single_Read(ACCEL_ADDRESS,ACCEL_YOUT_H);
Tmp_data.Data_y = (BUF[3]<<8)|BUF[2];
Tmp_data.Data_y /= 164; //¶á衼ÆËãYÖáêy¾Y
BUF[4]=Single_Read(ACCEL_ADDRESS,ACCEL_ZOUT_L);
BUF[5]=Single_Read(ACCEL_ADDRESS,ACCEL_ZOUT_H);
Tmp_data.Data_z= (BUF[5]<<8)|BUF[4];
Tmp_data.Data_z /= 164; //¶á衼ÆËãZÖáêy¾Y
return Tmp_data;
}
Data_Tpye READ_MPU9250_GYRO(void)
{
Data_Tpye Tmp_data;
BUF[0]=Single_Read(GYRO_ADDRESS,GYRO_XOUT_L);
BUF[1]=Single_Read(GYRO_ADDRESS,GYRO_XOUT_H);
Tmp_data.Data_x= (BUF[1]<<8)|BUF[0];
Tmp_data.Data_x/=16.4; //¶á衼ÆËãXÖáêy¾Y
BUF[2]=Single_Read(GYRO_ADDRESS,GYRO_YOUT_L);
BUF[3]=Single_Read(GYRO_ADDRESS,GYRO_YOUT_H);
Tmp_data.Data_y= (BUF[3]<<8)|BUF[2];
Tmp_data.Data_y/=16.4; //¶á衼ÆËãYÖáêy¾Y
BUF[4]=Single_Read(GYRO_ADDRESS,GYRO_ZOUT_L);
BUF[5]=Single_Read(GYRO_ADDRESS,GYRO_ZOUT_H);
Tmp_data.Data_z= (BUF[5]<<8)|BUF[4];
Tmp_data.Data_z/=16.4; //¶á衼ÆËãZÖáêy¾Y
return Tmp_data;
// BUF[6]=Single_Read(GYRO_ADDRESS,TEMP_OUT_L);
// BUF[7]=Single_Read(GYRO_ADDRESS,TEMP_OUT_H);
// T_T=(BUF[7]<<8)|BUF[6];
// T_T = 35+ ((double) (T_T + 13200)) / 280;// ¶á衼ÆËã3öζè
}
Data_Tpye READ_MPU9250_MAG(void)
{
Data_Tpye Tmp_data;
Single_Write(GYRO_ADDRESS,0x37,0x02);//turn on Bypass Mode
delay_ms(10);
Single_Write(MAG_ADDRESS,0x0A,0x01);
delay_ms(10);
BUF[0]=Single_Read (MAG_ADDRESS,MAG_XOUT_L);
BUF[1]=Single_Read (MAG_ADDRESS,MAG_XOUT_H);
Tmp_data.Data_x=(BUF[1]<<8)|BUF[0];
BUF[2]=Single_Read(MAG_ADDRESS,MAG_YOUT_L);
BUF[3]=Single_Read(MAG_ADDRESS,MAG_YOUT_H);
Tmp_data.Data_y= (BUF[3]<<8)|BUF[2];
//¶á衼ÆËãYÖáêy¾Y
BUF[4]=Single_Read(MAG_ADDRESS,MAG_ZOUT_L);
BUF[5]=Single_Read(MAG_ADDRESS,MAG_ZOUT_H);
Tmp_data.Data_z= (BUF[5]<<8)|BUF[4]; //¶á衼ÆËãZÖáêy¾Y
return Tmp_data;
}
//ID = 0x71
u8 Read_Device_ID(void)
{
u8 id;
id = Single_Read(GYRO_ADDRESS, WHO_AM_I); //¶á3öé豸id
return id;
}
|