├── EEPROM ├── EEPROM.c ├── EEPROM.h ├── I2C_drv.c └── I2C_drv.h ├── MCP4822 ├── MCP4822.c └── MCP4822.h ├── MPU9250-MPU6050 ├── IOI2C.c ├── IOI2C.h ├── MPU9250_api.h ├── PS-MPU-9250A-01.pdf ├── RM-MPU-9250A-00.pdf ├── dmp.c ├── dmp.h └── readme.md └── readme.md /EEPROM/EEPROM.c: -------------------------------------------------------------------------------- 1 | #define _EEPROM_C_ 2 | 3 | 4 | #include "stm32f10x.h" 5 | 6 | #include "I2c_drv.h" 7 | 8 | #include "main.h" 9 | 10 | #include "EEPROM.h" 11 | 12 | #define GPIO_I2C_WP GPIOA 13 | #define GPIO_PIN_I2C_WP GPIO_Pin_12 14 | 15 | 16 | void EEPROM_Read_Config(void) 17 | { 18 | I2C_ReadReg(EEPROM_Data, 0xA0, 0x00, 32); 19 | } 20 | 21 | void EEPROM_Write_Config(void) 22 | { 23 | uint8_t i; 24 | 25 | GPIO_WriteBit(GPIO_I2C_WP, GPIO_PIN_I2C_WP, Bit_RESET); 26 | 27 | for(i=0; i<4; i++) 28 | { 29 | I2C_WriteReg(EEPROM_Data+i*8, 0xA0, 0x00+i*8, 8); // write page 8Byte 30 | SysDelay(40000); 31 | } 32 | 33 | GPIO_WriteBit(GPIO_I2C_WP, GPIO_PIN_I2C_WP, Bit_SET); 34 | } 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /EEPROM/EEPROM.h: -------------------------------------------------------------------------------- 1 | #ifndef _EEPROM_H_ 2 | #define _EEPROM_H_ 3 | 4 | #ifdef _EEPROM_C_ 5 | #define _EEPROM_EXT_ 6 | #else 7 | #define _EEPROM_EXT_ extern 8 | #endif 9 | 10 | _EEPROM_EXT_ uint8_t EEPROM_Data[32]; 11 | _EEPROM_EXT_ void EEPROM_Read_Config(void); 12 | _EEPROM_EXT_ void EEPROM_Write_Config(void); 13 | 14 | #endif 15 | 16 | -------------------------------------------------------------------------------- /EEPROM/I2C_drv.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AnswerInTheWind/Peripheral/1437578970a4f944135a571cd5f491a8cc2a4cdd/EEPROM/I2C_drv.c -------------------------------------------------------------------------------- /EEPROM/I2C_drv.h: -------------------------------------------------------------------------------- 1 | #ifndef _I2C_DRV_H_ 2 | #define _I2C_DRV_H_ 3 | 4 | #ifdef _I2C_DRV_C_ 5 | #define _I2CDRVEXT_ 6 | #else 7 | #define _I2CDRVEXT_ extern 8 | #endif 9 | 10 | 11 | 12 | /************************************************************ 13 | Exern Function Setction 14 | *************************************************************/ 15 | _I2CDRVEXT_ void I2C_DrvInit(void); 16 | _I2CDRVEXT_ void I2Cm_Start(void); 17 | _I2CDRVEXT_ void I2Cm_Stop(void); 18 | _I2CDRVEXT_ void I2Cm_WaitAck(void); 19 | _I2CDRVEXT_ void I2Cm_Ack(void); 20 | _I2CDRVEXT_ void I2Cm_nAck(void); 21 | _I2CDRVEXT_ void I2Cm_TxData(uint8_t i2c_data); 22 | _I2CDRVEXT_ uint8_t I2Cm_RxData(void); 23 | _I2CDRVEXT_ void I2C_WriteReg(uint8_t* Data, uint8_t I2C_Addr, uint8_t I2C_Reg, uint8_t Num); 24 | _I2CDRVEXT_ void I2C_ReadReg(uint8_t* Data, uint8_t I2C_Addr, uint8_t I2C_Reg, uint8_t Num); 25 | 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /MCP4822/MCP4822.c: -------------------------------------------------------------------------------- 1 | #define _MCP4822_C_ 2 | 3 | #include "stm32f10x.h" 4 | 5 | #include "MCP4822.h" 6 | 7 | 8 | #define EN_LDAC 0 9 | 10 | #if EN_LDAC 11 | 12 | #define GPIO_MCP4822_LDAC GPIOC 13 | #define GPIO_Pin_MCP4822_LDAC GPIO_Pin_1 14 | 15 | #endif 16 | 17 | #define GPIO_MCP4822_CE GPIOA 18 | #define GPIO_Pin_MCP4822_CE GPIO_Pin_9 19 | 20 | #define GPIO_MCP4822_SCK GPIOA 21 | #define GPIO_Pin_MCP4822_SCK GPIO_Pin_8 22 | 23 | #define GPIO_MCP4822_SDI GPIOC 24 | #define GPIO_Pin_MCP4822_SDI GPIO_Pin_9 25 | 26 | 27 | void MCP4822_Delay(void) 28 | { 29 | uint32_t i = 1000; 30 | 31 | while(i--) 32 | { 33 | } 34 | } 35 | 36 | 37 | 38 | void MCP4822_Proc(uint8_t Channel, uint8_t Gain, uint8_t OutEnable, uint16_t Value) 39 | { 40 | uint16_t Data; 41 | uint8_t i; 42 | 43 | if(Channel == MCP4822_CHANNEL_A) 44 | { 45 | Data = 0; 46 | } 47 | else 48 | { 49 | Data = 0x8000; 50 | } 51 | 52 | if(Gain == MCP4822_GAIN_1X) 53 | { 54 | Data |= 0x2000; 55 | } 56 | 57 | if(OutEnable == MCP4822_OUTENABLE) 58 | { 59 | Data |= 0x1000; 60 | } 61 | 62 | Data |= (Value & 0x0FFF); 63 | 64 | #if EN_LDAC 65 | GPIO_WriteBit(GPIO_MCP4822_LDAC, GPIO_Pin_MCP4822_LDAC, Bit_SET); 66 | MCP4822_Delay(); 67 | #endif 68 | 69 | GPIO_WriteBit(GPIO_MCP4822_CE, GPIO_Pin_MCP4822_CE, Bit_RESET); 70 | MCP4822_Delay(); 71 | GPIO_WriteBit(GPIO_MCP4822_SCK, GPIO_Pin_MCP4822_SCK, Bit_RESET); 72 | MCP4822_Delay(); 73 | 74 | for(i=0; i<16; i++) 75 | { 76 | if(Data&(0x8000>>i)) 77 | { 78 | GPIO_WriteBit(GPIO_MCP4822_SDI, GPIO_Pin_MCP4822_SDI, Bit_SET); 79 | } 80 | else 81 | { 82 | GPIO_WriteBit(GPIO_MCP4822_SDI, GPIO_Pin_MCP4822_SDI, Bit_RESET); 83 | } 84 | MCP4822_Delay(); 85 | GPIO_WriteBit(GPIO_MCP4822_SCK, GPIO_Pin_MCP4822_SCK, Bit_SET); 86 | MCP4822_Delay(); 87 | GPIO_WriteBit(GPIO_MCP4822_SCK, GPIO_Pin_MCP4822_SCK, Bit_RESET); 88 | } 89 | 90 | MCP4822_Delay(); 91 | GPIO_WriteBit(GPIO_MCP4822_CE, GPIO_Pin_MCP4822_CE, Bit_SET); 92 | MCP4822_Delay(); 93 | 94 | #if EN_LDAC 95 | GPIO_WriteBit(GPIO_MCP4822_LDAC, GPIO_Pin_MCP4822_LDAC, Bit_RESET); 96 | MCP4822_Delay(); 97 | GPIO_WriteBit(GPIO_MCP4822_LDAC, GPIO_Pin_MCP4822_LDAC, Bit_SET); 98 | MCP4822_Delay(); 99 | #endif 100 | } 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /MCP4822/MCP4822.h: -------------------------------------------------------------------------------- 1 | #ifndef _MCP4822_H_ 2 | #define _MCP4822_H_ 3 | 4 | #ifdef _MCP4822_C_ 5 | #define _MCP4822_EXT_ 6 | #else 7 | #define _MCP4822_EXT_ extern 8 | #endif 9 | 10 | #define MCP4822_CHANNEL_A 0 11 | #define MCP4822_CHANNEL_B 1 12 | 13 | #define MCP4822_GAIN_1X 0 14 | #define MCP4822_GAIN_2X 1 15 | 16 | #define MCP4822_OUTDISABLE 0 17 | #define MCP4822_OUTENABLE 1 18 | 19 | _MCP4822_EXT_ void MCP4822_Proc(uint8_t Channel, uint8_t Gain, uint8_t OutEnable, uint16_t Value); 20 | 21 | 22 | 23 | #endif 24 | 25 | -------------------------------------------------------------------------------- /MPU9250-MPU6050/IOI2C.c: -------------------------------------------------------------------------------- 1 | #include "IOI2C.h" 2 | 3 | #define TRUE 1 4 | #define FALSE 0 5 | 6 | static uint8_t IIC_Start(void); 7 | static void IIC_Stop(void); 8 | static void IIC_Send_Byte(uint8_t txd); 9 | static uint8_t IIC_Read_Byte(void); 10 | static uint8_t IIC_Wait_Ack(void); 11 | static void IIC_Ack(void); 12 | static void IIC_NAck(void); 13 | 14 | /**************************实现函数******************************************** 15 | *函数原型: void IIC_Init(void) 16 | *功  能: 初始化I2C对应的接口引脚。 17 | *******************************************************************************/ 18 | void IIC_Init(void) 19 | { 20 | GPIO_InitTypeDef GPIO_InitStruct; 21 | /* -1- Enable GPIOB Clock (to be able to program the configuration registers) */ 22 | __GPIOB_CLK_ENABLE(); 23 | 24 | GPIO_InitStruct.Pin = GPIO_PIN_9;// SDA 25 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; 26 | GPIO_InitStruct.Pull = GPIO_PULLUP; 27 | GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; 28 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 29 | 30 | GPIO_InitStruct.Pin = GPIO_PIN_8;//SCL 31 | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; 32 | GPIO_InitStruct.Pull = GPIO_PULLUP; 33 | GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; 34 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 35 | } 36 | 37 | void IIC_Analog(void) 38 | { 39 | GPIO_InitTypeDef GPIO_InitStructure; 40 | 41 | GPIO_InitStructure.Pin = GPIO_PIN_9; 42 | GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; 43 | GPIO_InitStructure.Pull = GPIO_NOPULL; 44 | HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); 45 | 46 | GPIO_InitStructure.Pin = GPIO_PIN_8; 47 | GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; 48 | GPIO_InitStructure.Pull = GPIO_NOPULL; 49 | 50 | HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); 51 | } 52 | 53 | static void IIC_delay(void) 54 | { 55 | uint8_t i=5; 56 | while(i) 57 | { 58 | i--; 59 | } 60 | } 61 | 62 | void Delay_ms(uint32_t xms) 63 | { 64 | uint32_t start_time = HAL_GetTick(); 65 | while(HAL_GetTick() - start_time 5 | 6 | /********************************************************************** 7 | *Define 8 | ************************************************************************/ 9 | 10 | /************MPU 9250********************/ 11 | #define MPU9250_INT_PORT GPIOA 12 | #define MPU9250_INT_PIN GPIO_PIN_15 13 | 14 | /************Reg ***********************/ 15 | #define MPU9250_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD 16 | #define MPU9250_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD 17 | #define MPU9250_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD 18 | #define MPU9250_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN 19 | #define MPU9250_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN 20 | #define MPU9250_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN 21 | #define MPU9250_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS 22 | #define MPU9250_RA_XA_OFFS_L_TC 0x07 23 | #define MPU9250_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS 24 | #define MPU9250_RA_YA_OFFS_L_TC 0x09 25 | #define MPU9250_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS 26 | #define MPU9250_RA_ZA_OFFS_L_TC 0x0B 27 | #define MPU9250_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR 28 | #define MPU9250_RA_XG_OFFS_USRL 0x14 29 | #define MPU9250_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR 30 | #define MPU9250_RA_YG_OFFS_USRL 0x16 31 | #define MPU9250_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR 32 | #define MPU9250_RA_ZG_OFFS_USRL 0x18 33 | #define MPU9250_RA_SMPLRT_DIV 0x19 34 | #define MPU9250_RA_CONFIG 0x1A 35 | #define MPU9250_RA_GYRO_CONFIG 0x1B 36 | #define MPU9250_RA_ACCEL_CONFIG 0x1C 37 | #define MPU9250_RA_ACCEL_CONFIG_2 0x1D 38 | #define MPU9250_RA_LP_ACCEL_ODR 0x1E 39 | #define MPU9250_RA_MOT_THR 0x1F 40 | #define MPU9250_RA_MOT_DUR 0x20 41 | #define MPU9250_RA_ZRMOT_THR 0x21 42 | #define MPU9250_RA_ZRMOT_DUR 0x22 43 | #define MPU9250_RA_FIFO_EN 0x23 44 | #define MPU9250_RA_I2C_MST_CTRL 0x24 45 | #define MPU9250_RA_I2C_SLV0_ADDR 0x25 46 | #define MPU9250_RA_I2C_SLV0_REG 0x26 47 | #define MPU9250_RA_I2C_SLV0_CTRL 0x27 48 | #define MPU9250_RA_I2C_SLV1_ADDR 0x28 49 | #define MPU9250_RA_I2C_SLV1_REG 0x29 50 | #define MPU9250_RA_I2C_SLV1_CTRL 0x2A 51 | #define MPU9250_RA_I2C_SLV2_ADDR 0x2B 52 | #define MPU9250_RA_I2C_SLV2_REG 0x2C 53 | #define MPU9250_RA_I2C_SLV2_CTRL 0x2D 54 | #define MPU9250_RA_I2C_SLV3_ADDR 0x2E 55 | #define MPU9250_RA_I2C_SLV3_REG 0x2F 56 | #define MPU9250_RA_I2C_SLV3_CTRL 0x30 57 | #define MPU9250_RA_I2C_SLV4_ADDR 0x31 58 | #define MPU9250_RA_I2C_SLV4_REG 0x32 59 | #define MPU9250_RA_I2C_SLV4_DO 0x33 60 | #define MPU9250_RA_I2C_SLV4_CTRL 0x34 61 | #define MPU9250_RA_I2C_SLV4_DI 0x35 62 | #define MPU9250_RA_I2C_MST_STATUS 0x36 63 | #define MPU9250_RA_INT_PIN_CFG 0x37 64 | #define MPU9250_RA_INT_ENABLE 0x38 65 | #define MPU9250_RA_DMP_INT_STATUS 0x39 66 | #define MPU9250_RA_INT_STATUS 0x3A 67 | #define MPU9250_RA_ACCEL_XOUT_H 0x3B 68 | #define MPU9250_RA_ACCEL_XOUT_L 0x3C 69 | #define MPU9250_RA_ACCEL_YOUT_H 0x3D 70 | #define MPU9250_RA_ACCEL_YOUT_L 0x3E 71 | #define MPU9250_RA_ACCEL_ZOUT_H 0x3F 72 | #define MPU9250_RA_ACCEL_ZOUT_L 0x40 73 | #define MPU9250_RA_TEMP_OUT_H 0x41 74 | #define MPU9250_RA_TEMP_OUT_L 0x42 75 | #define MPU9250_RA_GYRO_XOUT_H 0x43 76 | #define MPU9250_RA_GYRO_XOUT_L 0x44 77 | #define MPU9250_RA_GYRO_YOUT_H 0x45 78 | #define MPU9250_RA_GYRO_YOUT_L 0x46 79 | #define MPU9250_RA_GYRO_ZOUT_H 0x47 80 | #define MPU9250_RA_GYRO_ZOUT_L 0x48 81 | #define MPU9250_RA_EXT_SENS_DATA_00 0x49 82 | #define MPU9250_RA_EXT_SENS_DATA_01 0x4A 83 | #define MPU9250_RA_EXT_SENS_DATA_02 0x4B 84 | #define MPU9250_RA_EXT_SENS_DATA_03 0x4C 85 | #define MPU9250_RA_EXT_SENS_DATA_04 0x4D 86 | #define MPU9250_RA_EXT_SENS_DATA_05 0x4E 87 | #define MPU9250_RA_EXT_SENS_DATA_06 0x4F 88 | #define MPU9250_RA_EXT_SENS_DATA_07 0x50 89 | #define MPU9250_RA_EXT_SENS_DATA_08 0x51 90 | #define MPU9250_RA_EXT_SENS_DATA_09 0x52 91 | #define MPU9250_RA_EXT_SENS_DATA_10 0x53 92 | #define MPU9250_RA_EXT_SENS_DATA_11 0x54 93 | #define MPU9250_RA_EXT_SENS_DATA_12 0x55 94 | #define MPU9250_RA_EXT_SENS_DATA_13 0x56 95 | #define MPU9250_RA_EXT_SENS_DATA_14 0x57 96 | #define MPU9250_RA_EXT_SENS_DATA_15 0x58 97 | #define MPU9250_RA_EXT_SENS_DATA_16 0x59 98 | #define MPU9250_RA_EXT_SENS_DATA_17 0x5A 99 | #define MPU9250_RA_EXT_SENS_DATA_18 0x5B 100 | #define MPU9250_RA_EXT_SENS_DATA_19 0x5C 101 | #define MPU9250_RA_EXT_SENS_DATA_20 0x5D 102 | #define MPU9250_RA_EXT_SENS_DATA_21 0x5E 103 | #define MPU9250_RA_EXT_SENS_DATA_22 0x5F 104 | #define MPU9250_RA_EXT_SENS_DATA_23 0x60 105 | #define MPU9250_RA_MOT_DETECT_STATUS 0x61 106 | #define MPU9250_RA_I2C_SLV0_DO 0x63 107 | #define MPU9250_RA_I2C_SLV1_DO 0x64 108 | #define MPU9250_RA_I2C_SLV2_DO 0x65 109 | #define MPU9250_RA_I2C_SLV3_DO 0x66 110 | #define MPU9250_RA_I2C_MST_DELAY_CTRL 0x67 111 | #define MPU9250_RA_SIGNAL_PATH_RESET 0x68 112 | #define MPU9250_RA_MOT_DETECT_CTRL 0x69 113 | #define MPU9250_RA_USER_CTRL 0x6A 114 | #define MPU9250_RA_PWR_MGMT_1 0x6B 115 | #define MPU9250_RA_PWR_MGMT_2 0x6C 116 | #define MPU9250_RA_BANK_SEL 0x6D 117 | #define MPU9250_RA_MEM_START_ADDR 0x6E 118 | #define MPU9250_RA_MEM_R_W 0x6F 119 | #define MPU9250_RA_DMP_CFG_1 0x70 120 | #define MPU9250_RA_DMP_CFG_2 0x71 121 | #define MPU9250_RA_FIFO_COUNTH 0x72 122 | #define MPU9250_RA_FIFO_COUNTL 0x73 123 | #define MPU9250_RA_FIFO_R_W 0x74 124 | #define MPU9250_RA_WHO_AM_I 0x75 125 | 126 | #define MPU9250_RA_MAG_XOUT_L 0x03 127 | #define MPU9250_RA_MAG_XOUT_H 0x04 128 | #define MPU9250_RA_MAG_YOUT_L 0x05 129 | #define MPU9250_RA_MAG_YOUT_H 0x06 130 | #define MPU9250_RA_MAG_ZOUT_L 0x07 131 | #define MPU9250_RA_MAG_ZOUT_H 0x08 132 | 133 | #define MPU9250_TC_PWR_MODE_BIT 7 134 | #define MPU9250_TC_OFFSET_BIT 6 135 | #define MPU9250_TC_OFFSET_LENGTH 6 136 | #define MPU9250_TC_OTP_BNK_VLD_BIT 0 137 | 138 | #define MPU9250_VDDIO_LEVEL_VLOGIC 0 139 | #define MPU9250_VDDIO_LEVEL_VDD 1 140 | 141 | #define MPU9250_CFG_EXT_SYNC_SET_BIT 5 142 | #define MPU9250_CFG_EXT_SYNC_SET_LENGTH 3 143 | #define MPU9250_CFG_DLPF_CFG_BIT 2 144 | #define MPU9250_CFG_DLPF_CFG_LENGTH 3 145 | 146 | #define MPU9250_EXT_SYNC_DISABLED 0x0 147 | #define MPU9250_EXT_SYNC_TEMP_OUT_L 0x1 148 | #define MPU9250_EXT_SYNC_GYRO_XOUT_L 0x2 149 | #define MPU9250_EXT_SYNC_GYRO_YOUT_L 0x3 150 | #define MPU9250_EXT_SYNC_GYRO_ZOUT_L 0x4 151 | #define MPU9250_EXT_SYNC_ACCEL_XOUT_L 0x5 152 | #define MPU9250_EXT_SYNC_ACCEL_YOUT_L 0x6 153 | #define MPU9250_EXT_SYNC_ACCEL_ZOUT_L 0x7 154 | 155 | #define MPU9250_DLPF_BW_256 0x00 156 | #define MPU9250_DLPF_BW_188 0x01 157 | #define MPU9250_DLPF_BW_98 0x02 158 | #define MPU9250_DLPF_BW_42 0x03 159 | #define MPU9250_DLPF_BW_20 0x04 160 | #define MPU9250_DLPF_BW_10 0x05 161 | #define MPU9250_DLPF_BW_5 0x06 162 | 163 | #define MPU9250_GCONFIG_FS_SEL_BIT 4 164 | #define MPU9250_GCONFIG_FS_SEL_LENGTH 2 165 | 166 | #define MPU9250_GYRO_FS_250 0x00 167 | #define MPU9250_GYRO_FS_500 0x01 168 | #define MPU9250_GYRO_FS_1000 0x02 169 | #define MPU9250_GYRO_FS_2000 0x03 170 | 171 | #define MPU9250_ACONFIG_XA_ST_BIT 7 172 | #define MPU9250_ACONFIG_YA_ST_BIT 6 173 | #define MPU9250_ACONFIG_ZA_ST_BIT 5 174 | #define MPU9250_ACONFIG_AFS_SEL_BIT 4 175 | #define MPU9250_ACONFIG_AFS_SEL_LENGTH 2 176 | #define MPU9250_ACONFIG_ACCEL_HPF_BIT 2 177 | #define MPU9250_ACONFIG_ACCEL_HPF_LENGTH 3 178 | 179 | #define MPU9250_ACCEL_FS_2 0x00 180 | #define MPU9250_ACCEL_FS_4 0x01 181 | #define MPU9250_ACCEL_FS_8 0x02 182 | #define MPU9250_ACCEL_FS_16 0x03 183 | 184 | #define MPU9250_DHPF_RESET 0x00 185 | #define MPU9250_DHPF_5 0x01 186 | #define MPU9250_DHPF_2P5 0x02 187 | #define MPU9250_DHPF_1P25 0x03 188 | #define MPU9250_DHPF_0P63 0x04 189 | #define MPU9250_DHPF_HOLD 0x07 190 | 191 | #define MPU9250_TEMP_FIFO_EN_BIT 7 192 | #define MPU9250_XG_FIFO_EN_BIT 6 193 | #define MPU9250_YG_FIFO_EN_BIT 5 194 | #define MPU9250_ZG_FIFO_EN_BIT 4 195 | #define MPU9250_ACCEL_FIFO_EN_BIT 3 196 | #define MPU9250_SLV2_FIFO_EN_BIT 2 197 | #define MPU9250_SLV1_FIFO_EN_BIT 1 198 | #define MPU9250_SLV0_FIFO_EN_BIT 0 199 | 200 | #define MPU9250_MULT_MST_EN_BIT 7 201 | #define MPU9250_WAIT_FOR_ES_BIT 6 202 | #define MPU9250_SLV_3_FIFO_EN_BIT 5 203 | #define MPU9250_I2C_MST_P_NSR_BIT 4 204 | #define MPU9250_I2C_MST_CLK_BIT 3 205 | #define MPU9250_I2C_MST_CLK_LENGTH 4 206 | 207 | #define MPU9250_CLOCK_DIV_348 0x0 208 | #define MPU9250_CLOCK_DIV_333 0x1 209 | #define MPU9250_CLOCK_DIV_320 0x2 210 | #define MPU9250_CLOCK_DIV_308 0x3 211 | #define MPU9250_CLOCK_DIV_296 0x4 212 | #define MPU9250_CLOCK_DIV_286 0x5 213 | #define MPU9250_CLOCK_DIV_276 0x6 214 | #define MPU9250_CLOCK_DIV_267 0x7 215 | #define MPU9250_CLOCK_DIV_258 0x8 216 | #define MPU9250_CLOCK_DIV_500 0x9 217 | #define MPU9250_CLOCK_DIV_471 0xA 218 | #define MPU9250_CLOCK_DIV_444 0xB 219 | #define MPU9250_CLOCK_DIV_421 0xC 220 | #define MPU9250_CLOCK_DIV_400 0xD 221 | #define MPU9250_CLOCK_DIV_381 0xE 222 | #define MPU9250_CLOCK_DIV_364 0xF 223 | 224 | #define MPU9250_I2C_SLV_RW_BIT 7 225 | #define MPU9250_I2C_SLV_ADDR_BIT 6 226 | #define MPU9250_I2C_SLV_ADDR_LENGTH 7 227 | #define MPU9250_I2C_SLV_EN_BIT 7 228 | #define MPU9250_I2C_SLV_BYTE_SW_BIT 6 229 | #define MPU9250_I2C_SLV_REG_DIS_BIT 5 230 | #define MPU9250_I2C_SLV_GRP_BIT 4 231 | #define MPU9250_I2C_SLV_LEN_BIT 3 232 | #define MPU9250_I2C_SLV_LEN_LENGTH 4 233 | 234 | #define MPU9250_I2C_SLV4_RW_BIT 7 235 | #define MPU9250_I2C_SLV4_ADDR_BIT 6 236 | #define MPU9250_I2C_SLV4_ADDR_LENGTH 7 237 | #define MPU9250_I2C_SLV4_EN_BIT 7 238 | #define MPU9250_I2C_SLV4_INT_EN_BIT 6 239 | #define MPU9250_I2C_SLV4_REG_DIS_BIT 5 240 | #define MPU9250_I2C_SLV4_MST_DLY_BIT 4 241 | #define MPU9250_I2C_SLV4_MST_DLY_LENGTH 5 242 | 243 | #define MPU9250_MST_PASS_THROUGH_BIT 7 244 | #define MPU9250_MST_I2C_SLV4_DONE_BIT 6 245 | #define MPU9250_MST_I2C_LOST_ARB_BIT 5 246 | #define MPU9250_MST_I2C_SLV4_NACK_BIT 4 247 | #define MPU9250_MST_I2C_SLV3_NACK_BIT 3 248 | #define MPU9250_MST_I2C_SLV2_NACK_BIT 2 249 | #define MPU9250_MST_I2C_SLV1_NACK_BIT 1 250 | #define MPU9250_MST_I2C_SLV0_NACK_BIT 0 251 | 252 | #define MPU9250_INTCFG_INT_LEVEL_BIT 7 253 | #define MPU9250_INTCFG_INT_OPEN_BIT 6 254 | #define MPU9250_INTCFG_LATCH_INT_EN_BIT 5 255 | #define MPU9250_INTCFG_INT_RD_CLEAR_BIT 4 256 | #define MPU9250_INTCFG_FSYNC_INT_LEVEL_BIT 3 257 | #define MPU9250_INTCFG_FSYNC_INT_EN_BIT 2 258 | #define MPU9250_INTCFG_I2C_BYPASS_EN_BIT 1 259 | #define MPU9250_INTCFG_CLKOUT_EN_BIT 0 260 | 261 | #define MPU9250_INTMODE_ACTIVEHIGH 0x00 262 | #define MPU9250_INTMODE_ACTIVELOW 0x01 263 | 264 | #define MPU9250_INTDRV_PUSHPULL 0x00 265 | #define MPU9250_INTDRV_OPENDRAIN 0x01 266 | 267 | #define MPU9250_INTLATCH_50USPULSE 0x00 268 | #define MPU9250_INTLATCH_WAITCLEAR 0x01 269 | 270 | #define MPU9250_INTCLEAR_STATUSREAD 0x00 271 | #define MPU9250_INTCLEAR_ANYREAD 0x01 272 | 273 | #define MPU9250_INTERRUPT_FF_BIT 7 274 | #define MPU9250_INTERRUPT_MOT_BIT 6 275 | #define MPU9250_INTERRUPT_ZMOT_BIT 5 276 | #define MPU9250_INTERRUPT_FIFO_OFLOW_BIT 4 277 | #define MPU9250_INTERRUPT_I2C_MST_INT_BIT 3 278 | #define MPU9250_INTERRUPT_PLL_RDY_INT_BIT 2 279 | #define MPU9250_INTERRUPT_DMP_INT_BIT 1 280 | #define MPU9250_INTERRUPT_DATA_RDY_BIT 0 281 | 282 | // TODO: figure out what these actually do 283 | // UMPL source code is not very obivous 284 | #define MPU9250_DMPINT_5_BIT 5 285 | #define MPU9250_DMPINT_4_BIT 4 286 | #define MPU9250_DMPINT_3_BIT 3 287 | #define MPU9250_DMPINT_2_BIT 2 288 | #define MPU9250_DMPINT_1_BIT 1 289 | #define MPU9250_DMPINT_0_BIT 0 290 | 291 | #define MPU9250_MOTION_MOT_XNEG_BIT 7 292 | #define MPU9250_MOTION_MOT_XPOS_BIT 6 293 | #define MPU9250_MOTION_MOT_YNEG_BIT 5 294 | #define MPU9250_MOTION_MOT_YPOS_BIT 4 295 | #define MPU9250_MOTION_MOT_ZNEG_BIT 3 296 | #define MPU9250_MOTION_MOT_ZPOS_BIT 2 297 | #define MPU9250_MOTION_MOT_ZRMOT_BIT 0 298 | 299 | #define MPU9250_DELAYCTRL_DELAY_ES_SHADOW_BIT 7 300 | #define MPU9250_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4 301 | #define MPU9250_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3 302 | #define MPU9250_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2 303 | #define MPU9250_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1 304 | #define MPU9250_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0 305 | 306 | #define MPU9250_PATHRESET_GYRO_RESET_BIT 2 307 | #define MPU9250_PATHRESET_ACCEL_RESET_BIT 1 308 | #define MPU9250_PATHRESET_TEMP_RESET_BIT 0 309 | 310 | #define MPU9250_DETECT_ACCEL_ON_DELAY_BIT 5 311 | #define MPU9250_DETECT_ACCEL_ON_DELAY_LENGTH 2 312 | #define MPU9250_DETECT_FF_COUNT_BIT 3 313 | #define MPU9250_DETECT_FF_COUNT_LENGTH 2 314 | #define MPU9250_DETECT_MOT_COUNT_BIT 1 315 | #define MPU9250_DETECT_MOT_COUNT_LENGTH 2 316 | 317 | #define MPU9250_DETECT_DECREMENT_RESET 0x0 318 | #define MPU9250_DETECT_DECREMENT_1 0x1 319 | #define MPU9250_DETECT_DECREMENT_2 0x2 320 | #define MPU9250_DETECT_DECREMENT_4 0x3 321 | 322 | #define MPU9250_USERCTRL_DMP_EN_BIT 7 323 | #define MPU9250_USERCTRL_FIFO_EN_BIT 6 324 | #define MPU9250_USERCTRL_I2C_MST_EN_BIT 5 325 | #define MPU9250_USERCTRL_I2C_IF_DIS_BIT 4 326 | #define MPU9250_USERCTRL_DMP_RESET_BIT 3 327 | #define MPU9250_USERCTRL_FIFO_RESET_BIT 2 328 | #define MPU9250_USERCTRL_I2C_MST_RESET_BIT 1 329 | #define MPU9250_USERCTRL_SIG_COND_RESET_BIT 0 330 | 331 | #define MPU9250_PWR1_DEVICE_RESET_BIT 7 332 | #define MPU9250_PWR1_SLEEP_BIT 6 333 | #define MPU9250_PWR1_CYCLE_BIT 5 334 | #define MPU9250_PWR1_TEMP_DIS_BIT 3 335 | #define MPU9250_PWR1_CLKSEL_BIT 2 336 | #define MPU9250_PWR1_CLKSEL_LENGTH 3 337 | 338 | #define MPU9250_CLOCK_INTERNAL 0x00 339 | #define MPU9250_CLOCK_PLL_XGYRO 0x01 340 | #define MPU9250_CLOCK_PLL_YGYRO 0x02 341 | #define MPU9250_CLOCK_PLL_ZGYRO 0x03 342 | #define MPU9250_CLOCK_PLL_EXT32K 0x04 343 | #define MPU9250_CLOCK_PLL_EXT19M 0x05 344 | #define MPU9250_CLOCK_KEEP_RESET 0x07 345 | 346 | #define MPU9250_PWR2_LP_WAKE_CTRL_BIT 7 347 | #define MPU9250_PWR2_LP_WAKE_CTRL_LENGTH 2 348 | #define MPU9250_PWR2_STBY_XA_BIT 5 349 | #define MPU9250_PWR2_STBY_YA_BIT 4 350 | #define MPU9250_PWR2_STBY_ZA_BIT 3 351 | #define MPU9250_PWR2_STBY_XG_BIT 2 352 | #define MPU9250_PWR2_STBY_YG_BIT 1 353 | #define MPU9250_PWR2_STBY_ZG_BIT 0 354 | 355 | #define MPU9250_WAKE_FREQ_1P25 0x0 356 | #define MPU9250_WAKE_FREQ_2P5 0x1 357 | #define MPU9250_WAKE_FREQ_5 0x2 358 | #define MPU9250_WAKE_FREQ_10 0x3 359 | 360 | #define MPU9250_BANKSEL_PRFTCH_EN_BIT 6 361 | #define MPU9250_BANKSEL_CFG_USER_BANK_BIT 5 362 | #define MPU9250_BANKSEL_MEM_SEL_BIT 4 363 | #define MPU9250_BANKSEL_MEM_SEL_LENGTH 5 364 | 365 | #define MPU9250_WHO_AM_I_BIT 6 366 | #define MPU9250_WHO_AM_I_LENGTH 6 367 | 368 | #define MPU9250_DMP_MEMORY_BANKS 8 369 | #define MPU9250_DMP_MEMORY_BANK_SIZE 256 370 | #define MPU9250_DMP_MEMORY_CHUNK_SIZE 16 371 | 372 | #define GYRO_ADDRESS 0xD0 373 | #define MAG_ADDRESS 0x18 374 | #define ACCEL_ADDRESS 0xD0 375 | 376 | 377 | extern float q[4]; /* 四元数*/ 378 | extern float gyrof[3]; /* X/Y/Z 角速度*/ 379 | extern float accelf[3]; /* X/Y/Z 加速度 */ 380 | extern float yprf[3]; /* yaw/pitch/roll*/ 381 | extern float mag[3]; 382 | 383 | void Init_MPU9250_With_DMP(void); 384 | 385 | void MPU9250_resetFIFO(void); 386 | 387 | uint16_t MPU9250_getFIFOCount(void); 388 | 389 | void getyawpitchroll(void); 390 | 391 | void getquaternion(void); 392 | 393 | void getmag(void); 394 | 395 | void readdmp(void); 396 | 397 | void getAcc_gyro(void); 398 | 399 | uint8_t MPU9250_Interrupted(void); 400 | 401 | void MPU9250_Sleep(void); 402 | 403 | void MPU9250_WakeUp(void); 404 | 405 | #endif 406 | 407 | -------------------------------------------------------------------------------- /MPU9250-MPU6050/readme.md: -------------------------------------------------------------------------------- 1 | #MPU9250 MPU6050驱动(带DMP姿态融合) 2 | 3 | MPU9250芯片 4 | 5 | 驱动一共分为两个个部分 6 | 7 | 1.模拟I2C驱动 8 | 2.MPU9250 及 DMP的 驱动 9 | 10 | 分别都有对应的*.c和*.h文件。 11 | 12 | I2C相关的文件为IOI2C.C和IOI2C.h 13 | MPU9250相关的文件有三个dmp.c/dmp.h/MPU9250_api.h 14 | 15 | ## I2C ## 16 | 17 | 此例程的I2C使用的是模拟的I2C,因为移植方便。驱动使用情况详见.h文件以及例程中的调用 18 | 19 | ## MPU9250 及DMP获取yaw、pitch、roll ## 20 | 21 | 因为MPU9250内置DMP姿态融合器,无需算法,直接使用DMP融合即可得到姿态。 22 | 23 | 其中,接口都在MPU9250_api.h文件中,包括MPU9250/DMP的初始化,传感数值的获取。 24 | 25 | ## 驱动文件使用方法 ## 26 | 首先需要把这五个文件添加到工程里面去 27 | 然后 28 | - 在初始化的文件中#include "IOI2C.H" #include "MPU9250_api.h" 29 | - 在需要获取传感器数值的文件中#include "MPU9250_api.h" 30 | 31 | 1. 初始化 32 | ``` 33 | IIC_Init();//模拟I2C驱动的初始化,一定要先初始化I2C接口才能操作MPU9250芯片 34 | 35 | Init_MPU9250_With_DMP();//初始化MPU9250,配置并且开启DMP,设置中断方式为加速度方式 36 | ``` 37 | 2. 函数调用 38 | 39 | ``` c 40 | uint16_t fifo_count = 0; 41 | while(1)//使用循环是为了等待DMP转换完成 42 | { 43 | fifo_count = MPU9250_getFIFOCount();//读取FIFO计数 44 | 45 | if(fifo_count >= 0x0200)//如果FIFO值>0x0200,此时DMP的结果错误,直接复位FIFO 46 | { 47 | MPU9250_resetFIFO(); 48 | } 49 | else 50 | { 51 | 52 | if(fifo_count >= 0x2a)//如果FIFO值 > 0x2a,此时DMP转换完成并且数值正常 53 | { 54 | readdmp(); //首先要读取DMP FIFO,读取之后才能进行计算姿态的操作 55 | MPU9250_resetFIFO(); 56 | getyawpitchroll();//计算并且获取yaw、pitch、roll,结果保存在yprf[3]数组中 57 | break;//转换并且计算完成之后退出循环 58 | } 59 | } 60 | } 61 | ``` 62 | 63 | NOTE:在判断DMP是否完成时,应当从FIFO的计数中去判断,当计数大于等于42,说明DMP转换完成, 64 | 也可以采用中断的方式来作为标志。 65 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | #Peripheral 2 | 3 | 4 | 一些外设的驱动 --------------------------------------------------------------------------------