我的接口 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);
}