在线时间56 小时
UID3297826
注册时间2016-7-27
NXP金币0
TA的每日心情 | 开心 2017-1-13 17:13 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
中级会员
- 积分
- 494
- 最后登录
- 2018-1-6
|
本帖最后由 191925882 于 2016-12-20 10:53 编辑
学校:汕头大学 队员:2人
二.工程介绍
由于手里有块飞控板,就把里面的程序擦除掉,外接IIC到lpc824lite上面,现在读取ID正常。数据也正常。希望这个工程能帮助大家。可以结合我上一篇来做个水平仪或者通过一个好一点的滤波程序做一个3D显示模型。都是很有趣的。
接下来上传图片:
ID都已读正确:
mpu6050代码:
- #include "IIC.h"
- #include "mpu6050.h"
- //#include <stdint.h>
-
- int32_t jiasuji[3],tuoluoyi[3];
- //³õʼ»¯mpu6050
- unsigned char bu[1];
- void mpu6050_init(void)
- {
- I2C_Write(LSM6DS3,CTRL1_XL,0x46);
- I2C_Write(LSM6DS3,CTRL2_G,0x4C);
- I2C_Write(LSM6DS3,CTRL9_XL,0x38);
- I2C_Write(LSM6DS3,CTRL10_C,0x38);
- bu[0]=I2C_Read(LSM6DS3,WHO_AM_I);
- }
- void mpu6050_read(void)
- {
-
- uint8_t buf[15];
- buf[0]=I2C_Read(LSM6DS3,OUTX_H_XL);
- buf[1]=I2C_Read(LSM6DS3,OUTX_L_XL);
- buf[2]=I2C_Read(LSM6DS3,OUTY_H_XL);
- buf[3]=I2C_Read(LSM6DS3,OUTY_L_XL);
- buf[4]=I2C_Read(LSM6DS3,OUTZ_H_XL);
- buf[5]=I2C_Read(LSM6DS3,OUTZ_L_XL);
- buf[6]=I2C_Read(LSM6DS3,OUT_TEMP_H);
- buf[7]=I2C_Read(LSM6DS3,OUT_TEMP_L);
- buf[8]=I2C_Read(LSM6DS3,OUTX_H_G);
- buf[9]=I2C_Read(LSM6DS3,OUTX_L_G);
- buf[10]=I2C_Read(LSM6DS3,OUTY_H_G);
- buf[11]=I2C_Read(LSM6DS3,OUTY_L_G);
- buf[12]=I2C_Read(LSM6DS3,OUTZ_H_G);
- buf[13]=I2C_Read(LSM6DS3,OUTZ_L_G);
- jiasuji[0]=(unsigned long)buf[0]<<8|(unsigned long)buf[1];
- jiasuji[1]=(unsigned long)buf[2]<<8|(unsigned long)buf[3];
- jiasuji[2]=(unsigned long)buf[4]<<8|(unsigned long)buf[5];
-
- tuoluoyi[0]=(unsigned long)buf[8]<<8|(unsigned long)buf[9];
- tuoluoyi[1]=(unsigned long)buf[10]<<8|(unsigned long)buf[11];
- tuoluoyi[2]=(unsigned long)buf[12]<<8|(unsigned long)buf[13];
- }
复制代码 mpu6050.h
- #ifndef MPU6050_H_
- #define MPU6050_H_
- #include <stdint.h>
- //LSM6DS3
- //Ò»°ãµÄÅäÖÃ
- #define LSM6DS3 0X6A //SA0½ÓµØʱµÄ´Ó»úµØÖ·
- #define CTRL1_XL 0X10
- #define CTRL2_G 0X11
- #define CTRL9_XL 0X18
- #define CTRL10_C 0X19
- #define STATUS_REG 0X1E
- #define CTRL5_C 0X14
- #define INT1_CTRL 0X0D
- #define WHO_AM_I 0X0F
- //ÍÓÂÝÒǺͼÓËÙ¼ÆÊý¾Ý¼Ä´æÆ÷
- #define OUTX_L_G 0X22
- #define OUTX_H_G 0X23
- #define OUTY_L_G 0X24
- #define OUTY_H_G 0X25
- #define OUTZ_L_G 0X26
- #define OUTZ_H_G 0X27
- #define OUTX_L_XL 0X28
- #define OUTX_H_XL 0X29
- #define OUTY_L_XL 0X2A
- #define OUTY_H_XL 0X2B
- #define OUTZ_L_XL 0X2C
- #define OUTZ_H_XL 0X2D
- #define OUT_TEMP_L 0X20
- #define OUT_TEMP_H 0X21
- #define MPU6050_GYR_GAIN 0.00106f
- void mpu6050_init(void);
- void mpu6050_read(void);
- const int16_t *mpu6050_getRamSpf(void);
- int16_t mpu6050_getRamTem(void);
- const int16_t * mpu6050_getRamOmg(void);
- extern int32_t jiasuji[3],tuoluoyi[3];
- #endif
复制代码 IIC.c
- #include "IIC.h"
- //Ç°ÃæµÄIICºê¶¨Òå
- #include "LSM6DS3.h"
- #include <stdint.h>
- #define SDA_High Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 10, true)
- #define SDA_Low Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 10, false)
- #define SCL_High Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 11, true)
- #define SCL_Low Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 11, false)
- #define SDA_OUT Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 10, 1)
- #define SDA_IN Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 10, 0)
- #define SDA_State Chip_GPIO_PinGetState(LPC_GPIO_PORT, 0, 10)
- //¶¨ÒåÆ÷¼þµØÖ·
- //¶¨ÒåһЩÒý½Å
- void IIC_init(void)
- {
- /*SDA*/
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 10, 1);//set PIO12 output
- SDA_High; //set PIO12 high logic
- /*SCL*/
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 11, 1);//set PIO13 output
- SCL_High; //set PIO13 high logic
- Board_UARTPutSTR("IIC initialize is OK!\r\n");
- Board_UARTPutSTR("IIC initialize is OK!\r\n");
- DelayMs(10);
- }
- void I2C_delay(void)
- {
- uint8_t i=3; //ÕâÀï¿ÉÒÔÓÅ»¯ËÙ¶È £¬¾²âÊÔ×îµÍµ½5»¹ÄÜдÈë
- while(i)
- {
- i--;
- }
- }
- /*Delay for 15 usÑÓʱ*/
- void IIC_Delay(void)
- {
- uint8_t t=15;
- while( t-- );
- }
- /*The start signal of IIC BUS*/
- void IIC_Start(void)
- {
-
- /*SDA=1*/SDA_High;
- /*SCL=1*/SCL_High;
- IIC_Delay();
- /*SDA=0*/SDA_Low;
- IIC_Delay();
- /*SCL=0*/SCL_Low;
- IIC_Delay();
- }
- /*The stop signal of IIC BUS*/
- void IIC_Stop(void)
- {
- // SDA_Low;
- SCL_Low;
- IIC_Delay();
- SDA_Low;
- IIC_Delay();
- SCL_High;
- IIC_Delay();
- SDA_High;
- IIC_Delay();
-
- }
- /*The respons signal of IIC BUS*/
- void IIC_Ack(void)
- {
- SCL_Low;
- IIC_Delay();
- SDA_Low;
- IIC_Delay();
- SCL_High;
- IIC_Delay();
- SCL_Low;
- IIC_Delay();
- }
- /*The norespons signal of IIC BUS*/
- void IIC_NoAck(void)
- {
-
- SCL_Low;
- IIC_Delay();
- SDA_High;
- IIC_Delay();
- SCL_High;
- IIC_Delay();
- SCL_Low;
- IIC_Delay();
- }
- /*Send One Byte by IIC BUS*/
- void IIC_SendByte(uint8_t data)
- {
-
- uint8_t i=8;
- while(i--)
- {
- SCL_Low;
- if(data&0x80)
- SDA_High;
- else
- SDA_Low;
- data<<=1;
- IIC_Delay();
- SCL_High;
- IIC_Delay();
- }
- SCL_Low;
- // IIC_Delay();
- // SDA_High;
- // IIC_Delay();
- //
- // SCL_High;
- // IIC_Delay();
- //
- // SCL_Low;
- }
- /*Read One Byte by IIC BUS*/
- uint8_t I2C_ReceiveByte(void)
- {
- uint8_t i=8;
- uint8_t ReceiveByte=0;
- SDA_High;
- // SDA_IN;
- while(i--)
- {
- ReceiveByte<<=1;
- SCL_Low;
- IIC_Delay();
- SCL_High;
- IIC_Delay();
-
- if(SDA_State)
- {
- ReceiveByte|=0x01;
- }
- }
- // SDA_OUT;
- SCL_Low;
- return ReceiveByte;
- }
- /*
- * I2C_WriteReg
- * дI2CÉ豸¼Ä´æÆ÷
- */
- void I2C_Write(uint8_t dev_addr,uint8_t reg_addr , uint8_t data)
- {
- IIC_Start();
- IIC_Delay();
- IIC_SendByte(dev_addr<<1);
- IIC_Delay();
- IIC_SendByte(reg_addr );
- IIC_Delay();
- IIC_SendByte(data);
- IIC_Delay();
- IIC_Stop();
- }
- //¶ÁÒ»¸öbufµÄÊý¾Ý
- uint8_t I2C_Read(uint8_t dev_addr,uint8_t reg_addr)
- {
- uint8_t data;
- IIC_Start();
- IIC_SendByte( dev_addr<<1);
- IIC_SendByte( reg_addr );
- IIC_Start();
- IIC_SendByte((dev_addr<<1)+1);
- data= I2C_ReceiveByte();
- IIC_NoAck();
- IIC_Stop();
- return data;
- }
- uint8_t I2C_Read_Buf(uint8_t sla_address, uint8_t sub_address,uint8_t *buf,uint8_t len)
- { int i = 0;
- uint8_t data;
- IIC_Start();
- IIC_SendByte( sla_address<<1);
- IIC_SendByte( sub_address );
- IIC_Start();
- IIC_SendByte((sla_address<<1)+1);
-
-
- for(i=0;i<len-1;i++)
- {
- buf[i] = I2C_ReceiveByte();
- IIC_Ack();
- }
- buf[i] = I2C_ReceiveByte();
-
- IIC_NoAck();
- IIC_Stop();
- return 1;
- }
- //¸ßλºÍµØλºÏ²¢
- int16_t I2C_ReadWord(uint8_t dev_addr,uint8_t reg_addr)
- {
- char h,l;
- IIC_Start();
- IIC_SendByte( dev_addr<<1);
- IIC_SendByte( reg_addr);
- IIC_Start();
- IIC_SendByte((dev_addr<<1)+1);
- h= I2C_ReceiveByte();
- IIC_Ack();
- l= I2C_ReceiveByte();
- IIC_NoAck();
- IIC_Stop();
- return (h<<8)+l;
- }
-
- void DelayMs(uint16_t ms)
- {
- uint16_t i=0;
- while(ms--)
- {
- i=5000;
- while(i--) ;
- }
- }
复制代码 iic.h
- #ifndef __IIC_H_
- #define __IIC_H_
- #include "chip.h"
- #include "board.h"
- uint8_t I2C_ReceiveByte(void);
- void I2C_WriteReg(uint8_t dev_addr,uint8_t reg_addr , uint8_t data);
- uint8_t IIC_ReadByte(uint8_t dev_addr,uint8_t reg_addr);
- int16_t I2C_ReadWord(uint8_t dev_addr,uint8_t reg_addr);
- uint8_t I2C_Read(uint8_t dev_addr,uint8_t reg_addr);
- void I2C_Write(uint8_t dev_addr,uint8_t reg_addr , uint8_t data);
- uint8_t IIC_Read_Buf(uint8_t sla_address, uint8_t sub_address,uint8_t *buf,uint8_t len);
- void I2C_ReadGryo(uint8_t dev_addr,uint8_t reg_addr,int16_t *x,int16_t *y);
- void DelayMs(uint16_t ms);
- #endif
复制代码
|
|