1.测试描述:
使用模拟IIC,从BMP180中获取ID号、温度值、气压值以及计算海拔高度。
2.测试准备:
硬件平台:原子战舰V3开发板
测试工具:逻辑分析仪、串口调试工具
3.数据手册解读:
(1) 首先是多个字节的读取时序图,从这里也可以看出BMP180芯片的地址+写信号是0xEE,地址+读信号为0xEF,当然手册前面也有提到过,有兴趣的可以自己去查看一下手册。
(2) 然后本人测试时默认使用的是下图画横线部分的部分,也就是气压这块使用的是低功耗模式。OSS的值要注意,因为后期的计算需要这个,并且读取UT值时也要做对应的处理。
(3) 下图就是手册里给出的利用BMP180里的参数计算气压和温度的流程图。特别注意流程里的OSS,由于本测试使用的OSS = 0,所以在实际代码中省去了这一部分。
4.测试代码:
由于本工程是直接使用原子战舰的标准例程-库函数版本\实验23 IIC实验源码改过来的,所以模拟IIC部分使用的原子这块的代码。BMP180部分由本人编写。
(1) 首先是BMP180.C的代码片
#include "bmp180.h"
#include "delay.h"
#include "math.h"
//存储BMP180数据的结构
_bmp180 bmp180;
//BMP180初始化
//对使用的IIC端口进行初始化
void BMP_Init(void)
{
IIC_Init();
}
//写一个数据到BMP180
void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{
IIC_Start();
IIC_Send_Byte(0xEE);
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr);
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();
}
//从BMP180读一个字节数据
uint8_t BMP_ReadOneByte(uint8_t ReadAddr)
{
uint8_t data = 0;
IIC_Start();
IIC_Send_Byte(0xEE);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xEF);
IIC_Wait_Ack();
data = IIC_Read_Byte(1);
IIC_Stop();
return data;
}
//从BMP180读一个16位的数据
short BMP_ReadTwoByte(uint8_t Rea