MPU6050iic.c(参考匿名的)

来源:互联网 发布:在淘宝上买到假海之蓝 编辑:程序博客网 时间:2024/06/11 19:01
#include "MPU6050iic.h"/*******************************   延时函数   *************************************/static u8  fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数void delay_init()    {    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //选择外部时钟  HCLK/8    fac_us=SystemCoreClock/8000000; //为系统时钟的1/8          fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数 }                                   void delay_ms(u16 nms){                     u32 temp;              SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)    SysTick->VAL =0x00;           //清空计数器    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数      do    {        temp=SysTick->CTRL;    }    while(temp&0x01&&!(temp&(1<<16)));//等待时间到达       SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器    SysTick->VAL =0X00;       //清空计数器           } //MPU IIC 延时函数void MPU_IIC_Delay(void)//2us{    u32 temp;  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟  HCLK/8    SysTick->LOAD=2*fac_us; //时间加载,2us               SysTick->VAL=0x00;        //清空计数器    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数         do    {        temp=SysTick->CTRL;    }    while(temp&0x01&&!(temp&(1<<16)));//等待时间到达       SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器    SysTick->VAL =0X00;       //清空计数器    }/*******************************   初始化IIC的IO口   ***************************************/void MPU_IIC_Init(void){                          GPIO_InitTypeDef  GPIO_InitStructure;    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;     // 端口配置  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出,可输出高低电平,连接数字器件  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度为50MHz  GPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIO   GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);                       //PB10,PB11 输出高    }/***************************  IIC底层读写的时序函数  **************************************///产生IIC起始信号void MPU_IIC_Start(void){    MPU_SDA_OUT();     //sda线输出    MPU_IIC_SDA=1;            MPU_IIC_SCL=1;    MPU_IIC_Delay();    MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low     MPU_IIC_Delay();    MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 }     //产生IIC停止信号void MPU_IIC_Stop(void){    MPU_SDA_OUT();//sda线输出    MPU_IIC_SCL=0;    MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high    MPU_IIC_Delay();    MPU_IIC_SCL=1;      MPU_IIC_SDA=1;//发送I2C总线结束信号    MPU_IIC_Delay();                                }//等待应答信号到来//返回值:1,接收应答失败//        0,接收应答成功u8 MPU_IIC_Wait_Ack(void){    u8 ucErrTime=0;    MPU_SDA_IN();      //SDA设置为输入      MPU_IIC_SDA=1;MPU_IIC_Delay();         MPU_IIC_SCL=1;MPU_IIC_Delay();       while(MPU_READ_SDA)    {        ucErrTime++;        if(ucErrTime>250)        {            MPU_IIC_Stop();            return 1;        }    }    MPU_IIC_SCL=0;//时钟输出0          return 0;  } //产生ACK应答void MPU_IIC_Ack(void){    MPU_IIC_SCL=0;    MPU_SDA_OUT();    MPU_IIC_SDA=0;    MPU_IIC_Delay();    MPU_IIC_SCL=1;    MPU_IIC_Delay();    MPU_IIC_SCL=0;}//不产生ACK应答          void MPU_IIC_NAck(void){    MPU_IIC_SCL=0;    MPU_SDA_OUT();    MPU_IIC_SDA=1;    MPU_IIC_Delay();    MPU_IIC_SCL=1;    MPU_IIC_Delay();    MPU_IIC_SCL=0;}                                        //IIC发送一个字节//返回从机有无应答//1,有应答//0,无应答           void MPU_IIC_Send_Byte(u8 txd){                            u8 t;       MPU_SDA_OUT();          MPU_IIC_SCL=0;//拉低时钟开始数据传输    for(t=0;t<8;t++)    {                      MPU_IIC_SDA=(txd&0x80)>>7;        txd<<=1;              MPU_IIC_SCL=1;        MPU_IIC_Delay();         MPU_IIC_SCL=0;          MPU_IIC_Delay();    }    }       //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   u8 MPU_IIC_Read_Byte(unsigned char ack){    unsigned char i,receive=0;    MPU_SDA_IN();//SDA设置为输入    for(i=0;i<8;i++ )    {        MPU_IIC_SCL=0;         MPU_IIC_Delay();        MPU_IIC_SCL=1;        receive<<=1;        if(MPU_READ_SDA)receive++;           MPU_IIC_Delay();     }                        if (!ack)        MPU_IIC_NAck();//发送nACK    else        MPU_IIC_Ack(); //发送ACK       return receive;}
原创粉丝点击