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;}
阅读全文
0 0
- MPU6050iic.c(参考匿名的)
- CONTROL.c(参考匿名的)
- IMU.c(参考匿名的)
- MOTO.c(参考匿名的)
- MPU6050.c(参考匿名的)
- RC.c(参考匿名的)
- UART1.c(参考匿名的)
- UART2.c(参考匿名的)
- usart.c(参考匿名的)
- main.c和stm32f10x_it.c(参考匿名的)
- C语言的内存分配(参考)
- C + +的袖珍参考
- VC:匿名管道参考程序
- Objective-C的运行时(runtime)参考
- c代码规范(参考)
- JavaSE 学习参考:匿名内部类和匿名对象
- (多年后回头学习c#)被遗忘的世界 一 匿名类 与 扩展方法
- c#.net常用的小函数参考
- 1007: 鸡兔同笼
- MPU6050.c(参考匿名的)
- Win 10上帝模式 的开启和高级隐藏文件
- angular2 路由策略 LocationStrategy
- For CUDA login-loop error CUDA安装循环登录问题 [Ubuntu 14.04]
- MPU6050iic.c(参考匿名的)
- USACO Section1.2 Name That Number
- mysql函数
- linux0.11环境配置
- RC.c(参考匿名的)
- myeclipse中部署项目后改名了,怎么tomcat还是原项目名,如何改
- HDOJ 3336 Count the string
- R语言ggplot2条形图详解
- UART1.c(参考匿名的)