各路好汉~
兄弟用STM32F407ZGT的开发板,spi方式,读取到了mpu9250的原始数据,然后想使用dmp(运动数字处理引擎),于是把原子哥读取6050数据的源程序中的dmp部分移植过来,然而源程序中inv_mpu.c文件支持的是I2C方式,我对I2C也不是很了解,所以出现了问题:
现在没把握的是:我用spi读数据的函数直接替换用i2c读取数据的函数,少用了一个参数addr,不知道有问题没有?(函数对比见下图)
[mw_shl_code=c,true]//spi方式,从寄存器reg中读一个长度为len的数据,存放在buf中
u8 MPU_Read_Len(u8 reg,u8 len,u8 *buf)
{
u8 i;
MPU_9250_ENABLE;
SPI2_ReadWriteByte(reg|0x80); //发送读命令+寄存器号
for(i=0;i<len;i++) //一共读取len字节数据
{
buf
=SPI2_ReadWriteByte(0xff); //循环读取
}
MPU_9250_DISENABLE;
return 0;
}[/mw_shl_code]
[mw_shl_code=c,true]//IIC方式,原子哥的程序
//addr:器件地址,比spi多的一个参数
//reg:寄存器号
//len:长度
//buf:数据存储区
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
IIC_Start();
IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Start();
IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
IIC_Wait_Ack(); //等待应答
while(len)
{
if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK else *buf=IIC_Read_Byte(1); //读数据,发送ACK
len--;
buf++;
}
IIC_Stop(); //产生一个停止条件
return 0;
}[/mw_shl_code]
请教:
1、什么叫器件地址,为什么在spi中少了一个参数?
2、谁知道怎么把dmp在spi的方式下移植到mpu9250中?
谢过
一周热门 更多>