int8u_t CY; uint8_t OutData1=0; uint8_t DataFlag=0; uint8_t OutData[]; /* Private function prototypes -----------------------------------------------*/ void I2C_Start(void); uint8_t I2C_RecvACK(); void I2C_SendACK(uint8_t ack); void I2C_SendByte(uint8_t dat); uint8_t I2C_RecvByte(); void I2C_Stop(); void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data); uint8_t Single_ReadI2C(uint8_t REG_Address); uint16_t GetData(uint8_t REG_Address); void InitMPU6050(); void Delay(); void Delay2(uint16_t nCount); void Usart_Tx(void); //************************************** //I2C起始信号 //************************************** void I2C_Start(void) { GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);//set SDA pin as output high Delay(); GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Slow);//set SDA pin as output low Delay(); GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow);//set SDA pin as output low } //************************************** //I2C接收应答信号 //************************************** uint8_t I2C_RecvACK() { GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT); //set sda as input with pull up Delay(); if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)) {
CY=1; } else CY=0; GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //set SCL pin as output low Delay(); return CY; } //************************************** //I2C发送应答信号 //入口参数:ack (0:ACK 1:NAK) //************************************** void I2C_SendACK(uint8_t ack) { if (ack==1) { GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);//set SDA pin as output high } else { GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Slow);//set SDA pin as output low } GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay(); //延时 GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //set SCL pin as output low Delay(); //延时 } //************************************** //向I2C总线发送一个字节数据 //************************************** void I2C_SendByte(uint8_t dat) { uint8_t i; for (i=0; i<8; i++) //8位计数器 { if (dat&0x80) { GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);//set SDA pin as output high } else
{ GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Slow);//set SDA pin as output low } dat <<= 1; //移出数据的最高位 GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay(); GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //set SCL pin as output low Delay(); } I2C_RecvACK(); } //************************************** //从I2C总线接收一个字节数据 //************************************** uint8_t I2C_RecvByte() { uint8_t i; uint8_t dat = 0; GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);//set SDA pin as output high //使能内部上拉,准备读取数据, GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT); //set sda as input with pull up for (i=0; i<8; i++) //8位计数器 { dat <<= 1; GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay(); //延时 if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)) { dat|=0x01; } else dat|=0; GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //set SCL pin as output low Delay(); //延时 } return dat; } //************************************** //I2C停止运行
// //************************************** void I2C_Stop() { GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Slow);//set SDA pin as output low GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay();; GPIO_Init(GPIOC,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay(); }
//************************************** //向I2C设备写入一个字节数据 //************************************** void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data) { I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //内部寄存器地址, I2C_SendByte(REG_data); //内部寄存器数据, I2C_Stop(); //发送停止信号 } //************************************** //从I2C设备读取一个字节数据 //************************************** uint8_t Single_ReadI2C(uint8_t REG_Address) { uint8_t REG_data; I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress|0x01); //发送设备地址+读信号 REG_data=I2C_RecvByte(); //读出寄存器数据 I2C_SendACK(1); //接收应答信号 I2C_Stop(); //停止信号 return REG_data; } /** * @brief Mpu6050int program. * @param None * @retval None
*/
void InitMPU6050() { Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态 Single_WriteI2C(SMPLRT_DIV, 0x07); Single_WriteI2C(CONFIG, 0x06); Single_WriteI2C(GYRO_CONFIG, 0x18); Single_WriteI2C(ACCEL_CONFIG, 0x01); } //************************************** //合成数据 //************************************** uint16_t GetData(uint8_t REG_Address) { uint8_t H,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return (H<<8)|L; //合成数据 } /*//************************************** //通过串口发送指定数据 //************************************** void Usart_Tx(void) { while((USART1->SR&0x80)==0x00); USART_SendData8(USART1,DataFlag); //USART_ClearITPendingBit(USART1,USART_IT_TXE); while((USART1->SR&0x80)==0x00); USART_SendData8(USART1,OutData1); //USART_ClearITPendingBit(USART1,USART_IT_TXE); }*/ //************************************** //主函数 //************************************** void main(void) { // uint8_t data2; uint8_t i=0; /* High speed external clock prescaler: 1*/ CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //USART 默认PC2,PC3影射到 PA2 PA3;
SYSCFG_REMAPDeInit(); SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE); CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE); //usart 设置 USART_Init(USART1, (uint32_t)9600, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Tx | USART_Mode_Rx); /* Enable general interrupts */ enableInterrupts(); /* Enable the USART Receive interrupt: this interrupt is generated when the USART receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Enable USART */ USART_Cmd(USART1, ENABLE); InitMPU6050(); while (1) { //Delay2(0x000f); /*switch(i) { case 0:OutData=Single_ReadI2C(ACCEL_XOUT_H); DataFlag=0XA1; Usart_Tx(); break; case 1:OutData=Single_ReadI2C(ACCEL_XOUT_L); DataFlag=0XA2; Usart_Tx(); break; case 2:OutData=Single_ReadI2C(ACCEL_YOUT_H); DataFlag=0XB1; Usart_Tx(); break; case 3:OutData=Single_ReadI2C(ACCEL_YOUT_L); DataFlag=0XB2; Usart_Tx(); break; case 4:OutData=Single_ReadI2C(ACCEL_ZOUT_H); DataFlag=0XC1; Usart_Tx(); break; case 5:OutData=Single_ReadI2C(ACCEL_ZOUT_L); DataFlag=0XC2; Usart_Tx(); break;
case 6:OutData=Single_ReadI2C(GYRO_XOUT_H); DataFlag=0XA3; Usart_Tx(); break; case 7:OutData=Single_ReadI2C(GYRO_XOUT_L); DataFlag=0XA4; Usart_Tx(); break; case 8:OutData=Single_ReadI2C(GYRO_YOUT_H); DataFlag=0XB3; Usart_Tx(); break; case 9:OutData=Single_ReadI2C(GYRO_YOUT_L); DataFlag=0XB4; Usart_Tx(); break; case 10:OutData=Single_ReadI2C(GYRO_ZOUT_H); DataFlag=0XC3; Usart_Tx(); break; case 11:OutData=Single_ReadI2C(GYRO_ZOUT_L); DataFlag=0XC4; Usart_Tx(); break; }*/ OutData[0]=0XA1; OutData[1]=Single_ReadI2C(ACCEL_XOUT_H); //读取陀螺仪X轴高八位数据 OutData[2]=0XA2; OutData[3]=Single_ReadI2C(ACCEL_XOUT_L); //读取陀螺仪X轴低八位数据 OutData[4]=0XB1; OutData[5]=Single_ReadI2C(ACCEL_YOUT_H);//读取陀螺仪Y轴高八位数据 OutData[6]=0XB2; OutData[7]=Single_ReadI2C(ACCEL_YOUT_L); //读取陀螺仪Y轴低八位数据 OutData[8]=0XC1; OutData[9]=Single_ReadI2C(ACCEL_ZOUT_H); //读取陀螺仪Z轴高八位数据 OutData[10]=0XC2; OutData[11]=Single_ReadI2C(ACCEL_ZOUT_L); //读取陀螺仪Z轴低八位数据 OutData[12]=0XA3; OutData[13]=Single_ReadI2C(GYRO_XOUT_H);//读取加速计X轴高八位数据
OutData[14]=0XA4; OutData[15]=Single_ReadI2C(GYRO_XOUT_L); //读取加速计X轴低八位数据 OutData[16]=0XB3; OutData[17]=Single_ReadI2C(GYRO_YOUT_H); //读取加速计Y轴高八位数据 OutData[18]=0XB4; OutData[19]=Single_ReadI2C(GYRO_YOUT_L);//读取加速计Y轴低八位数据 OutData[20]=0XC3; OutData[21]=Single_ReadI2C(GYRO_ZOUT_H);//读取加速计Z轴高八位数据 OutData[22]=0XC4; OutData[23]=Single_ReadI2C(GYRO_ZOUT_L);//读取加速计Z轴低八位数据 for(i=0;i<24;i++) { while((USART1->SR&0x80)==0x00); USART_SendData8(USART1,OutData[i]); } //Delay2(0x000f); // i++; //if(i>11) //i=0; } } //************************************** //I2C延时函数 //************************************** void Delay(void) { nop(); nop(); nop(); nop(); nop(); nop(); } //************************************** //延时函数 //************************************** void Delay2(uint16_t nCount) { unsigned int j=0,i=0;
for(;i
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务