当前位置: 首页 > news >正文

如何查看网站的服务器位置微信做一元云购网站

如何查看网站的服务器位置,微信做一元云购网站,做网站投资要多少钱,专题网站建设意义何在文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器#xff08;软件I2C#xff09;1、模块内部电路2、寄存器地… 文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器软件I2C1、模块内部电路2、寄存器地址3、软件模拟IIC①、MPU6050.c②、MPU6050.h③、MPU6050_Reg.h Ⅴ、硬件IICI2C外设1、I2C硬件外设2、I2C框图3、I2C基本结构4、主机发送5、主机接收 Ⅵ、配置I2C外设1、I2C函数2、I2C_InitTypeDef结构体参数①、I2C_ClockSpeed②、I2C_Mode③、I2C_DutyCycle④、I2C_OwnAddress1⑤、I2C_Ack⑥、I2C_AcknowledgedAddress 3、I2C外设①、MPU6050.c I2C通信 名称引脚双工时钟电平设备I2CSCL、SDA半双工同步单端多设备 I2CInter IC Bus是由Philips公司开发的一种通用数据总线 两根通信线SCLSerial Clock、SDASerial Data 同步半双工 带数据应答 支持总线挂载多设备一主多从、多主多从 Ⅰ、硬件电路 所有I2C设备的SCL连在一起SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 SCL和SDA各添加一个上拉电阻阻值一般为4.7KΩ左右高电平驱动能力弱 Ⅱ、IIC时序基本单元 ① 起始条件 SCL高电平期间SDA从高电平切换到低电平 ② 终止条件 SCL高电平期间SDA从低电平切换到高电平 ③ 发送一个字节 SCL低电平期间主机将数据位依次放到SDA线上高位先行然后释放SCL从机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节 发送期间SCL与SDA只能由主机STM32控制 最后一位为读写标志位0写1读 ④ 接收一个字节 SCL低电平期间从机将数据位依次放到SDA线上高位先行然后释放SCL主机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可接收一个字节主机在接收之前需要释放SDA ⑤ 发送应答 主机在接收完一个字节之后在下一个时钟发送一位数据SDA数据0表示应答数据1表示非应答 ⑥ 接收应答 主机在发送完一个字节之后在下一个时钟接收一位数据判断从机是否应答数据0表示应答数据1表示非应答主机在接收之前需要释放SDA Ⅲ、IIC时序 指定地址写单字节 指定地址写多字节 指定地址读单字节 指定地址读多字节 ① 指定地址写 对于指定设备Slave Address在指定地址Reg Address下写入指定数据Data ② 当前地址读 对于指定设备Slave Address在当前地址指针指示的地址下读取从机数据Data 每一次的读写数据都会造成地址指针1 ③ 指定地址读 对于指定设备Slave Address在指定地址Reg Address下读取从机数据Data Sr重复起始条件另启时序 Ⅳ、MPU6050—6轴姿态传感器软件I2C MPU6050是一个6轴姿态传感器可以测量芯片自身X、Y、Z轴的加速度、角速度参数通过数据融合可进一步得到姿态角常应用于平衡车、飞行器等需要检测自身姿态的场景 3轴加速度计Accelerometer测量X、Y、Z轴的加速度 静态稳定动态不稳定 3轴陀螺仪传感器Gyroscope测量X、Y、Z轴的角速度 动态稳定静态不稳定 16位ADC采集传感器的模拟信号量化范围-32768~32767 加速度计满量程选择±2、±4、±8、±16g 陀螺仪满量程选择 ±250、±500、±1000、±2000°/sec 可配置的数字低通滤波器 可配置的时钟源 可配置的采样分频 I2C从机地址 1101000AD001101001AD01 1、模块内部电路 引脚功能VCC、GND电源SCL、SDAI2C通信引脚XCL、XDA主机I2C通信引脚 与扩展设备通信AD0从机地址最低位INT中断信号输出 2、寄存器地址 3、软件模拟IIC 可任意指定两个引脚分别作为IIC的SCL和SDA本示例中使用的引脚为PB10、PB11 SCLPB10SDAPB11 MyI2C.c #include stm32f10x.h // Device header #include Delay.h/* SCL:PB10 SDA:PB11 */void MyI2C_W_SCL(char BitValue) {GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);Delay_us(10); } void MyI2C_W_SDA(char BitValue) {GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue);Delay_us(10); } uint8_t MyI2C_R_SDA(void) {uint8_t BitValue GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);Delay_us(10);return BitValue; }//初始化IIC void MyI2C_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_OD;//配置成开漏输出模式GPIO_InitStruct.GPIO_Pin GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStruct);GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);//初始化为高电平释放总线 }//I2C开始函数(SCL高电平期间SDA从高电平切换到低电平最后拉低SCL) //为了兼容重复起始条件应将SDA置高放在SCL置高之前 void MyI2C_Start(void) {MyI2C_W_SDA(1);MyI2C_W_SCL(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0); }//I2C终止函数(SCL高电平期间SDA从低电平切换到高电平) void MyI2C_Stop(void) {MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1); }//I2C发送一个字节 void MyI2C_SendByte(uint8_t Byte) {uint8_t i 0;for(i 0;i 8;i) {MyI2C_W_SDA(Byte (0x80 i));MyI2C_W_SCL(1);MyI2C_W_SCL(0);} }//I2C接收一个字节 uint8_t MyI2C_ReceiveByte(void) {uint8_t Byte 0x00;uint8_t i 0;MyI2C_W_SDA(1);//主机释放SDAfor(i 0;i 8;i) {MyI2C_W_SCL(1);if(MyI2C_R_SDA() 1) {//主机读取SDA Byte | (0x80 i);}MyI2C_W_SCL(0);}return Byte; }//发送应答 void MyI2C_SendAck(char AckBit) {MyI2C_W_SDA(AckBit);MyI2C_W_SCL(1);MyI2C_W_SCL(0); }//接收应答 uint8_t MyI2C_ReceiveAck(void) {MyI2C_W_SDA(1);//松手MyI2C_W_SCL(1);uint8_t Ack MyI2C_R_SDA();MyI2C_W_SCL(0);return Ack; } ①、MPU6050.c #include stm32f10x.h // Device header #include MyIIC.h #include MPU6050_Reg.h #include MPU6050.h#define MPU6050_ADDR 0xD0//从机地址读写位//指定地址写 void MPU6050_WriteReg(uint8_t RegAddr, uint8_t Data) {MyI2C_Start(); //开始MyI2C_SendByte(MPU6050_ADDR); //指定从机MyI2C_ReceiveAck(); //接收应答可处理MyI2C_SendByte(RegAddr); //指定地址MyI2C_ReceiveAck(); //接收应答可处理MyI2C_SendByte(Data); //发送数据MyI2C_ReceiveAck(); //接收应答可处理MyI2C_Stop(); //停止 }//指定地址读 uint8_t MPU6050_ReadReg(uint8_t RegAddr) {MyI2C_Start(); //开始MyI2C_SendByte(MPU6050_ADDR); //指定从机--写MyI2C_ReceiveAck(); MyI2C_SendByte(RegAddr); //指定地址MyI2C_ReceiveAck();MyI2C_Start(); //Sr重复起始MyI2C_SendByte(MPU6050_ADDR | 0x01);//指定从机--读MyI2C_ReceiveAck();uint8_t Data MyI2C_ReceiveByte();MyI2C_SendAck(1); //不给从机应答MyI2C_Stop(); //停止return Data; }void MPU6050_Init(void) {MyI2C_Init();MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//配置电源管理寄存器1解除睡眠选择x轴的时钟MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//配置电源管理寄存器2六轴均不待机MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//采样率分频器10分频MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//滤波参数MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//陀螺仪最大量程MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度计最大量程 }void MPU6050_GetData(MPU_Data* pData) {uint16_t Data_H, Data_L;//加速度计XData_H MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);//读高位Data_L MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);//读低位pData-AccX (Data_H 8) | Data_L;//拼接//加速度计YData_H MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);Data_L MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);pData-AccY (Data_H 8) | Data_L;//加速度计ZData_H MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);Data_L MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);pData-AccZ (Data_H 8) | Data_L;//陀螺仪XData_H MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);Data_L MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);pData-GyrX (Data_H 8) | Data_L;//陀螺仪YData_H MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);Data_L MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);pData-GyrY (Data_H 8) | Data_L;//陀螺仪ZData_H MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);Data_L MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);pData-GyrZ (Data_H 8) | Data_L;//温度Data_H MPU6050_ReadReg(MPU6050_TEMP_OUT_H);Data_L MPU6050_ReadReg(MPU6050_TEMP_OUT_L);pData-TEMP (Data_H 8) | Data_L; }uint8_t MPU6050_GetID(void) {return MPU6050_ReadReg(MPU6050_WHO_AM_I); } ②、MPU6050.h #ifndef __MPU6050_H__ #define __MPU6050_H__ #include stdint.h typedef struct {int16_t AccX;int16_t AccY;int16_t AccZ;int16_t GyrX;int16_t GyrY;int16_t GyrZ;int16_t TEMP; }MPU_Data;void MPU6050_WriteReg(uint8_t RegAddr, uint8_t Data);//指定地址写 uint8_t MPU6050_ReadReg(uint8_t RegAddr);//指定地址读 void MPU6050_Init(void); void MPU6050_GetData(MPU_Data* pData); uint8_t MPU6050_GetID(void);#endif 实际数据 转换后的值 32768 ∗ 选择的量程 实际数据 \frac{转换后的值 }{32768}*选择的量程 实际数据32768转换后的值​∗选择的量程 ③、MPU6050_Reg.h 常用寄存器 #ifndef __MPU6050_REG_H__ #define __MPU6050_REG_H__ //#define 寄存器名称 地址#define MPU6050_SMPLRT_DIV 0x19 //采样率分频器 #define MPU6050_CONFIG 0x1A //配置 #define MPU6050_GYRO_CONFIG 0x1B //陀螺仪配置 #define MPU6050_ACCEL_CONFIG 0x1C //加速度计配置#define MPU6050_ACCEL_XOUT_H 0x3B //加速度计X轴高字节 #define MPU6050_ACCEL_XOUT_L 0x3C //加速度计X轴低字节 #define MPU6050_ACCEL_YOUT_H 0x3D //加速度计Y轴高字节 #define MPU6050_ACCEL_YOUT_L 0x3E //加速度计Y轴低字节 #define MPU6050_ACCEL_ZOUT_H 0x3F //加速度计Z轴高字节 #define MPU6050_ACCEL_ZOUT_L 0x40 //加速度计Z轴低字节 #define MPU6050_TEMP_OUT_H 0x41 //温度高字节 #define MPU6050_TEMP_OUT_L 0x42 //温度低字节 #define MPU6050_GYRO_XOUT_H 0x43 //陀螺仪X轴高字节 #define MPU6050_GYRO_XOUT_L 0x44 //陀螺仪X轴低字节 #define MPU6050_GYRO_YOUT_H 0x45 //陀螺仪Y轴高字节 #define MPU6050_GYRO_YOUT_L 0x46 //陀螺仪Y轴低字节 #define MPU6050_GYRO_ZOUT_H 0x47 //陀螺仪Z轴高字节 #define MPU6050_GYRO_ZOUT_L 0x48 //陀螺仪Z轴低字节#define MPU6050_PWR_MGMT_1 0x6B //电源管理1 #define MPU6050_PWR_MGMT_2 0x6C //电源管理2 #define MPU6050_WHO_AM_I 0x75 //设备ID#endif Ⅴ、硬件IICI2C外设 1、I2C硬件外设 STM32内部集成了硬件I2C收发电路可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能减轻CPU的负担 支持多主机模型 支持7位/10位地址模式 支持不同的通讯速度标准速度(高达100 kHz)快速(高达400 kHz) 支持DMA 兼容SMBus协议 STM32F103C8T6 硬件I2C资源I2C1、I2C2 2、I2C框图 3、I2C基本结构 ​ 4、主机发送 5、主机接收 Ⅵ、配置I2C外设 开启时钟I2C外设和GPIO口的时钟把I2C外设对应的GPIO口设置成复用开漏模式配置I2C结构体使能I2C 1、I2C函数 // 重置指定的I2C为默认值 void I2C_DeInit(I2C_TypeDef* I2Cx);// 初始化指定的I2C根据初始化结构体配置参数 void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); // 初始化I2C初始化结构体的默认值 void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);// 开启或关闭指定的I2C void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 开启或关闭I2C的DMA功能 void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 配置I2C DMA传输的最后一个数据 void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 生成I2C的启动信号 void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); // 生成I2C的停止信号 void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);// 配置I2C的应答使能 void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);// 配置I2C的第二个地址 void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); // 开启或关闭I2C的双地址模式 void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); // 开启或关闭I2C的通用呼叫模式 void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 开启或关闭I2C的中断 void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState);// 通过I2C发送数据 void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); // 通过I2C接收数据 uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);// 发送I2C的7位地址和方向 void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);// 读取I2C寄存器的值 uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register);// 发送I2C软件复位信号 void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 配置I2C的NACK位置 void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition);// 配置I2C的SMBus警报 void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert);// 开启或关闭I2C的PEC传输 void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); // 配置I2C的PEC位置 void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); // 开启或关闭I2C的PEC计算 void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); // 获取I2C的PEC值 uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx);// 开启或关闭I2C的ARP功能 void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 开启或关闭I2C的时钟拉伸功能 void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);// 配置I2C的快速模式占空比 void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle);//检查I2C事件是否发生 ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); //获取I2C最后一个发生的事件 uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx);//获取I2C标志状态 FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); //清除I2C标志。 void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);//获取I2C中断状态。 ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); //清除I2C中断待处理位。 void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT);2、I2C_InitTypeDef结构体参数 ①、I2C_ClockSpeed 时钟频率—该参数必须设置为低于400kHz的值 ②、I2C_Mode I2C模式 该参数可以是ref I2C_mode ref I2C_mode 宏定义解释 I2C_Mode_I2C 描述定义了标准的I2C模式。在这种模式下I2C接口按照I2C协议的标准规范进行通信 I2C_Mode_SMBusDevice 描述定义了SMBusSystem Management Bus设备模式。SMBus是一种基于I2C的协议主要用于系统管理通信。在这种模式下I2C接口按照SMBus协议进行通信作为设备端 I2C_Mode_SMBusHost 描述定义了SMBus主机模式。在这种模式下I2C接口按照SMBus协议进行通信作为主机端可以控制通信过程 宏函数 IS_I2C_MODE(MODE) 描述这是一个宏函数用于检查给定的工作模式设置是否有效参数MODE代表I2C的工作模式设置功能检查MODE是否等于I2C_Mode_I2C、I2C_Mode_SMBusDevice或I2C_Mode_SMBusHost中的任一个返回值如果MODE有效返回1真否则返回0假 表格 宏定义值描述I2C_Mode_I2C0x0000标准I2C模式I2C_Mode_SMBusDevice0x0002SMBus设备模式I2C_Mode_SMBusHost0x000ASMBus主机模式 宏函数描述IS_I2C_MODE(MODE)检查MODE是否为有效的I2C工作模式设置 ③、I2C_DutyCycle I2C快速模式占空比 该参数可以是ref I2C_duty_cycle_in_fast_mode ref I2C_duty_cycle_in_fast_mode 宏定义解释 I2C_DutyCycle_16_9 描述定义了I2C快速模式下的占空比为16:9。在这种配置下I2C的时钟周期被分为16个低电平时间和9个高电平时间。这种配置适用于大多数I2C设备 I2C_DutyCycle_2 描述定义了I2C快速模式下的占空比为2:1。在这种配置下I2C的时钟周期被分为2个低电平时间和1个高电平时间。这种配置适用于需要更快数据传输速率的场景 宏函数 IS_I2C_DUTY_CYCLE(CYCLE) 描述这是一个宏函数用于检查给定的占空比设置是否有效参数CYCLE代表I2C的占空比设置功能检查CYCLE是否等于I2C_DutyCycle_16_9或I2C_DutyCycle_2中的任一个返回值如果CYCLE有效返回1真否则返回0假 表格 宏定义值描述I2C_DutyCycle_16_90x4000I2C快速模式占空比为16:9I2C_DutyCycle_20xBFFFI2C快速模式占空比为2:1 宏函数描述IS_I2C_DUTY_CYCLE(CYCLE)检查CYCLE是否为有效的I2C占空比设置 ④、I2C_OwnAddress1 指定第一个设备自己的地址 支持7位或10位地址 ⑤、I2C_Ack 启用或禁用应答 该参数可以是ref I2C_acknowledgement ref I2C_acknowledgement 宏定义解释 I2C_Ack_Enable 描述定义了启用I2C应答的宏。当设置为启用应答时I2C设备会在接收到数据后发送一个ACK信号表示数据已被成功接收 I2C_Ack_Disable 描述定义了禁用I2C应答的宏。当设置为禁用应答时I2C设备不会在接收到数据后发送ACK信号。这在某些特定的应用场景中可能有用例如在某些数据传输协议中不需要应答信号 宏函数 IS_I2C_ACK_STATE(STATE) 描述这是一个宏函数用于检查给定的应答状态设置是否有效参数STATE代表I2C的应答状态设置功能检查STATE是否等于I2C_Ack_Enable或I2C_Ack_Disable中的任一个返回值如果STATE有效返回1真否则返回0假 表格 宏定义值描述I2C_Ack_Enable0x0400启用I2C应答I2C_Ack_Disable0x0000禁用I2C应答 宏函数描述IS_I2C_ACK_STATE(STATE)检查STATE是否为有效的I2C应答状态设置 ⑥、I2C_AcknowledgedAddress 指定确认7位或10位地址 该参数可以是ref i2c_cogndged_address ref i2c_cogndged_address 宏定义解释 I2C_AcknowledgedAddress_7bit 描述定义了7位地址的应答配置。在I2C通信中7位地址是最常见的地址格式适用于大多数I2C设备。当设置为7位地址应答时I2C设备将识别并应答7位地址 I2C_AcknowledgedAddress_10bit 描述定义了10位地址的应答配置。10位地址提供了更大的地址空间适用于需要更多设备地址的应用场景。当设置为10位地址应答时I2C设备将识别并应答10位地址 宏函数 IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) 描述这是一个宏函数用于检查给定的应答地址设置是否有效参数ADDRESS代表I2C的应答地址设置功能检查ADDRESS是否等于I2C_AcknowledgedAddress_7bit或I2C_AcknowledgedAddress_10bit中的任一个返回值如果ADDRESS有效返回1真否则返回0假 表格 宏定义值描述I2C_AcknowledgedAddress_7bit0x40007位地址应答I2C_AcknowledgedAddress_10bit0xC00010位地址应答 宏函数描述IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS)检查ADDRESS是否为有效的I2C应答地址设置 3、I2C外设 ①、MPU6050.c #include stm32f10x.h // Device header #include MPU6050_Reg.h #include MPU6050.h#define MPU6050_ADDR 0xD0//从机地址读写位//指定地址写 void MPU6050_WriteReg(uint8_t RegAddr, uint8_t Data) {I2C_GenerateSTART(I2C2, ENABLE);//起始条件while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !SUCCESS);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Transmitter);//指定从机地址while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) !SUCCESS);//等待事件EV6I2C_SendData(I2C2, RegAddr);//指定地址while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING) !SUCCESS);//等待事件EV8I2C_SendData(I2C2, Data);//发送数据while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED) !SUCCESS);//等待事件EV8_2I2C_GenerateSTOP(I2C2, ENABLE);//停止条件 }//指定地址读 uint8_t MPU6050_ReadReg(uint8_t RegAddr) {I2C_GenerateSTART(I2C2, ENABLE);//起始条件while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !SUCCESS);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Transmitter);//指定从机地址while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) !SUCCESS);//等待事件发送EV6I2C_SendData(I2C2, RegAddr);//指定地址while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED) !SUCCESS);//等待事件EV8_2I2C_GenerateSTART(I2C2, ENABLE);//重复起始条件while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !SUCCESS);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Receiver);//指定从机--读while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) !SUCCESS);//等待事件接收EV6//接收之前要提前设置ACK0和STOP请求I2C_AcknowledgeConfig(I2C2, DISABLE);//设置ACK0I2C_GenerateSTOP(I2C2, ENABLE);//STOP请求while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED) !SUCCESS);//等待事件接收EV7uint8_t Data I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2, ENABLE);return Data; }void MPU6050_Init(void) {//初始化I2CRCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_OD;GPIO_InitStruct.GPIO_Pin GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStruct);I2C_InitTypeDef I2C_InitStruct;I2C_InitStruct.I2C_ClockSpeed 100000;//100kHz的时钟频率I2C_InitStruct.I2C_Mode I2C_Mode_I2C;I2C_InitStruct.I2C_DutyCycle I2C_DutyCycle_16_9;//仅快速适用I2C_InitStruct.I2C_Ack I2C_Ack_Enable;//启用或禁用应答I2C_InitStruct.I2C_AcknowledgedAddress I2C_AcknowledgedAddress_7bit;I2C_InitStruct.I2C_OwnAddress1 0x00;I2C_Init(I2C2, I2C_InitStruct);I2C_Cmd(I2C2, ENABLE);MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//配置电源管理寄存器1解除睡眠选择x轴的时钟MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//配置电源管理寄存器2六轴均不待机MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//采样率分频器10分频MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//滤波参数MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//陀螺仪最大量程MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度计最大量程 }void MPU6050_GetData(MPU_Data* pData) {... }uint8_t MPU6050_GetID(void) {... } 实现超时退出 #include stm32f10x.h // Device header #include MPU6050_Reg.h #include MPU6050.h#define MPU6050_ADDR 0xD0//从机地址读写位//封装MPU6050_WaitEvent函数实现超时退出 void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) {uint32_t Timeout 10000;while(I2C_CheckEvent(I2Cx, I2C_EVENT) !SUCCESS){Timeout--;if(Timeout 0){//错误处理break;}} }//指定地址写 void MPU6050_WriteReg(uint8_t RegAddr, uint8_t Data) {I2C_GenerateSTART(I2C2, ENABLE);//起始条件MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Transmitter);//指定从机地址MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待事件EV6I2C_SendData(I2C2, RegAddr);//指定地址MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING);//等待事件EV8I2C_SendData(I2C2, Data);//发送数据MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待事件EV8_2I2C_GenerateSTOP(I2C2, ENABLE);//停止条件 }//指定地址读 uint8_t MPU6050_ReadReg(uint8_t RegAddr) {I2C_GenerateSTART(I2C2, ENABLE);//起始条件MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Transmitter);//指定从机地址MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待事件发送EV6I2C_SendData(I2C2, RegAddr);//指定地址MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待事件EV8_2I2C_GenerateSTART(I2C2, ENABLE);//重复起始条件MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);//判断是否产生EV5事件I2C_Send7bitAddress(I2C2, MPU6050_ADDR, I2C_Direction_Receiver);//指定从机--读MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//等待事件接收EV6//接收之前要提前设置ACK0和STOP请求I2C_AcknowledgeConfig(I2C2, DISABLE);//设置ACK0I2C_GenerateSTOP(I2C2, ENABLE);//STOP请求MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED);//等待事件接收EV7uint8_t Data I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2, ENABLE);return Data; } ... ...
http://www.dnsts.com.cn/news/25171.html

相关文章:

  • 客户网站建设确认书做网站不会写代码
  • 个人网站创建平台要多少钱建设本地网站 配置iis
  • 网站logo显示wordpress文章列表摘要
  • 公司网站建设工作计划网站建设试用
  • 网站推广计划书十大免费视频素材网
  • 用cms建网站江西人才招聘网官网
  • 淘宝客网站怎么做视频wordpress买域名
  • php做电影网站推广引流渠道有哪些
  • 国内做网站大公司有哪些wordpress商城 淘宝客
  • 吴江规划建设局网站创建全国文明城市的宗旨是什么
  • 高中教做网站的软件微网站建设哪家好
  • 定制化网站开发的好处从化定制型网站建设
  • 做网站的宽度为多少钱服务器在哪里
  • 网站建设企业开发建设工程规划许可证查询网站
  • 进网站备案wordpress主题付费
  • 廊坊网站建设的公司成都网站建设 公司
  • 聊城网站开发个人福建住建设厅官方网站
  • 表白网站怎么做wordpress只显示文章标题摘要
  • 网站建设质量管理定义wordpress保存文件
  • 锤子 网站 模版网站开发工程师需要哪些技术
  • 深圳网站建设公司信息商河做网站多少钱
  • 织梦网站被黑wordpress猜你喜欢功能
  • 网站建设及推广好做吗公司内部网站模板
  • 乐山做网站东莞营销网站建设直播
  • 大连市城市建设投资集团网站推广链接怎么制作
  • 做网站都需要什么资料百度搜索首页
  • 免费ppt模板 网站开发网页加速器免费永久
  • 北京海淀网站制作公司襄阳seo优化排名
  • 经典网站设计欣赏淘宝刷单网站建设
  • 一个网站如何优化凡客设计