MPU6500芯片是一种6轴运动跟踪装置。具备输出角速度,加速度和温度。
FPGA设计,是通过IIC时序读取相应功能数值。官方手册给的时序图如下图1。
图1 IIC读取芯片时序
通过FPGA设计读取 传感器, 芯片端是做为从设备。设备ID = 110100X,X是由硬件设计决定。芯片引脚ADO拉低。设备ID=68h,反之,硬件设备ID=69H.下面是芯片寄存器地址表。
CONSTANT MPU6500_SELF_TEST_XG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"00";
CONSTANT MPU6500_SELF_TEST_YG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"01";
CONSTANT MPU6500_SELF_TEST_ZG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"02";
CONSTANT MPU6500_SELF_TEST_XA : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"0D";
CONSTANT MPU6500_SELF_TEST_YA : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"0E";
CONSTANT MPU6500_SELF_TEST_ZA : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"0F";
CONSTANT MPU6500_XG_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"13";
CONSTANT MPU6500_XG_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"14";
CONSTANT MPU6500_YG_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"15";
CONSTANT MPU6500_YG_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"16";
CONSTANT MPU6500_ZG_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"17";
CONSTANT MPU6500_ZG_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"18";
CONSTANT MPU6500_SMPLRT_DIV : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"19";
CONSTANT MPU6500_CONFIG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1A";
CONSTANT MPU6500_GYRO_CONFIG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1B";
CONSTANT MPU6500_ACCEL_CONFIG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1C";
CONSTANT MPU6500_ACCEL_CONFIG_2 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1D";
CONSTANT MPU6500_LP_ACCEL_ODR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1E";
CONSTANT MPU6500_MOT_THR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"1F";
CONSTANT MPU6500_FIFO_EN : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"23";
CONSTANT MPU6500_I2C_MST_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"24";
CONSTANT MPU6500_I2C_SLV0_ADDR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"25";
CONSTANT MPU6500_I2C_SLV0_REG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"26";
CONSTANT MPU6500_I2C_SLV0_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"27";
CONSTANT MPU6500_I2C_SLV1_ADDR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"28";
CONSTANT MPU6500_I2C_SLV1_REG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"29";
CONSTANT MPU6500_I2C_SLV1_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2A";
CONSTANT MPU6500_I2C_SLV2_ADDR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2B";
CONSTANT MPU6500_I2C_SLV2_REG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2C";
CONSTANT MPU6500_I2C_SLV2_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2D";
CONSTANT MPU6500_I2C_SLV3_ADDR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2E";
CONSTANT MPU6500_I2C_SLV3_REG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"2F";
CONSTANT MPU6500_I2C_SLV3_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"30";
CONSTANT MPU6500_I2C_SLV4_ADDR : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"31";
CONSTANT MPU6500_I2C_SLV4_REG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"32";
CONSTANT MPU6500_I2C_SLV4_DO : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"33";
CONSTANT MPU6500_I2C_SLV4_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"34";
CONSTANT MPU6500_I2C_SLV4_DI : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"35";
CONSTANT MPU6500_I2C_MST_STATUS : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"36";
CONSTANT MPU6500_INT_PIN_CFG : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"37";
CONSTANT MPU6500_INT_ENABLE : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"38";
CONSTANT MPU6500_INT_STATUS : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3A";
CONSTANT MPU6500_ACCEL_XOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3B";
CONSTANT MPU6500_ACCEL_XOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3C";
CONSTANT MPU6500_ACCEL_YOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3D";
CONSTANT MPU6500_ACCEL_YOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3E";
CONSTANT MPU6500_ACCEL_ZOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"3F";
CONSTANT MPU6500_ACCEL_ZOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"40";
CONSTANT MPU6500_TEMP_OUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"41";
CONSTANT MPU6500_TEMP_OUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"42";
CONSTANT MPU6500_GYRO_XOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"43";
CONSTANT MPU6500_GYRO_XOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"44";
CONSTANT MPU6500_GYRO_YOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"45";
CONSTANT MPU6500_GYRO_YOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"46";
CONSTANT MPU6500_GYRO_ZOUT_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"47";
CONSTANT MPU6500_GYRO_ZOUT_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"48";
CONSTANT MPU6500_EXT_SENS_DATA_00 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"49";
CONSTANT MPU6500_EXT_SENS_DATA_01 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4A";
CONSTANT MPU6500_EXT_SENS_DATA_02 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4B";
CONSTANT MPU6500_EXT_SENS_DATA_03 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4C";
CONSTANT MPU6500_EXT_SENS_DATA_04 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4D";
CONSTANT MPU6500_EXT_SENS_DATA_05 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4E";
CONSTANT MPU6500_EXT_SENS_DATA_06 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"4F";
CONSTANT MPU6500_EXT_SENS_DATA_07 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"50";
CONSTANT MPU6500_EXT_SENS_DATA_08 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"51";
CONSTANT MPU6500_EXT_SENS_DATA_09 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"52";
CONSTANT MPU6500_EXT_SENS_DATA_10 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"53";
CONSTANT MPU6500_EXT_SENS_DATA_11 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"54";
CONSTANT MPU6500_EXT_SENS_DATA_12 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"55";
CONSTANT MPU6500_EXT_SENS_DATA_13 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"56";
CONSTANT MPU6500_EXT_SENS_DATA_14 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"57";
CONSTANT MPU6500_EXT_SENS_DATA_15 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"58";
CONSTANT MPU6500_EXT_SENS_DATA_16 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"59";
CONSTANT MPU6500_EXT_SENS_DATA_17 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5A";
CONSTANT MPU6500_EXT_SENS_DATA_18 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5B";
CONSTANT MPU6500_EXT_SENS_DATA_19 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5C";
CONSTANT MPU6500_EXT_SENS_DATA_20 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5D";
CONSTANT MPU6500_EXT_SENS_DATA_21 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5E";
CONSTANT MPU6500_EXT_SENS_DATA_22 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"5F";
CONSTANT MPU6500_EXT_SENS_DATA_23 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"60";
CONSTANT MPU6500_I2C_SLV0_DO : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"63";
CONSTANT MPU6500_I2C_SLV1_DO : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"64";
CONSTANT MPU6500_I2C_SLV2_DO : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"65";
CONSTANT MPU6500_I2C_SLV3_DO : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"66";
CONSTANT MPU6500_I2C_MST_DELAY_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"67";
CONSTANT MPU6500_SIGNAL_PATH_RESET : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"68";
CONSTANT MPU6500_MOT_DETECT_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"69";
CONSTANT MPU6500_USER_CTRL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"6A";
CONSTANT MPU6500_PWR_MGMT_1 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"6B";
CONSTANT MPU6500_PWR_MGMT_2 : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"6C";
CONSTANT MPU6500_FIFO_COUNTH :STD_LOGIC_VECTOR(7 DOWNTO 0) := x"72";
CONSTANT MPU6500_FIFO_COUNTL : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"73";
CONSTANT MPU6500_FIFO_R_W : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"74";
CONSTANT MPU6500_WHO_AM_I : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"75"; -- mpu6500 id = 0x70
CONSTANT MPU6500_XA_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"77";
CONSTANT MPU6500_XA_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"78";
CONSTANT MPU6500_YA_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"7A";
CONSTANT MPU6500_YA_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"7B";
CONSTANT MPU6500_ZA_OFFSET_H : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"7D";
CONSTANT MPU6500_ZA_OFFSET_L : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"7E";
CONSTANT MPU6500_ID : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"70";
FPGA通过设计的IIC时序,读取 MPU6500_WHO_AM_I (75h)寄存器的值是70h ,说明IIC读取总线通信成功。