Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2C_IIC
bmp180程序,关于iic地址问题
发布于 2020-01-20 17:19:21 浏览:1999
订阅该版
* 本帖最后由 aozima 于 2020-1-20 17:48 编辑 * 在写的时候参考了这一篇文章[https://blog.csdn.net/zxh912516636/article/details/77890497](https://blog.csdn.net/zxh912516636/article/details/77890497) 根据这篇文章改的程序 使用rtthread的iic驱动框架进行编写的,在编写的时候,需要注意,iic框架程序中的地址是7位地址不是,技术文件里面的8位地址。所以使用iic框架的时候需要将地址>>1位是从机地址。 也就是说bmp180的写地址是0xee但是,在iic驱动框架中,oxee要右移一位,变成0x77 才是正确的从机地址 程序 ```#include
#include
#include
#include "user.h" #include "stdio.h" #include "string.h" #include "math.h" #define BMP180_I2C_BUS_NAME "i2c1" /* 传感器连接的I2C总线设备名称 */ #define BMP180_ADDR 0x77 /* 从机地址 */ typedef struct __BMP180 { short AC1; short AC2; short AC3; unsigned short AC4; unsigned short AC5; unsigned short AC6; short B1; short B2; short MB; short MC; short MD; long UT; long UP; long X1; long X2; long X3; long B3; unsigned long B4; long B5; long B6; long B7; long p; long Temp; float altitude; }_bmp180; _bmp180 bmp180; //所有数据结构 static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ rt_err_t BMP180_Send_Cmd(rt_uint8_t cmd) { struct rt_i2c_msg msgs; msgs.addr = BMP180_ADDR; msgs.flags = RT_I2C_WR; msgs.len = 1; msgs.buf = (rt_uint8_t*)&cmd; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(i2c_bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } rt_err_t BMP180_Read_Dat(rt_uint8_t* dat) { struct rt_i2c_msg msgs; msgs.addr = BMP180_ADDR; msgs.flags = RT_I2C_RD; msgs.len = 2; msgs.buf = dat; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(i2c_bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } short BMP_ReadTwoByte(rt_uint8_t date) { short data; uint8_t msb[2]; BMP180_Send_Cmd(date); BMP180_Read_Dat(msb); data = msb[0]*256 + msb[1]; return data; } void BMP180_INIT() { bmp180.AC1 = BMP_ReadTwoByte(0xAA); bmp180.AC2 = BMP_ReadTwoByte(0xAC); bmp180.AC3 = BMP_ReadTwoByte(0xAE); bmp180.AC4 = BMP_ReadTwoByte(0xB0); bmp180.AC5 = BMP_ReadTwoByte(0xB2); bmp180.AC6 = BMP_ReadTwoByte(0xB4); bmp180.B1 = BMP_ReadTwoByte(0xB6); bmp180.B2 = BMP_ReadTwoByte(0xB8); bmp180.MB = BMP_ReadTwoByte(0xBA); bmp180.MC = BMP_ReadTwoByte(0xBC); bmp180.MD = BMP_ReadTwoByte(0xBE); } //写一个数据到BMP180 rt_err_t BMP_WriteOneByte(rt_uint8_t *cmd) { struct rt_i2c_msg msgs; msgs.addr = BMP180_ADDR; msgs.flags = RT_I2C_WR; msgs.len = 2; msgs.buf = cmd; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(i2c_bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } //从BMP180读取未修正的温度 long BMP_Read_UT(void) { long temp = 0; rt_uint8_t ut_1[2]; ut_1[0]=0xF4; ut_1[1]=0x2E; BMP_WriteOneByte(ut_1); rt_thread_mdelay(5); temp = (long)BMP_ReadTwoByte(0xF6); return temp; } uint8_t BMP_ReadOneByte(uint8_t ReadAddr) { uint8_t data = 0; BMP180_Send_Cmd(ReadAddr); BMP180_Read_Dat(&data); return data; } //从BMP180读取未修正的大气压 long BMP_Read_UP(void) { long pressure = 0; rt_uint8_t ut_1[2]; ut_1[0]=0xF4; ut_1[1]=0x34; BMP_WriteOneByte(ut_1); rt_thread_mdelay(5); pressure = (long)BMP_ReadTwoByte(0xF6); pressure = pressure + BMP_ReadOneByte(0xf8); pressure &= 0x0000FFFF; return pressure; } //用获取的参数对温度和大气压进行修正,并计算海拔 void BMP_UncompemstatedToTrue(void) { bmp180.UT = BMP_Read_UT();//第一次读取错误 bmp180.UT = BMP_Read_UT();//进行第二次读取修正参数 bmp180.UP = BMP_Read_UP(); bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15; bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD); bmp180.B5 = bmp180.X1 + bmp180.X2; bmp180.Temp = (bmp180.B5 + 8) >> 4; bmp180.B6 = bmp180.B5 - 4000; bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11; bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11; bmp180.X3 = bmp180.X1 + bmp180.X2; bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3)+2) /4; bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13; bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16; bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2; bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15; bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000; if(bmp180.B7 < 0x80000000) { bmp180.p = (bmp180.B7 * 2) / bmp180.B4; } else { bmp180.p = (bmp180.B7 / bmp180.B4) * 2; } bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8); bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16; bmp180.X2 = (-7357 * bmp180.p) >> 16; bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4); bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255))); } void i2c_BMP180_example_entry(void *parameter) { i2c_bus = (struct rt_i2c_bus_device*)rt_device_find(BMP180_I2C_BUS_NAME); if(i2c_bus == RT_NULL) { rt_kprintf("can't find %s device!
", BMP180_I2C_BUS_NAME); } BMP180_INIT(); while(1) { char msg_pub[30]; BMP_UncompemstatedToTrue(); memset(msg_pub, 0x0, sizeof(msg_pub)); snprintf(msg_pub, sizeof(msg_pub),"气压: %dpa ",bmp180.p); wirte_string(2,0,msg_pub,16); rt_thread_mdelay(1000); } }```
查看更多
3
个回答
默认排序
按发布时间排序
aozima
2020-01-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
感谢楼主分享
StackYuan
认证专家
2020-01-21
这家伙很懒,什么也没写!
是的 IIC的地址,一般都要考虑7位与8位地址的关系,很多时候小白就这么被坑了,个人更倾向于7位地址,因为它清晰地表达了地址,而不是和读写位混合。
不讲武德的老法师
2020-01-21
这家伙很懒,什么也没写!
>是的 IIC的地址,一般都要考虑7位与8位地址的关系,很多时候小白就这么被坑了,个人更倾向于7位地址,因为 ... --- 以前都是直接到网上找现成的程序,,也没注意。看别的程序都是用的8位地址,就直接用8位了,结果找了半天,才找出来
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
不讲武德的老法师
这家伙很懒,什么也没写!
提问
12
回答
16
被采纳
0
关注TA
发私信
相关问题
1
NXP的I2C应该比ST的好用吧
2
Use of I2C device driver
3
关于I2C 驱动问题请教
4
我如何知道这个iic的io配置和我电路设计的是一致的?
5
I2C模拟读操作失败,不知道问什么进不去读函数
6
RTT的I2C有官方文档资料没有
7
求 STM32F103 IIC 自定义IO初始化 代码
8
报一个LPC4008代码中I2C的bug
9
RTOS IIC总线使用
10
关于在RTT中使用STM32 I2C的疑问
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
新手教程-Pin设备使用
2
基于嵌入式的智能关怀系统#24嵌入式设计大赛
3
基于机器视觉识别自动跟踪器
4
[24嵌入式设计大赛]基于Vision-Board的智能应急环境监测控制小车
5
【24嵌入式设计大赛】基于RT-Thread VisionBoard开发版的AI识别宠物
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
at_device
MicroPython
rt_mq_消息队列_msg_queue
ulog
C++_cpp
本月问答贡献
rv666
6
个答案
1
次被采纳
踩姑娘的小蘑菇
5
个答案
1
次被采纳
用户名由3_15位
5
个答案
1
次被采纳
xiaorui
2
个答案
1
次被采纳
张世争
2
个答案
1
次被采纳
本月文章贡献
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
4
次点赞
BRICK PORTER
1
篇文章
2
次点赞
不灬忘初心
1
篇文章
2
次点赞
flytianya2010
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部