历史上的今天
今天是:2025年03月12日(星期三)
2020年03月12日 | 在msp430上使用BMP085
2020-03-12 来源:eefocus
属于msp430的软件实现IIC的应用。记得当初调试的时候,对着示波器看了好久的时钟。在不同单片机上使用时一定要注意时钟大小,注意SDK与SDA是否按手册上给出的波形变化。
使用器件型号:msp430F169/msp430F149,BMP085@BOSCH
典型应用电路:

bmp.c
#include #include "BMP.h" #include //大气压强传感器 //参数定义 long pressure,temperature; float altitude; 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; void Delay_ms(unsigned long nValue) { unsigned long nCount=106; int i; unsigned long j; for(i = nValue;i > 0;i--) { for(j = nCount;j > 0;j--); } } /************************************** 起始信号 **************************************/ void Start() { pSCL_OUT; pSDA_OUT; pSCL_H; pSDA_H; Delay_ms(4); pSDA_L; Delay_ms(4); pSCL_L; } // //void Start() //{ // SCL_OUT; // SDA_OUT; // // SCL_H; // Delay_ms(2); // SDA_H; // Delay_ms(2); // SDA_L; // Delay_ms(2); // SCL_L; // Delay_ms(2); //} /************************************** 停止信号 **************************************/ void Stop() { pSDA_OUT; pSCL_H; // SCL_L; pSDA_L; Delay_ms(4); pSCL_H; pSDA_H; Delay_ms(4); } /************************************** 发送应答信号 **************************************/ void SendACK(void) { pSCL_L; pSDA_OUT; pSDA_L; Delay_ms(2); pSCL_H; Delay_ms(2); pSDA_L; } void SendNoACK(void) { pSCL_L; pSDA_OUT; pSDA_H; Delay_ms(2); pSCL_H; Delay_ms(2); pSCL_L; } /************************************** 接收应答信号 **************************************/ uint8_t RecvACK() { char ucErrTime=0; pSCL_L;Delay_ms(2);///////////////////// pSDA_IN; pSCL_H;Delay_ms(2); while(pSDA_RIN) { ucErrTime++; if(ucErrTime>250) { Stop(); return 1; } } pSCL_L; Delay_ms(2); return 0; // SDA_IN; // Delay_ms(2); // _NOP(); // _NOP(); // _NOP(); // _NOP(); // t=SDA_RIN; // Delay_ms(2); // _NOP(); // _NOP(); // _NOP(); // _NOP(); // SCL_L; // Delay_ms(2); } /************************************** 向IIC总线发送一个字节数据 **************************************/ //void SendByte(uint8_t dat) //{ // uint8_t i; // // SDA_OUT; // // for (i=0; i<8; i++) //8位计数器 // { // if((dat& 0x80)>>7) // SDA_H; // else // SDA_L; // dat<<=1; // Delay_ms(2); // SCL_H; // Delay_ms(2); // SCL_L; // Delay_ms(2); // } // RecvACK(); // //} void SendByte(uint8_t dat) { uint8_t i; pSDA_OUT; for (i=0; i<8; i++) //8位计数器 { pSCL_L; Delay_ms(2); if((dat& 0x80)>>7) pSDA_H; else pSDA_L; dat<<=1; Delay_ms(2); pSCL_H; Delay_ms(2); } pSCL_L; Delay_ms(2); pSDA_H; Delay_ms(2); RecvACK(); } uint8_t RecvByte() { uint8_t i,dat=0; pSDA_IN; Delay_ms(2); for(i=0;i<8;i++) { pSCL_L; Delay_ms(2); pSCL_H; dat<<=1; if(pSDA_RIN)dat++; Delay_ms(1); } pSDA_OUT; return dat; } short Multiple_read(uint8_t ST_Address) { uint8_t msb, lsb; short _data; Start(); //起始信号 SendByte(0xEE); //发送设备地址+写信号 SendByte(ST_Address); //发送存储单元地址 Start(); //起始信号 SendByte(0xEF); //发送设备地址+读信号 msb = RecvByte(); //BUF[0]存储 SendACK(); //回应ACK lsb = RecvByte(); SendNoACK(); //最后一个数据需要回NOACK Stop(); //停止信号 Delay_ms(5); _data = ((short)msb) << 8; _data |= lsb; return _data; } long bmp085ReadTemp(void) { Start(); //起始信号 SendByte(0xEE); //发送设备地址+写信号 SendByte(0xF4); // write register address SendByte(0x2E); // write register data for temp Stop(); //发送停止信号 Delay_ms(5); // max time is 4.5ms return (long) Multiple_read(0xF6); } long bmp085ReadPressure(void) { long pressure = 0; Start(); //起始信号 SendByte(0xEE); //发送设备地址+写信号 SendByte(0xF4); // write register address SendByte(0x34); // write register data for pressure Stop(); //发送停止信号 Delay_ms(5); // max time is 4.5ms pressure = (long) Multiple_read(0xF6); pressure &= 0x0000FFFF; return pressure; } void Init_BMP085(void) { ac1 = Multiple_read(0xAA); ac2 = Multiple_read(0xAC); ac3 = Multiple_read(0xAE); ac4 = Multiple_read(0xB0); ac5 = Multiple_read(0xB2); ac6 = Multiple_read(0xB4); b1 = Multiple_read(0xB6); b2 = Multiple_read(0xB8); mb = Multiple_read(0xBA); mc = Multiple_read(0xBC); md = Multiple_read(0xBE); } //long bmp085_calc_pressure void bmp085Convert() { unsigned int ut; unsigned long up; long x1, x2, b5, b6, x3, b3, p; unsigned long b4, b7; ut = bmp085ReadTemp(); ut = bmp085ReadTemp(); // 读取温度 up = bmp085ReadPressure(); // 读取压强 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15; x2 = ((long) mc << 11) / (x1 + md); b5 = x1 + x2; temperature = ((b5 + 8) >> 4); b6 = b5 - 4000; // Calculate B3 x1 = (b2 * (b6 * b6)>>12)>>11; x2 = (ac2 * b6)>>11; x3 = x1 + x2; b3 = (((((long)ac1)*4 + x3)< // Calculate B4 x1 = (ac3 * b6)>>13; x2 = (b1 * ((b6 * b6)>>12))>>16; x3 = ((x1 + x2) + 2)>>2; b4 = (ac4 * (unsigned long)(x3 + 32768))>>15; b7 = ((unsigned long)(up - b3) * (50000>>OSS)); if (b7 < 0x80000000) p = (b7<<1)/b4; else p = (b7/b4)<<1; x1 = (p>>8) * (p>>8); x1 = (x1 * 3038)>>16; x2 = (-7357 * p)>>16; pressure = p+((x1 + x2 + 3791)>>4); altitude=44330 * (1-pow((p/ 101325.0),(1.0/5.255))); } void uint_uart(void) { P5SEL = 0x00; //P5SEL |=BIT2; // P5SEL &=~ BIT1; // P5DIR &=~BIT1; P5DIR |= BIT1+BIT2; BCSCTL1=(XT2OFF+RSEL2); DCOCTL=DCO2; pSCL_OUT; pSDA_OUT; pSCL_H; pSDA_H; } /***FUNC+*********************************************************************/ /* Name : Init_CLK */ /* Descrp : Set PLL Clock. */ /* Input : None. */ /* Output : None. */
史海拾趣
|
为了把发动机ECU的知识提高,今天简要的把ECU硬件构成推出,欢迎讨论! 中国汽车的发动机ECU基本上被国外电子商垄断,国产的不是这个原因或是那个原因,而没有充分应用,国产的市场占有率很低.但可以说硬件是相似的.: 主芯片为16位单片机,英飞凌的C167, ...… 查看全部问答> |
|
#define CONFIGUATION_TEXT \"&Client\\r\\nport=%d\\r\\nbaud=%d\\r\\n\" char *pData= (char*)malloc(sizeof(char)*2048); sprintf(pData,CONFIGUATION_TEXT,m_port,m_baud); char * ...… 查看全部问答> |
|
欧胜发布用于便携式数字音频应用的超低功耗音频中心解决方案 欧胜微电子有限公司 时间:2010年07月30日 英国爱丁堡,2010年7月29日——欧胜微电子有限公司今日宣布推出编号为WM8962的业界领先的超低功耗立体 ...… 查看全部问答> |
|
第一讲 TI嵌入式处理器平台及开发工具CCS简介 第二讲 基于CCS的系统设计及DSP_BIOS介绍 第三讲 CCS下基于NDK的应用开发流程 第四讲 CCS下OpenCV算法库的移植及应用方法 第五讲 TI嵌入式处理器的启动及uBOOT分析 第七讲 TI多核嵌 ...… 查看全部问答> |
|
Mentor Expedition PCB 7.9.4完整教程 Mentor Expedition PCB 7.9.4完整教程,可惜是英文的。 https://download.eeworld.com.cn/detail/jiajiavsbbxu/551280 … 查看全部问答> |
|
国内知名IC设计公司急聘SOC Verification Engineer!!!工作地点:上海 本帖最后由 wswjm777 于 2015-7-9 15:55 编辑 Dear All, 国内知名IC设计公司急聘SOC Verification Engineer!!!工作地点:上海,欢迎投递简历至:Jessicawu2308@hotmail.com或加qq:931297119进行咨询 薪资20-35w,具体可谈,JD如下: JOB RESP ...… 查看全部问答> |




