有个MPL3115A2气压海拔传感器的数据读取问题想请问下各位佬。在配置完IIC后,读取寄存器的时候返回来的值都是0xEE,包括ack应答。使用调试的时候,读取到的几个寄存器的值先是0x0E,然后过很短一段时间就变成0xEE(是同时改变的),后面从寄存器读出的值就保持是0xEE了.根据手册传感器写地址使用0xC0,读地址使用0xC1,按照网上教程初始化了。还望各位佬指教一下,万分感谢!
void mpl3115a2_iic_init(void)
{
iic_init();
mpl3115a2_iic_regwrite(0x26,0x04); //复位所有寄存器 进入就绪模式(必须添加的)
mpl3115a2_iic_regwrite(0x14,0xC5); //标准大气压输入
mpl3115a2_iic_regwrite(0x15,0xE7);
mpl3115a2_iic_regwrite(0x26,0xB8); //设置采样率 512ms
mpl3115a2_iic_regwrite(0x13,0x07);
mpl3115a2_iic_regwrite(0x26,0x39); //进入活动测压模式
}
/**
* @brief 向WPL3115A2寄存器写入数据
* @param 无
* @retval 无
*/
void mpl3115a2_iic_regwrite(uint8_t reg,uint32_t data)
{
uint8_t data_temp[1];
data_temp[0] = (uint8_t) (data);
iic_start();
iic_send_byte(MPL3115A2_ADDRESS);
iic_send_byte(reg);
iic_send_byte(data_temp[0]);
iic_stop();
}
/**
* @brief 从WPL3115A2寄存器读取数据
* @param 无
* @retval 无
*/
uint8_t mpl3115a2_iic_regread(uint8_t addr)
{
iic_start();
iic_send_byte(0xC0); //设备地址--写操作
iic_send_byte(addr); //待读取寄存器地址
iic_stop();
iic_start();
iic_send_byte(0xC1); //设备地址--读操作
uint8_t read_data = iic_read_byte();
iic_stop();
return read_data;
}
void mpl3115a2_get_data(void)
{
uint8_t ack=0;
uint8_t MPL3115A2_P_MSB=0,MPL3115A2_P_CSB=0,MPL3115A2_P_LSB=0;
uint8_t MPL3115A2_T_MSB=0,MPL3115A2_T_LSB=0;
uint32_t MPL3115A2_P_INT=0;
float Atmos=0,T1=0;
__disable_irq();
ack = mpl3115a2_iic_regread(0x00);
if(ack&0x08) //等待接收到从机应答开始接收数据
{
MPL3115A2_P_MSB = mpl3115a2_iic_regread(0x01);
MPL3115A2_P_CSB = mpl3115a2_iic_regread(0x02);
MPL3115A2_P_LSB = mpl3115a2_iic_regread(0x03);
MPL3115A2_T_MSB = mpl3115a2_iic_regread(0x04);
MPL3115A2_T_LSB = mpl3115a2_iic_regread(0x05);
MPL3115A2_P_INT = MPL3115A2_P_MSB<<8 | MPL3115A2_P_CSB;
// Altitude = (float)MPL3115A2_P_INT+(float)((MPL3115A2_P_LSB>>4)*0.0001f);
Atmos = (float)MPL3115A2_P_INT+(float)((MPL3115A2_P_LSB>>4)>>4);
Atmos *= 0.003994f; //大气压 kpa
printf("Atmos=%.2lf\r\n",Atmos);
T1 = MPL3115A2_T_MSB+(float)((MPL3115A2_T_LSB>>4)*0.0001f);
// printf("T1=%.2lf\r\n",T1);
}
__enable_irq();
}