基于STM32平台的BMP180测试(模拟IIC)

1.测试描述:使用模拟IIC,从BMP180中获取ID号、温度值、气压值以及计算海拔高度。2.测试准备:硬件平台:原子战舰V3开发板 测试工具:逻辑分析仪、串口调试工具3.数据手册解读:(1) 首先是多个字节的读取时序图,从这里也可以看出BMP180芯片的地址+写信号是0xEE,地址+读信号为0xEF,当然手册前面也有提到过,有兴趣的可以自己去查看一下手册。
摘要由CSDN通过智能技术生成

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
  • 28
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
IIC是一种串行通信协议,通常用于连接微控制器和各种外设,如传感器和存储器。在STM32中,可以使用硬件IIC接口来进行通信,但是有时候可能需要在没有硬件IIC接口的情况下进行IIC通信,这时候可以使用软件模拟IIC。 在STM32HAL库中,可以使用GPIO模块来模拟IIC通信。具体实现步骤如下: 1. 定义IIC的GPIO引脚 首先需要定义IIC的GPIO引脚,包括SCL和SDA引脚。可以使用STM32的GPIO模块来定义这些引脚。 ```c #define SCL_PIN GPIO_PIN_10 #define SCL_PORT GPIOB #define SDA_PIN GPIO_PIN_11 #define SDA_PORT GPIOB ``` 2. 初始化GPIO引脚 在使用GPIO引脚之前,需要进行初始化。可以使用HAL库提供的GPIO初始化函数来初始化引脚。 ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pins : SCL_PIN SDA_PIN */ GPIO_InitStruct.Pin = SCL_PIN|SDA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 设置为开漏输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用上拉或下拉电阻 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // GPIO时钟频率 HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct); ``` 3. 定义IIC操作函数 定义IIC的操作函数,包括发送数据、接收数据和等待应答等。 ```c void IIC_Start(void) { SDA_HIGH(); SCL_HIGH(); HAL_Delay(1); SDA_LOW(); HAL_Delay(1); SCL_LOW(); } void IIC_Stop(void) { SDA_LOW(); SCL_HIGH(); HAL_Delay(1); SDA_HIGH(); HAL_Delay(1); } void IIC_SendByte(uint8_t byte) { uint8_t i; for (i = 0; i < 8; i++) { if ((byte & 0x80) == 0x80) SDA_HIGH(); else SDA_LOW(); HAL_Delay(1); SCL_HIGH(); HAL_Delay(1); SCL_LOW(); byte <<= 1; } SDA_HIGH(); HAL_Delay(1); SCL_HIGH(); HAL_Delay(1); SCL_LOW(); } uint8_t IIC_RecvByte(void) { uint8_t i; uint8_t byte = 0; SDA_HIGH(); HAL_Delay(1); for (i = 0; i < 8; i++) { byte <<= 1; SCL_HIGH(); HAL_Delay(1); if (SDA_READ()) byte++; SCL_LOW(); HAL_Delay(1); } return byte; } uint8_t IIC_WaitAck(void) { uint8_t ack; SDA_HIGH(); HAL_Delay(1); SCL_HIGH(); HAL_Delay(1); if (SDA_READ()) ack = 1; else ack = 0; SCL_LOW(); HAL_Delay(1); return ack; } void IIC_SendAck(uint8_t ack) { if (ack) SDA_HIGH(); else SDA_LOW(); HAL_Delay(1); SCL_HIGH(); HAL_Delay(1); SCL_LOW(); HAL_Delay(1); } ``` 4. 定义宏函数 定义宏函数来简化IIC操作函数的调用。例如,可以定义宏函数`SDA_HIGH()`来调用`HAL_GPIO_WritePin()`函数来设置SDA引脚为高电平。 ```c #define SDA_HIGH() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET) #define SDA_LOW() HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_RESET) #define SDA_READ() HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN) #define SCL_HIGH() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET) #define SCL_LOW() HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_RESET) ``` 5. 调用IIC操作函数 使用定义的宏函数和IIC操作函数来进行IIC通信。例如,可以使用以下代码来发送一个字节。 ```c IIC_Start(); IIC_SendByte(0xA0); IIC_WaitAck(); IIC_SendByte(0x01); IIC_WaitAck(); IIC_Stop(); ``` 以上就是基于STM32HAL库的软件模拟IIC的实现步骤。需要注意的是,在实现过程中需要根据具体的硬件和需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值