acdt/board/Src/mf5803.c

263 lines
6.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
}