免费预览已结束,剩余12页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
登录|注册Stephen_yu的专栏 目录视图 摘要视图 订阅博客专家福利公告:CSDN博客积分系统升级有奖试读&征文:我们在互联网上奋斗的故事参与话题讨论,好礼等你拿深圳微信开发者大会不容错过的十大理由STM32F4的I2C读取BMP085模块的温度和气压分类:STM322013-03-06 14:192909人阅读评论(16)收藏举报这个i2c搞了好几天,网上很多人都讲这是ST封装库的问题,而且基本上讲的都是STM32F1系列的片子,甚至给出了一些他们自己研究的成果,至于F4,这方面的说法不多。没办法,从头来吧。研究了下BMP085的datasheet,就是要用I2C读写寄存器,地址为0xee(写),从而计算温度和气压。创建了一个项目文件,把I2C的库文件放进去,写main函数首先配置uart1和I2c: USART_Configuration();/这个函数就不说了,问题不大 I2C_Configuration();主要说下这个函数的内容,源码:#define I2C_BMP085 I2C1void I2C_Configuration(void)I2C_InitTypeDef I2C_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C_BMP085);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0xEE; /BMP085地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; /ack enableI2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; /100kI2C_Cmd(I2C_BMP085, ENABLE);I2C_Init(I2C_BMP085, &I2C_InitStructure);/I2C_AcknowledgeConfig(I2C_BMP085, ENABLE);开始在这个函数里面犯了个低级的错误,误将RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE)写为RCC_AHB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE),这是在复制过程中容易出现的问题。结果会导致的问题就是程序一直停在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT);,这句话会出现在后面的I2C读函数I2C_Read中。这个比较好理解,因为时钟没开,所以F4的I2C的寄存器都没有写进去,I2C还没有开始工作。I2C_Read()函数的源码:char value2;uint8_t I2C_Read(uint8_t addr) while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY);I2C_AcknowledgeConfig(I2C1, ENABLE); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C1, 0xee, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C1, addr); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTART(I2C1, ENABLE);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C1, 0xee, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED); /* EV7 */ value0 = I2C_ReceiveData(I2C1); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED); /* EV7 */ value1 = I2C_ReceiveData(I2C1); /cal_data = value08 | value1;/printf(buf0 = %x,buf1 = %x,%d,%drn,buf0,buf1,(buf08|buf2),cal_data); /* Decrement the read bytes counter */I2C_AcknowledgeConfig(I2C1, ENABLE);return 0; 在这个函数中也遇到了问题,又是因为复制代码,没有看清楚,误将while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)写为while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED),导致的问题就是程序一直停在while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED),为什么在这里死循环我还没搞明白。如果没有出现上述的错误,这时候就可以在main函数里面添加函数read_calibration_data()去读BMP085内部E2PROM的校准数据了下面整理出最终的代码uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t *buf,uint16_t num) if(num=0)return 1; while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY);I2C_AcknowledgeConfig(I2Cx, ENABLE); I2C_GenerateSTART(I2Cx, ENABLE); while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2Cx, addr); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); while (num) if(num=1) I2C_AcknowledgeConfig(I2Cx, DISABLE); I2C_GenerateSTOP(I2Cx, ENABLE); while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED); /* EV7 */ *buf = I2C_ReceiveData(I2Cx); buf+; /* Decrement the read bytes counter */ num-; I2C_AcknowledgeConfig(I2Cx, ENABLE);return 0; uint8_t I2C_Write(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t value)while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY) I2C_GenerateSTART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2Cx, addr);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_SendData(I2Cx, value);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTOP(I2Cx, ENABLE); I2C_AcknowledgeConfig(I2Cx, DISABLE);/I2C_delay(200000);/4.5msreturn 0;void temp_calibration(void)uint8_t buf2; I2C_Read(Open_I2C,ADDR_24LC02,0xaa,buf, 2);ac1 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xac,buf, 2); ac2 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xae,buf, 2); ac3 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xb0,buf, 2); ac4 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xb2,buf, 2); ac5 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xb4,buf, 2); ac6 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xb6,buf, 2); b1 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xb8,buf, 2); b2 = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xba,buf, 2); mb = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xbc,buf, 2); mc = buf0 8 |buf1; I2C_Read(Open_I2C,ADDR_24LC02,0xbe,buf, 2); md = buf0 8 |buf1; printf(ac1=%d,ac2=%d,ac3=%d,ac4=%d,ac5=%d,ac6=%d,b1=%d,b2=%d,mb=%d,mc=%d,md=%drn,ac1,ac2,ac3,ac4,ac5,ac6,b1,b2,mb,mc,md);int main(void)long x1,x2,x3,b3,b5,b6,b7,press_reg,pressure,temp_reg,temp; unsigned long b4; int ret,i; uint8_t ReadBuffer10;/unsigned short ; /unsigned int ; char oss = 0; /这个值在读气压时可以置进寄存器/GPIO_Configuration();USART_Configuration();I2C_Configuration();printf(rn*rn);while (1) printf(rn Read start rn); temp_calibration(); /read uncompensated temperature I2C_WriteOneByte(Open_I2C,ADDR_24LC02,0xf4,0x2e); I2C_delay(200000);/delay 4.5ms ret = I2C_Read(Open_I2C,ADDR_24LC02,0xf6,ReadBuffer,2); temp_reg = ReadBuffer0 15; x2 = (mc 4; printf(x1:%d, x2:%d, b5:%d, temp(*0.1):%d rn,x1,x2,b5,temp); /read uncompensated pressure I2C_WriteOneByte(Open_I2C,ADDR_24LC02,0xf4,(0x3e + oss6); I2C_delay(200000);/delay 4.5ms ret = I2C_Read(Open_I2C,ADDR_24LC02,0xf6,ReadBuffer,3); press_reg = (ReadBuffer0 16) | (ReadBuffer1 (8 - oss); printf(press_reg %d rn,press_reg); /下面计算公式要注意括号的使用,模棱两可的都给它用上,一开始我觉得有些地方应该可以不用,计算出的气压结果却是错的,后来加上括号就对了 b6 = b5 - 4000; printf(b6 %ld rn,b6); x1 = (b2 * (b6 * b6 ) 12) 11; printf(x1 %ld rn,x1); x2 = (ac2 * b6) 11; printf(x2 %ld rn,x2); x3 = x1 + x2; printf(x3 %ld rn,x3); b3 = (long)ac1 * 4 + x3) 13; printf(x1 %ld rn,x1); x2 = (b1 * (b6 * b6) 12) 16; printf(x2 %ld rn,x2); x3 = (x1 + x2 )+ 2) 2; printf(x3 %ld rn,x3); b4 = (ac4 * (unsigned long)(x3 + 32768) 15; printf(b4 %ld rn,b4); b7 = (unsigned long)press_reg - b3) * (50000 oss); printf(b7 %ld rn,b7); if(b7 8) * (pressure 8); printf(x1 %ld rn,x1); x1 = (x1 * 3038) 16; printf(x1 %ld rn,x1); x2 = (-7357 * pressure) 16; printf(x2 %ld rn,x2); pressure = pressure + (x1 + x2 + 3791) 4); printf(pressure %ld rn,pressure); for(i=0; i200*3; i+) I2C_delay(200000);/delay 4.5ms终端看到的打印:Read startac1=8361,ac2=-816,ac3=-14464,ac4=33064,ac5=25477,ac6=25325,b1=5498,b2=38,mb=-32768,mc=-11075,md=2432temp_reg 33455x1:6321, x2:-2591, b5:3730, temp(*0.1):233press_reg 33455b6 -270x1 0x2 107x3 107b3 8388x1 476x2 1x3 119b4 33184b7 1253350000pressure 75539x1 87025x1 4034x2 -8480pressure 75498温度2330.1=23.3度气压为75498Pa 上一篇STM32F407的UDP发送数据 下一篇STM32 F207的PWM输入捕获频率和占空比主题推荐stm32bmptypedef源码工作猜你在找STM32学习笔记(串口、IAP)stm32f407之ADC(操作寄存器)STM32F103 IIC调试硬件I2CSTemWin如何启用Multiple Buffering功能c#中转出Excel时碰到Excel的COM组件没有注册的问题解决方法Bugzilla 在Windows下巧妙安裝STM32 对内部FLASH读写接口函数USB/HID设备报告描述符详解Delphi图像处理 - 灰色浮雕查看评论9楼茶亦爽2014-04-08 15:35发表回复楼主的程序有问题。8楼茶亦爽2014-04-08 14:34发表回复你好,我测得气压数据更小,只有45958,似乎不对啊!请指教。7楼tahir2013-09-28 14:39发表回复Hi, unfortunately i dont know chinese, can you send me full project to my mail ?嗨,不幸的是我不知道中國,你能送我完整的項目到我郵箱?The best greetingsTakhir abdullaev.Re:stephen_kl2013-09-29 12:23发表回复回复u012278035:邮件发不出去请到/detail/stephen_yu/6337657我的资源区下载6楼roma11412013-09-21 01:51发表回复对不起,请给原项目BMP085再次在这里的私人讯息,因为我没来.太谢谢你了,对不起Re:stephen_kl2013-09-29 12:24发表回复回复u011775879:邮件发不出去请到/detail/stephen_yu/6337657我的资源区下载Re:stephen_kl2013-09-24 15:19发表回复回复u011775879:你的邮箱地址是不是有问题,邮件发不出去5楼roma11412013-09-21 01:50发表回复对不起,请给原项目BMP085再次在这里的私人讯息,因为我没来.太谢谢你了,对不起。Re:roma11412013-09-21 01:53发表回复重复,我深表歉意4楼roma11412013-09-21 01:50发表回复对不起,请给原项目BMP085再次在这里的私人讯息,因为我没来.太谢谢你了,对不起。3楼roma11412013-08-22 00:13发表回复尊敬的于康龙请我甩开你的源代码STM32F4 BMP085。对不起,我 - 俄罗斯,中国人不知道,我这样做,我不能为自己的智能家居了解传感器(BMP085)。我是新的STM32/我的邮箱是:非常感谢!Dear 于康龙 please throw off me your source code stm32f4 bmp085. Im sorry, I - Russian, Chinese do not know, I do for myself smart home, I can not understand this sensor (bmp085). Im new to the STM32 /my email is: Big thanks!Re:stephen_kl2013-08-28 18:54发表回复回复u011775879:已发2楼lyhjason2013-07-25 16:18发表回复hi,您好!我的I2C读取MPU6050的,一直在死循环在while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED),请问您研究出来怎么修正了吗?多谢赐教,QQ:1067815671Re:stephen_kl2013-08-28 18:54发表回复回复lyhjason:发给你了1楼lynnet2013-06-03 22:49发表回复你好,请问你测试的地点海拔高度是多少,我测出来的气压数据只有55443,显然不对。一般海平面附近数据大致都是一千多一点,我用其它气压表测量的结果是1032mPa;手工计算结果和程序结果是一致的。Re:stephen_kl2013-08-28 18:51发表回复回复lynnet:我是在南京测的,没有气压计,所以准确性也不敢保证您还没有登录,请登录或注册* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场核心技术类目全部主题HadoopAWS移动游戏JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript数据库UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhoneCouchBase云计算iOS6RackspaceWeb AppSpringSideMaemoCompuware大数据aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap个人资料stephen_klo 访问:113302次o 积分:1721o 等级:o 排名:第8863名o 原创:31篇o 转载:156篇o 译文:0篇o 评论:86条链接o Essential Linux Device Driver笔记o Essential Linux Device Driver翻译o 哥德巴赫猜想的blogo 陈莉君o 中国源码网o 网卡技术blogo developerworks专区o 嵌入式Linux之我行文章搜索窗体顶端窗体底端文章分类 LINUX设备驱动(28) STM32(23) windows驱动(17) 内核(13) 基础知识(13) 嵌入式(23) 总线(CAN、RS485.)(2) 生活(3) 编程(5) 网络设备(20) 英语学习(1) 调试仿真-ADS1.2,MDK(0) 调试仿真-ADS1.2(2) MDK(3) RT_thread操作系统(0) rt_thread(1) Android(16) 随手记(14) linux video(1)文章存档 2014年10月(1) 2014年09月(2) 2014年08月(5) 2014年07月(1) 2014年06月(2)展开评论排行 STM32F4的I2C读取BMP085模块的温度和气压(16) mini210开发板的SPI驱动的应用程序(13) error 65: access violation at 0x40021000 : no read permission(12) 亲子中心幼儿关于淘宝日本明治奶粉的真假(7) 微雪的STM32F407开发板+友善之背的wifi模块SDWIFI-YS09测试(6) 简单的套接字发送数据包(5) arm-none-linux-gnueabi-gcc 版本下载(4) windows与虚拟机下的socket通信(3) linux3.0内核移植问题记录(3) STM32F407的UDP发送数据(2)推荐文章最新评论 arm-none-linux-gnueabi-gcc 版本下载sky12125: 没有更高的版本了吗? error 65: access violation at 0x40021000 : no read permissionthereywb: 厉害啊楼主,问题解决了 Linux下SPI驱动的移植和应用程序的测试liufeifeivip:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省浙里特色联盟2025-2026学年高一下学期4月期中联考生物学试卷(含解析)
- 用户界面设计原则总结
- 《生活处处有哲学》教学设计-高品质版
- 2025新皮肤病理学切片试题及答案
- 2025新国家网络安全知识竞赛题库附含答案(基础题)
- 2026冷冻食品行业消费者购买行为变化供应链管理分析投资布局规划
- 2026中国养老产业供需缺口分析与服务模式创新研究报告
- 2025中医药知识与技能竞赛题库附含参考答案
- 2025新社区工作人员资格真题库与答案
- 江苏省无锡市祝塘中学2026届中考英语最后冲刺模拟试卷含答案
- 浙江省金华市(2026年)辅警协警笔试笔试真题(附答案)
- 养老护理员工作倦怠与应对
- 建筑工程进场材料、构配件和设备质量控制工作标准
- 骨折病人的院前急救
- 吉利并购沃尔沃的协同效应
- svw cpc验收srb311电气movifit sc操作手册
- 中大国际九号
- GB/T 14413-1993船用舷窗
- GB/T 14048.7-2016低压开关设备和控制设备第7-1部分:辅助器件铜导体的接线端子排
- 2022~2023血站上岗证考试题库及答案参考85
- 第五章-钢的热处理及表面处理技术课件
评论
0/150
提交评论