历史上的今天
返回首页

历史上的今天

今天是: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)<>2;

   

  // 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.                                                            */

推荐阅读

史海拾趣

AND Displays公司的发展小趣事

随着技术实力的增强和产品线的丰富,AND Displays开始积极拓展市场。公司不仅在国内建立了完善的销售网络,还积极开拓海外市场。通过与全球各大电子产品制造商的合作,AND Displays的显示面板逐渐进入了全球供应链,品牌影响力不断提升。同时,公司还注重品牌建设,通过参加国际展览、举办技术研讨会等方式,提升品牌知名度和美誉度。

HELUKABEL公司的发展小趣事

为了降低成本、提高生产效率,AND Displays开始着手整合产业链。公司通过与上游原材料供应商建立长期合作关系,确保原材料的稳定供应和价格优势。同时,公司还加强了对下游客户的服务与支持,通过提供定制化解决方案和优质的售后服务,增强了客户黏性。此外,AND Displays还不断优化生产流程,提高生产效率,进一步降低了生产成本。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

Dongguan Jingyue Electronics Co Ltd深知市场拓展的重要性。在立足本土市场的基础上,公司积极开拓国际市场,通过参加国际展会、建立海外销售渠道等方式,不断提升品牌知名度和市场份额。同时,公司还注重品牌建设,通过提升产品质量、优化售后服务等方式,增强消费者对品牌的信任感和忠诚度。

ASI [ASI Semiconductor, Inc]公司的发展小趣事

在竞争激烈的电子行业中,创新是企业持续发展的关键。ASI深知这一点,因此一直致力于技术创新和产品升级。通过不断投入研发资源、引进先进技术以及与高校和研究机构的合作,ASI成功推出了一系列具有竞争力的新产品和解决方案。这些创新不仅提升了ASI的市场竞争力,还为其未来的发展注入了强大的动力。

这些故事展示了ASI Semiconductor, Inc.从创立到发展成为电子行业领导者的过程。通过抓住市场机遇、提升产品质量、拓展全球市场、创新技术和优质服务,ASI成功地实现了自身的快速发展,并在行业中树立了良好的声誉。

Hama公司的发展小趣事

为了提升产品的市场竞争力,H&D Wireless积极寻求技术合作。20XX年,公司与全球领先的微控制器解决方案提供商爱特梅尔(Atmel)携手,共同推出了基于AVR®微控制器的IEEE802.11b+g Wi-Fi解决方案。这一合作不仅提升了H&D Wireless产品的功耗效率和连接稳定性,还显著缩短了客户的产品开发周期。通过不断优化产品性能,H&D Wireless的Wi-Fi解决方案在市场上获得了广泛认可。

AirBorn公司的发展小趣事

AirBorn公司成立于1958年,总部位于得克萨斯州奥斯汀。在创立之初,AirBorn就致力于设计、制造和销售高性能连接器和电缆组件。随着电子技术的飞速发展,AirBorn敏锐地捕捉到航空航天领域对高性能连接器的需求,并开始了针对这一领域的定制化产品研发。凭借卓越的技术实力和创新能力,AirBorn很快在航空航天连接器市场占据了一席之地。

问答坊 | AI 解惑

发动机ECU硬件简介

为了把发动机ECU的知识提高,今天简要的把ECU硬件构成推出,欢迎讨论! 中国汽车的发动机ECU基本上被国外电子商垄断,国产的不是这个原因或是那个原因,而没有充分应用,国产的市场占有率很低.但可以说硬件是相似的.: 主芯片为16位单片机,英飞凌的C167, ...…

查看全部问答>

常用大功率管手册

希望能对大家又一些帮助…

查看全部问答>

加速度传感器测量电路

加速度传感器测量电路…

查看全部问答>

大家好,问一个比较基础的问题FILE *fp;

#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】GEL文件的功能?

        每天都抽点时间问一个问题,给自己解决问题,也是给大家一个学习的机会。 希望大家一起讨论,深入的学习下。也请专家给予我们相信的解答。         GEL文件 ...…

查看全部问答>

BeagleBoard学习资料,供大家下载

第一讲 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 ...…

查看全部问答>