This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:获取错误的 bme280传感器中温度的原始值

Guru**** 2618835 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/674795/msp430g2553-getting-wrong-raw-value-for-temperature-in-bme280-sensor

器件型号:MSP430G2553

我的接口 bme280与 MSP430的 SPI 通信。我使用了博世定义的算法来计算温度。但它显示了错误的值。

 是否需要发送命令才能开始转换? 我找不到任何用于启动转换的命令。

下面是我的代码。   

#include

#define DLY 8000
long int 数据、reset、con_hum、cont_meas、status、pressed[4]、temp[4];
unsigned short int tem_dig1[2]、Tem_Dig1;
短整型 intem_dig2[2]、tem_dig3[2]、Tem_Dig2、Tem_Dig3;
long int Raw_Temp、Real_temp;
long int var1、var2、T、t_fine;
/**
* main.c
*
void clockConfig (void);
void UART_init (void);
void SPI_init (void);
void UART_Put (char 字节);
int sensor_read (char data);
void SPI_write (char 字节);
char SPI_read (void);
void calibred_temp_values ()

TEM_dig1[0]= SENSOR_READ (0x89);
TEM_dig1[1]=SENSOR_READ (0x88);
TEM_dig2[0]= SENSOR_READ (0x8B);
TEM_dig2[1]=SENSOR_READ (0x8A);
TEM_dig3[0]= SENSOR_READ (0x8D);
TEM_dig3[1]=SENSOR_READ (0x8C);

void get_actual_values()

TEM_Dig1=(tem_dig1[0][<8)+tem_dig1[1];
TEM_Dig2=(tem_dig2[0][<8)+tem_dig2[1];
TEM_Dig3=(tem_dig3[0][<8)+tem_dig3[1];

void get_raW_values_temp ()

TEMP[0]= SENSOR_READ (0xFA);
TEMP[1]=SENSOR_READ (0xFB);
temp[2]= sensor_read (0xFC);
RAW_TEMP=(temp[0]<<12)+(temp[1]<4)+temp[2];

long int actual_temp()

VAR1 =(((Raw_Temp>>3)-(Tem_Dig1<<1)* Tem_Dig2)>> 11;
VAR2=((((((( raW_Temp>>4)-(Tem_Dig1)*((Raw_Temp>>4)-(Tem_Dig1)))>12*(Tem_Dig3)>14;
T_fine = var1 + var2;
t =(t_fine * 5 + 128)>> 8;
返回 T;


int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
clockConfig();


UART_INIT();


spi_init();


P1DIR |= BIT0;


P1OUT |= BIT0;


UART_Put ('a');


DATA=SENSOR_READ (0xD0);


RESET=SENSOR_READ (0xE0);


CON_Hum=SENSOR_READ (0xF2);

STATUS=SENSOR_READ (0xF3);

cont_meas = sensor_read (0xF4);


calibred_temp_values ();


get_actual_values();


get_raW_values_temp ();


Real_temp=Actual_temp();


__no_operation();


void clockConfig (void)(空)

//配置 CPU 时钟(MCLK)
//从 DCO @ 8MHz 和 SMCLK = DCO /2运行
BCSCTL1 = CALBC1_8MHZ;//设置 DCO
DCOCTL = CALDCO_8MHZ;
BCSCTL2= DIVS_1 + DIVM_0;//除法器=2表示 SMCLK、除法器=1表示 MCLK


void UART_init (void)

P1SEL |= BIT1 + BIT2;// P1.1 = RXD、P1.2=TXD
P1SEL2 |=BIT1 + BIT2;// P1.1 = RXD、P1.2=TXD

UCA0CTL1 = UCSWRST;//复位
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 0xA0;// 9600波特率// 0x08;// 1MHz 115200
UCA0BR1 = 0x01;// 1MHz 9600
UCA0MCTL = UCBRS2 | UCBRS1;//UCBRF_1 | UCOS16;// 9600
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
//UC0IE |= UCA0RXIE;//启用 USCI_A0 RX 中断

void SPI_init (void)

//为端口1的引脚5、6和7设置引脚模式3 (USCI 模式)
P1SEL |= BIT5 + BIT6 + BIT7;//引脚5、6和7的低位= 1位3为0 (CS 通过 GPIO)
P1SEL2 |= BIT5 + BIT6 + BIT7;//引脚5、6和7的高位= 1位3为0 (通过 GPIO 连接 CS)

P1DIR |= BIT4;// p1.4设置为输出以驱动 CS
P1OUT |= BIT4;//将 p1.4拉至高电平- CS 高电平->芯片被禁用

UCB0CTL1 = UCSWRST;

//同步(=SPI)主器件3线 SPI、空闲时的时钟极性低
// SPI 模式0
UCB0CTL0 |= UCCKPH | UCMST | UCSYNC | UCMSB | UCMODE_0;

UCB0CTL1 |= UCSSEL_2;//使用 SCLK:4MHz

//设置波特率= SMCLK,除以4,SPI 时钟频率:1MHz
UCB0BR0 = 0x04;
UCB0BR1 = 0;
UCB0CTL1 &=~UCSWRST;//**初始化 USCI **


空 UART_Put (字符字节)

UCA0TXBUF =字节;
while (!(IFG2 & UCA0TXIFG));

int sensor_read (字符数据)

int ch = 1;

P1OUT &=~BIT4;//启用器件
_delay_cycles (DLY);
SPI_WRITE (DATA);
SPI_WRITE (0xFF);
while (((UCB0STAT & UCBUSY));//等待发送过程繁忙

CH = SPI_READ();

_delay_cycles (DLY);
P1OUT |= BIT4;//禁用器件

返回(ch);

空 SPI_WRITE (字符字节)

UCB0TXBUF =字节;
while (!(IFG2 & UCB0TXIFG));

char SPI_Read (空)

while (!(IFG2 & UCB0RXIFG));// USCI_B0 RX 是否被接收?
返回(UCB0RXBUF);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >是否需要发送命令才能开始转换?
    当我读取 BST-BME280-DS001-10时、您必须将 Ctrl_meas 设置为"Normal"模式(它在"SLEEP"模式下复位)才能使其运行。 这将是对地址0x74写入值0x03 (表18、5.4.5秒)。 您将需要 sensor_write(),但这应该是对 sensor_read()的简单更改。

    > Raw_Temp=(temp[0])<<12)+(temp[1]<<4)+temp[2];
    0xFC 中的有效位为高电平4、而不是低电平4 (表18)。 尝试:
    > Raw_Temp=(temp[0]<<12)+(temp[1]<4)+(temp[2]>> 4);

    我还没有在 actual_temp()中进行过算术运算,尽管移动有符号值通常会让我有点紧张。 我建议,一旦您开始获取数据,您就可以使用计算器或纸张来查看您是否得到了博世所说的内容。 保存一些代码的中间值、以帮助您缩小任何差异。