TI中文支持网
TI专业的中文技术问题搜集分享网站

TM4C123用硬件I2C读取mpu9250的问题

看着库函数手册和以前在32上写I2C的步骤写了个初始化程序 设备ID读出来0x00

下面是程序

void I2C_Init(void)
{
 SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
 
 GPIOPinTypeI2C(GPIO_PORTD_BASE,GPIO_PIN_1);
 GPIOPinTypeI2C(GPIO_PORTD_BASE,GPIO_PIN_0);
 GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
  GPIOPinConfigure(GPIO_PD0_I2C3SCL);
  GPIOPinConfigure(GPIO_PD1_I2C3SDA); 
 
 I2CMasterInitExpClk(I2C3_BASE, SysCtlClockGet(), true);
  I2CMasterEnable(I2C3_BASE);
}
void MPU_Write_Byte(uint8_t addr,uint8_t reg,uint8_t data)
{
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
 I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
 while(I2CMasterBusy(I2C3_BASE));
 I2CMasterDataPut(I2C3_BASE,data);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
 while(I2CMasterBusy(I2C3_BASE));
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
}
uint8_t MPU_Read_Byte(uint8_t addr,uint8_t reg)
{
 uint32_t raw_res;
 uint8_t res;
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
  I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
 while(I2CMasterBusy(I2C3_BASE));
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
  I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);
  while(I2CMasterBusy(I2C3_BASE));
  raw_res=I2CMasterDataGet(I2C3_BASE);
  res=(uint8_t)(raw_res>>24);
  return res;
}
void MPU_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
 uint8_t i;
 uint32_t raw_res;
 uint8_t res;
 I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
 I2CMasterDataPut(I2C3_BASE,reg);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
  while(I2CMasterBusy(I2C3_BASE));
  I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_RECEIVE_START);
 while(I2CMasterBusy(I2C3_BASE));
 for(i=0;i<len;i++)
 {
  I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_RECEIVE_CONT);
   while(I2CMasterBusy(I2C3_BASE));
    raw_res=I2CMasterDataGet(I2C3_BASE);
    res=(uint8_t)(raw_res>>24);  
   buf++;
 }
 I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
}
下面是初始化程序
uint8_t MPU9250_Init(void)
{
 uint8_t res=0;
 I2C_Init();
 MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X80);
 delay_Nms(200);
 MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X00);
  MPU_Set_Gyro_Fsr(3); //ÍÓÂÝÒÇ´«¸ÐÆ÷,¡À2000dps
 MPU_Set_LPF(42);
 MPU_Set_Accel_Fsr(0);               //¼ÓËÙ¶È´«¸ÐÆ÷,¡À2g
  MPU_Set_Rate(500);                //ÉèÖòÉÑùÂÊ500Hz
  MPU_Write_Byte(MPU9250_ADDR,MPU_INT_EN_REG,0X00);   //¹Ø±ÕËùÓÐÖжÏ
 MPU_Write_Byte(MPU9250_ADDR,MPU_USER_CTRL_REG,0X00);//I2CÖ÷ģʽ¹Ø±Õ
 MPU_Write_Byte(MPU9250_ADDR,MPU_FIFO_EN_REG,0XFF);
 MPU_Write_Byte(MPU9250_ADDR,MPU_INTBP_CFG_REG,0X82);//INTÒý½ÅµÍµçƽÓÐЧ£¬¿ªÆôbypassģʽ£¬¿ÉÒÔÖ±½Ó¶ÁÈ¡´ÅÁ¦¼Æ
 res=MPU_Read_Byte(MPU9250_ADDR,MPU_DEVICE_ID_REG|0x80);  //¶ÁÈ¡MPU6500µÄID
 if(res==MPU6500_ID) //Æ÷¼þIDÕýÈ·
 {
   MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X01);   //ÉèÖÃCLKSEL,PLL XÖáΪ²Î¿¼
   MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT2_REG,0X00);   //¼ÓËÙ¶ÈÓëÍÓÂÝÒǶ¼¹¤×÷
   MPU_Set_Rate(500);              //ÉèÖòÉÑùÂÊΪ500Hz   }else return 1;
 res=MPU_Read_Byte(AK8963_ADDR,MAG_WIA);       //¶ÁÈ¡AK8963 ID   if(res==AK8963_ID)
 {
   MPU_Write_Byte(AK8963_ADDR,MAG_CNTL1,0X11);  //ÉèÖÃAK8963Ϊµ¥´Î²âÁ¿Ä£Ê½
 }else return 1;
 return 0;
}  设备ID读不出来 
user5813287:

好吧 其实读出来了 只是我数据类型转换不正确 现在是能读出9轴数据了 但数据一直不变 请教下大佬们

xyz549040622:

回复 user5813287:

数据一直不变,是指什么数据呢?MPU6500还是AK8963?ID正确,说明时序OK,读不到数据不正常呀?

da qin zheng sheng:

回复 user5813287:

正确初始化参数后芯片才能正常工作的。

da qin zheng sheng:

内部的磁力计i2c地址不一样,需要
旁路设置?

xyz549040622:

回复 da qin zheng sheng:

能读到ID,说明初始化已经成功了吧。

user5813287:

回复 xyz549040622:

设备ID有时能读到 有时失去总线控制

xyz549040622:

回复 user5813287:

参考另一个帖子的说法,可能是I2C的驱动能力不够,确保上拉,可能是距离远了,降低速率试试。

user5813287:

回复 xyz549040622:

哪篇帖子啊 给个链接嘛

赞(0)
未经允许不得转载:TI中文支持网 » TM4C123用硬件I2C读取mpu9250的问题
分享到: 更多 (0)