IoT_SCV_CH584M/APP/bsp_wf5803.c

367 lines
8.9 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 "bsp_wf5803.h"
#include "CONFIG.h"
static tmosTaskID wf5803_task_id = INVALID_TASK_ID;
#define WF5803_CSB4_HIGH() GPIOB_SetBits(GPIO_Pin_17)
#define WF5803_CSB4_LOW() GPIOB_ResetBits(GPIO_Pin_17)
#define WF5803_CSB4_HIGH() GPIOB_SetBits(GPIO_Pin_17)
#define WF5803_CSB4_LOW() GPIOB_ResetBits(GPIO_Pin_17)
#define WF5803_CSB4_HIGH() GPIOB_SetBits(GPIO_Pin_17)
#define WF5803_CSB4_LOW() GPIOB_ResetBits(GPIO_Pin_17)
uint8_t volatile vcc4_state = 0;
void SPICs_Start(void)
{
// GPIOA_ResetBits(GPIO_Pin_6);
WF5803_CSB4_LOW();
}
void SPICs_Stop(void)
{
// GPIOA_SetBits(GPIO_Pin_6);
WF5803_CSB4_HIGH();
}
uint8_t WF5803_SendByte(uint8_t data)
{
R8_SPI0_BUFFER = data;
while (!(R8_SPI0_INT_FLAG & RB_SPI_FREE));
return (R8_SPI0_BUFFER);
}
void WF5803_WriteReg(uint8_t Address, uint8_t value)
{
SPICs_Start();
WF5803_SendByte(0x00);
WF5803_SendByte(Address);
WF5803_SendByte(value);
SPICs_Stop();
}
uint8_t WF5803_ReadReg(uint8_t addr)
{
uint8_t value;
SPICs_Start();
WF5803_SendByte(0x80);
WF5803_SendByte(addr);
value = WF5803_SendByte(0xFF);
SPICs_Stop();
return value;
}
void WF5803_Init(void)
{
/**
* CSB: PA6
* SCL: PA0
* SDA: PA1
* SDO: PA2
*/
/**
* CSB: PB17
* SCL: PA13
* SDA: PA14
* SDO: PA15
*/
// SDA: MOSI
// SDO: MISO
#if 1
// VCC1: PA2
// GPIOA_SetBits(GPIO_Pin_2);
// GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeOut_PP_20mA);
// GPIOA_SetBits(GPIO_Pin_2);
// // CSB1: PA3
// GPIOA_SetBits(GPIO_Pin_3);
// GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA);
// GPIOA_SetBits(GPIO_Pin_3);
// // VCC2: PB8
// GPIOB_SetBits(GPIO_Pin_8);
// GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);
// GPIOB_SetBits(GPIO_Pin_8);
// CSB2: PB9
GPIOB_SetBits(GPIO_Pin_9);
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
GPIOB_SetBits(GPIO_Pin_9);
// // VCC3: PB3
// GPIOB_SetBits(GPIO_Pin_3);
// GPIOB_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA);
// GPIOB_SetBits(GPIO_Pin_3);
// CSB3: PB4
GPIOB_SetBits(GPIO_Pin_4);
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);
GPIOB_SetBits(GPIO_Pin_4);
// // VCC4: PB16
// GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU);
// // GPIOB_SetBits(GPIO_Pin_17);
// mDelayuS(5);
// CSB4: PB17
GPIOB_SetBits(GPIO_Pin_17);
GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeOut_PP_5mA);
GPIOB_SetBits(GPIO_Pin_17);
// spi<70><69>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ0
GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
#endif
// PRINT("GPIOA_ModeCfg ok\r\n");
SPI0_MasterDefInit();
// PRINT("SPI1_MasterDefInit ok\r\n");
SPICs_Stop();
// PRINT("SPICs_Stop ok\r\n");
WF5803_WriteReg(0x00, 0x81); // <20><><EFBFBD><EFBFBD>spiΪ<69><CEAA><EFBFBD><EFBFBD>ģʽ
// PRINT("WF5803_WriteReg ok\r\n");
// PRINT("SPI_Init ok\r\n");
}
void WF5803_DeInit(void)
{
// SPI
// if (vcc4_state == 1)
// {
// GPIOA_ResetBits(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
// GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);
// // CSB4: PB11
// GPIOB_ResetBits(GPIO_Pin_17);
// GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeIN_PU);
// }
// else
if (vcc4_state == 0)
{
GPIOA_ResetBits(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);
GPIOB_ResetBits(GPIO_Pin_17);
GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeIN_PU);
}
// // VCC1: PA2
// GPIOA_ResetBits(GPIO_Pin_2);
// GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PD);
// CSB1: PA3
// GPIOA_ResetBits(GPIO_Pin_3);
// GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PD);
// GPIOA_SetBits(GPIO_Pin_3);
// GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PU);
// // VCC2: PB8
// GPIOB_ResetBits(GPIO_Pin_8);
// GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PD);
// // CSB2: PB9
GPIOB_ResetBits(GPIO_Pin_9);
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PD);
// GPIOB_SetBits(GPIO_Pin_9);
// GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PU);
// // VCC3: PB3
// GPIOB_ResetBits(GPIO_Pin_3);
// GPIOB_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PD);
// CSB3: PB4
GPIOB_ResetBits(GPIO_Pin_4);
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PD);
// GPIOB_SetBits(GPIO_Pin_4);
// GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
// if (vcc4_state == 1)
// {
// // VCC4: PB16
// // GPIOB_SetBits(GPIO_Pin_16);
// // GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeOut_PP_5mA);
// // GPIOB_SetBits(GPIO_Pin_16);
// }
// else
// {
// // VCC4: PB16
// GPIOB_ResetBits(GPIO_Pin_16);
// GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PD);
// PRINT("vcc4_state = 0\r\n");
// }
// LED
GPIOA_ResetBits(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12);
GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12, GPIO_ModeIN_PD);
// KEY
GPIOA_ResetBits(GPIO_Pin_7);
GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PU);
// motor
GPIOB_ResetBits(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
GPIOB_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_ModeIN_PD);
// COIL_ADC
GPIOA_ResetBits(GPIO_Pin_6);
GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeIN_PD);
// ADC_CTRL,ADC_VBAT
GPIOA_ResetBits(GPIO_Pin_0 | GPIO_Pin_1);
GPIOA_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1, GPIO_ModeIN_PD);
}
long reading = 0;
float press = 0;
float temp = 0;
float fDat = 0;
float press_air = 101.0f;
int a = 1;
uint8_t RawData[5];
uint8_t *GetSensorData(void)
{
memset(RawData, 0, sizeof(uint8_t) * 5);
// WF5803_WriteReg(0x30, 0x0a);
// DelayMs(50);
PRINT("DRDTY = %02x\r\n", WF5803_ReadReg(0x02));
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
RawData[0] = WF5803_ReadReg(0x06);
RawData[1] = WF5803_ReadReg(0x07);
RawData[2] = WF5803_ReadReg(0x08);
// <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
RawData[3] = WF5803_ReadReg(0x09);
RawData[4] = WF5803_ReadReg(0x0a);
// for(int i=0; i<5; i++)
// {
// PRINT("RawData[%d] = %x\r\n", i,RawData[i]);
// }
return RawData;
}
void WF5803_Start(void)
{
WF5803_WriteReg(0x21, 0x47); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
WF5803_WriteReg(0x27, 0x41); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
}
void SensorData_Process(void)
{
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 = fDat * 125 + 17.5; // WF5803_1BAR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>10m<30><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4AB>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// if (a) {press_air = press ; a = 0;}
// press = press_air > press ? press_air : press;
//
// int deep_100 = (int)(100*((press - press_air)/0.098f));
// //printf("P=%d.%d pa\r\n",(int)press,((int)(press*10000.0f)%10000));`
// printf("D=%d.%d cm\r\n",deep_100/100,deep_100%100);
reading = p1[3];
reading = reading << 8;
reading |= p1[4];
if (reading > 32768)
{
temp = (reading - 65844) / 256.0f;
}
else
{
temp = (reading - 308) / 256.0f;
}
// PRINT("--s-1--\r\n");
PRINT("P=%d.%d pa\r\n", (int)(press * 1000), ((int)(press * 10000000.0f) % 10000));
PRINT("T=%d.%d \r\n", (int)temp, ((int)(temp * 100.0f) % 100));
}
// __HIGH_CODE
// __attribute__((noinline))
uint16_t WF5803_ProcessEvent(uint8_t task_id, uint16_t events)
{
if (events & WF5803_EVT_VCC)
{
if (vcc4_state == 0)
{
vcc4_state = 1;
// GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU);
// mDelaymS(20);
// GPIOB_SetBits(GPIO_Pin_16);
// GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeOut_PP_5mA);
// GPIOB_SetBits(GPIO_Pin_16);
PRINT("WF5803_EVT_VCC\r\n");
}
tmos_start_task(wf5803_task_id, WF5803_EVT_START, MS1_TO_SYSTEM_TIME(20));
return (events ^ WF5803_EVT_VCC);
}
else if (events & WF5803_EVT_START)
{
// SensorData_Process();
// WF5803_WriteReg(0x30, 0x0a);
vcc4_state = 1;
WF5803_Init();
WF5803_WriteReg(0x30, 0x0A);
tmos_start_task(wf5803_task_id, WF5803_EVT_READ, MS1_TO_SYSTEM_TIME(5));
return (events ^ WF5803_EVT_START);
}
else if (events & WF5803_EVT_READ)
{
SensorData_Process();
// WF5803_WriteReg(0x30, 0x0a);
tmos_start_task(wf5803_task_id, WF5803_EVT_START, MS1_TO_SYSTEM_TIME(800));
// GPIOB_ResetBits(GPIO_Pin_16);
// GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PD);
// PRINT("vcc4_state = 0\r\n");
vcc4_state = 0;
return (events ^ WF5803_EVT_READ);
}
return 0;
}
void BSPWF5803_Init(void)
{
// WF5803_Init();
wf5803_task_id = TMOS_ProcessEventRegister(WF5803_ProcessEvent);
tmos_set_event(wf5803_task_id, WF5803_EVT_START);
// tmos_start_task(wf5803_task_id, WF5803_EVT_READ, MS1_TO_SYSTEM_TIME(50));
}