263 lines
6.1 KiB
C
263 lines
6.1 KiB
C
#include "mf5803.h"
|
||
|
||
/*
|
||
** 返回值 : temp--SPI读取的一字节数据
|
||
** 描 述 : 下降沿读数据,每次读取 1 bit
|
||
*/
|
||
uint8_t SPI_Read_OneByte(void)
|
||
{
|
||
uint8_t i;
|
||
uint8_t temp = 0;
|
||
for (i = 0; i < 8; i++)
|
||
{
|
||
//读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为:
|
||
//读取最后1byte的最后一位(即LSB)之后,不能再左移了
|
||
temp <<= 1;
|
||
MF5803_SCK(1);
|
||
delay_tick(10);
|
||
if(MF5803_MISO) //读取最高位,保存至最末尾,通过左移位完成读整个字节
|
||
temp |= 0x01;
|
||
else
|
||
temp &= ~0x01;
|
||
delay_tick(10);
|
||
MF5803_SCK(0);
|
||
delay_tick(10);
|
||
}
|
||
return temp;
|
||
}
|
||
|
||
/*
|
||
** 参 数 : u8_writedata--SPI写入的一字节数据
|
||
** 描 述 : 上升沿写数据,每次写入 1 bit
|
||
*/
|
||
void SPI_Write_OneByte(uint8_t u8_writedata)
|
||
{
|
||
uint8_t i;
|
||
for (i = 0; i < 8; i++)
|
||
{
|
||
delay_tick(10);
|
||
if (u8_writedata & 0x80) //判断最高位,总是发送最高位
|
||
{
|
||
MF5803_MOSI(1); //MOSI输出1,数据总线准备数据1
|
||
}
|
||
else
|
||
{
|
||
MF5803_MOSI(0);//MOSI输出0,数据总线准备数据0
|
||
}
|
||
MF5803_SCK(1); //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件
|
||
delay_tick(10);
|
||
u8_writedata <<= 1; //左移抛弃已经输出的最高位
|
||
MF5803_SCK(0); //拉低SCK信号,初始化为0
|
||
delay_tick(10);
|
||
}
|
||
}
|
||
/*
|
||
** 返回值 : u8_readdata--SPI读取的一字节数据
|
||
** 参 数 : u8_writedata--SPI写入的一字节数据
|
||
** 描 述 : 上升沿写,下降沿读
|
||
*/
|
||
uint8_t SPI_WriteAndRead_OneByte(uint8_t u8_writedata)
|
||
{
|
||
uint8_t i;
|
||
uint8_t u8_readdata = 0x00;
|
||
for (i = 0; i < 8; i++)
|
||
{
|
||
u8_readdata <<= 1;//读取MISO 8次输入的值,存入u8_readdata
|
||
if (u8_writedata & 0x80)//判断最高位,总是写最高位(输出最高位)
|
||
MF5803_MOSI(1);//MOSI输出1,数据总线准备数据1
|
||
else
|
||
MF5803_MOSI(0);//MOSI输出0,数据总线准备数据0
|
||
u8_writedata <<= 1;//左移抛弃已经输出的最高位
|
||
MF5803_SCK(1);//上升沿来了(SCK从0-->1),数据总线上的数据写入器件
|
||
if(MF5803_MISO)//读取最高位,保存至最末尾,通过左移位完成读整个字节
|
||
u8_readdata |= 0x01;
|
||
else
|
||
u8_readdata &= ~0x01;
|
||
MF5803_SCK(0);//下降沿来了(SCK从1-->0),MISO上将产生新的数据,读取存入u8——readdata
|
||
}
|
||
return u8_readdata;
|
||
}
|
||
|
||
|
||
uint8_t RawData[5];
|
||
uint8_t* GetSensorData()
|
||
{
|
||
//重置清0
|
||
memset(RawData, 0, sizeof(uint8_t) * 5);
|
||
//采集温度数据
|
||
wf5803_WriteReg(0x30, 0x08);
|
||
delay_ms(2);
|
||
RawData[3] = wf5803_ReadReg(0x09);
|
||
RawData[4] = wf5803_ReadReg(0x0A);
|
||
|
||
//采集气压数据
|
||
wf5803_WriteReg(0x30, 0x09);
|
||
delay_ms(3);
|
||
RawData[0] = wf5803_ReadReg(0x06);
|
||
RawData[1] = wf5803_ReadReg(0x07);
|
||
RawData[2] = wf5803_ReadReg(0x08);
|
||
|
||
return RawData;
|
||
}
|
||
|
||
/*
|
||
** 参 数 : (1)uint8_t addr--寄存器地址
|
||
** (2)uint8_t value--写入值
|
||
** 说 明 : wf5803寄存器写函数
|
||
*/
|
||
void wf5803_WriteReg(uint8_t addr, uint8_t value)
|
||
{
|
||
clrcs();//CS片选拉低
|
||
SPI_Write_OneByte(0x00);//SPI写地址命令
|
||
SPI_Write_OneByte(addr);
|
||
SPI_Write_OneByte(value);//SPI写数据
|
||
setcs();//CS片选拉高
|
||
}
|
||
|
||
/*
|
||
** 返回值: value--读取寄存器值
|
||
** 参 数 : addr--寄存器地址
|
||
** 说 明 : wf5803寄存器读函数
|
||
*/
|
||
uint8_t wf5803_ReadReg(uint8_t addr)
|
||
{
|
||
uint8_t value;
|
||
clrcs();//CS片选拉低
|
||
SPI_Write_OneByte(0x80);//SPI写地址命令
|
||
SPI_Write_OneByte(addr);
|
||
value = SPI_Read_OneByte();//SPI读数据
|
||
setcs();//CS片选拉高
|
||
return value;
|
||
}
|
||
|
||
void wf5803_ReadRegMulti(uint8_t addr, uint8_t lens, uint8_t* value)
|
||
{
|
||
clrcs();//CS片选拉低
|
||
if (lens == 1)
|
||
{
|
||
SPI_Write_OneByte(0x80);//SPI写地址命令
|
||
}
|
||
else if (lens == 2)
|
||
{
|
||
SPI_Write_OneByte(0xA0);//SPI写地址命令
|
||
}
|
||
else if (lens == 3)
|
||
{
|
||
SPI_Write_OneByte(0xC0);//SPI写地址命令
|
||
}
|
||
else
|
||
{
|
||
SPI_Write_OneByte(0xE0);//SPI写地址命令
|
||
}
|
||
SPI_Write_OneByte(addr);
|
||
for (uint8_t i = 0; i < lens; i++)
|
||
{
|
||
value[i] = SPI_Read_OneByte();//SPI读数据
|
||
}
|
||
setcs();//CS片选拉高
|
||
}
|
||
|
||
|
||
|
||
void mf5803_setup()
|
||
{
|
||
|
||
setcs();//CS片选拉高
|
||
|
||
SENSOR_SELECT(0);
|
||
delay_ms(10);
|
||
|
||
NSS_Select = 1;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
NSS_Select = 2;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
NSS_Select = 3;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
|
||
SENSOR_SELECT(1);
|
||
delay_ms(10);
|
||
NSS_Select = 4;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
NSS_Select = 5;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
NSS_Select = 6;
|
||
//0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI
|
||
wf5803_WriteReg(0x00, 0x81);
|
||
delay_ms(10);
|
||
|
||
NSS_Select = 1;
|
||
SENSOR_SELECT(0);
|
||
delay_ms(10);
|
||
}
|
||
|
||
long reading = 0;
|
||
float press = 0; //kPa
|
||
float temp = 0; //℃
|
||
float fDat;
|
||
uint8_t flt_cnt = 0;
|
||
float p_flt_window[6][FLT_SIZE] = {0}; //sliding window, sensor_1&2 -> pressure[A,B,S]
|
||
void mf5803_loop()
|
||
{
|
||
float sums = 0;
|
||
uint8_t* p1 = GetSensorData();
|
||
reading = p1[0];
|
||
reading = reading << 8;
|
||
reading |= p1[1];
|
||
reading = reading << 8;
|
||
reading |= p1[2];
|
||
if(reading >= 8388608)
|
||
{
|
||
fDat = (int32_t)(reading - 16777216) / 8388608.0f;
|
||
}
|
||
else
|
||
{
|
||
fDat = reading / 8388608.0f;
|
||
}
|
||
press = (10000 * fDat + 9000) / 12.0f; //单位0.1Kpa
|
||
|
||
p_flt_window[ NSS_Select -1 ][flt_cnt] = press*10; //滑动窗口记录
|
||
|
||
NSS_Select++;
|
||
|
||
if(NSS_Select > 3) //记录完3路气压后进入此处,每3*10ms
|
||
{
|
||
SENSOR_SELECT(1);
|
||
|
||
for( uint8_t i = 0; i < 6; i++ ) //均值滤波
|
||
{
|
||
sums = 0;
|
||
for( uint8_t j = 0; j < FLT_SIZE; j++ )
|
||
{
|
||
sums += p_flt_window[i][j];
|
||
}
|
||
InputReg[ 13 + i ] = sums/FLT_SIZE; //InputReg[13]~InputReg[18]
|
||
}
|
||
}
|
||
if(NSS_Select > 6) //记录完6路气压后进入此处,每6*10ms
|
||
{
|
||
NSS_Select = 1;
|
||
|
||
flt_cnt++;
|
||
if(flt_cnt > (FLT_SIZE - 1) ) //滑动窗口长度FLT_SIZE,循环记录
|
||
{
|
||
flt_cnt = 0;
|
||
}
|
||
}
|
||
if(NSS_Select < 4)
|
||
{
|
||
SENSOR_SELECT(0);
|
||
}
|
||
}
|
||
|
||
|