319 lines
10 KiB
C
319 lines
10 KiB
C
|
|
/* USER CODE BEGIN Header */
|
|||
|
|
/**
|
|||
|
|
******************************************************************************
|
|||
|
|
* @file o2_sensor.c
|
|||
|
|
* @author Motor Control SDK Team, Yuwell Software XiangenWang
|
|||
|
|
* @brief Voice Recognition Module Initialization Section,
|
|||
|
|
including peripheral initialization and message node insertion, etc.
|
|||
|
|
* @version 1.0
|
|||
|
|
* @changelog version 1.0 <EFBFBD><EFBFBD>ʼ<EFBFBD>汾 2025.11.21
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
******************************************************************************
|
|||
|
|
* @attention
|
|||
|
|
*
|
|||
|
|
* <h2><center>© Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China.
|
|||
|
|
* All rights reserved.</center></h2>
|
|||
|
|
*
|
|||
|
|
* Redistribution and use in source and binary forms, with or without
|
|||
|
|
* modification, are permitted, provided that the following conditions are met:
|
|||
|
|
*
|
|||
|
|
* 1. Redistribution of source code must retain the above copyright notice,
|
|||
|
|
* this list of conditions and the following disclaimer.
|
|||
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|||
|
|
* this list of conditions and the following disclaimer in the documentation
|
|||
|
|
* and/or other materials provided with the distribution.
|
|||
|
|
* 3. Neither the name of Yuwell Software nor the names of other
|
|||
|
|
* contributors to this software may be used to endorse or promote products
|
|||
|
|
* derived from this software without specific written permission.
|
|||
|
|
* 4. This software, including modifications and/or derivative works of this
|
|||
|
|
* software, must execute solely and exclusively on microcontroller or
|
|||
|
|
* microprocessor devices manufactured by or for Yuwell Software.
|
|||
|
|
* 5. Redistribution and use of this software other than as permitted under
|
|||
|
|
* this license is void and will automatically terminate your rights under
|
|||
|
|
* this license.
|
|||
|
|
*
|
|||
|
|
* THIS SOFTWARE IS PROVIDED BY Yuwell Software AND CONTRIBUTORS "AS IS"
|
|||
|
|
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
|||
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|||
|
|
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
|
|||
|
|
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
|||
|
|
* SHALL Yuwell Software OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|||
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|||
|
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|||
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|||
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|||
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|
*
|
|||
|
|
******************************************************************************
|
|||
|
|
*/
|
|||
|
|
/* USER CODE END Header */
|
|||
|
|
#include "o2_sensor.h"
|
|||
|
|
#include "string.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
O2SensorData o2_sensor_data;
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define REQUEST_FRAME_LENGTH (4)
|
|||
|
|
#define OXG_FAULT_MAX (30)
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param NONE
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD>{0x11, 0x01, 0x01, 0xED}<EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>REQUEST_FRAME_LENGTH<EFBFBD>궨<EFBFBD><EFBFBD>
|
|||
|
|
* 2. ͨ<EFBFBD><EFBFBD>OXG_UART_TRANS_BYTE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
void oxg_sensor_task(void)
|
|||
|
|
{
|
|||
|
|
const uint8_t sendDate[REQUEST_FRAME_LENGTH] = {0x11, 0x01, 0x01, 0xED};
|
|||
|
|
|
|||
|
|
|
|||
|
|
for(uint8_t i = 0;i < REQUEST_FRAME_LENGTH; i++)
|
|||
|
|
{
|
|||
|
|
OXG_UART_TRANS_BYTE(sendDate[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
|
|||
|
|
if(!xOxygenEventGroupCheckBit(&global_event, EVENT_O2_SENSOR_ERROR)) // <20><><EFBFBD><EFBFBD>ǰδ<C7B0><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.fault_count++;
|
|||
|
|
|
|||
|
|
if(o2_sensor_data.fault_count > OXG_FAULT_MAX)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
vOxygenEventGroupSetBits(&global_event, EVENT_O2_SENSOR_ERROR); // <20><>־<EFBFBD><D6BE>ǰ<EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param NONE
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note NONE
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
void oxg_sensor_init(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
FL_GPIO_InitTypeDef GPIO_InitStruct;
|
|||
|
|
o2_sensor_data.fault_count = 0;
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
|
|||
|
|
GPIO_InitStruct.pin = FL_GPIO_PIN_4|FL_GPIO_PIN_5;
|
|||
|
|
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
|
|||
|
|
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.pull = FL_DISABLE;
|
|||
|
|
GPIO_InitStruct.remapPin = FL_DISABLE;
|
|||
|
|
GPIO_InitStruct.analogSwitch = FL_DISABLE;
|
|||
|
|
|
|||
|
|
FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> <20><>Ϊʱ<CEAA>ӳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ıȽ<C4B1><C8BD><EFBFBD>
|
|||
|
|
FL_UART_InitTypeDef UART_InitStruct = {0};
|
|||
|
|
UART_InitStruct.baudRate = 9600; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
UART_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
UART_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B; //ֹͣλ
|
|||
|
|
UART_InitStruct.parity = FL_UART_PARITY_NONE; //<2F><>żУ<C5BC><D0A3>
|
|||
|
|
UART_InitStruct.transferDirection = FL_UART_DIRECTION_TX_RX; //<2F><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|||
|
|
FL_UART_Init(UART5, &UART_InitStruct);
|
|||
|
|
|
|||
|
|
NVIC_DisableIRQ(UART5_IRQn);
|
|||
|
|
NVIC_SetPriority(UART5_IRQn,2);//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
NVIC_EnableIRQ(UART5_IRQn);
|
|||
|
|
|
|||
|
|
|
|||
|
|
FL_UART_ClearFlag_RXBuffFull(UART5);
|
|||
|
|
FL_UART_EnableIT_RXBuffFull(UART5);
|
|||
|
|
|
|||
|
|
FL_UART_ClearFlag_TXShiftBuffEmpty(UART5);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param p_o2_frame - O2SensorData<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬ָ<EFBFBD><EFBFBD><EFBFBD>洢ԭʼ<EFBFBD><EFBFBD><EFBFBD>ݺͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<EFBFBD><EFBFBD>
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD>Ũ<EFBFBD><EFBFBD> = DF[0]*256 + DF[1]<EFBFBD><EFBFBD>16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>ӣ<EFBFBD>
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = DF[2]*256 + DF[3]<EFBFBD><EFBFBD>16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>ӣ<EFBFBD>
|
|||
|
|
* 3. <EFBFBD>¶Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ע<EFBFBD>ͽ<EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ȡ<EFBFBD><EFBFBD>#if 0<EFBFBD>궨<EFBFBD><EFBFBD>
|
|||
|
|
* 4. <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>p_o2_frameָ<EFBFBD><EFBFBD><EFBFBD>ǿգ<EFBFBD><EFBFBD><EFBFBD>O2_raw_data.DF<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ洢<EFBFBD><EFBFBD>Чԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
static void o2_data_decode(O2SensorData* p_o2_frame)
|
|||
|
|
{
|
|||
|
|
MsgQueueItem queue_item;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD><C5A8>
|
|||
|
|
p_o2_frame->o2_concentration = p_o2_frame->O2_raw_data.DF[0]*256+p_o2_frame->O2_raw_data.DF[1];
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ũ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
p_o2_frame->o2_flow = p_o2_frame->O2_raw_data.DF[2]*256+p_o2_frame->O2_raw_data.DF[3];
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
queue_item.type = MSG_TYPE_OXYGEN_SENSOR;
|
|||
|
|
queue_item.data.oxygen.concentration = p_o2_frame->o2_concentration;
|
|||
|
|
queue_item.data.oxygen.flow_rate = p_o2_frame->o2_flow;
|
|||
|
|
|
|||
|
|
modify_or_add_queue_node_by_type(&global_queue, queue_item.type, queue_item); // <20>Ķ<DEB8><C4B6><EFBFBD><EFBFBD>е<EFBFBD>Ũ<EFBFBD><C5A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if(xOxygenEventGroupCheckBit(&global_event, EVENT_O2_SENSOR_ERROR)) // <20><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>
|
|||
|
|
{
|
|||
|
|
vOxygenEventGroupClearBits(&global_event, EVENT_O2_SENSOR_ERROR);
|
|||
|
|
o2_sensor_data.fault_count = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ʵ<EFBFBD>֣<EFBFBD>
|
|||
|
|
* @param byte - <EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD>յĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD>ȴ<EFBFBD>֡ͷ1(0x16)<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>֡ͷ2(0x09)<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>֡ͷ3(0x01)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>У<EFBFBD><EFBFBD>֡
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD>ݶγ<EFBFBD><EFBFBD>ȹ̶<EFBFBD>Ϊ8<EFBFBD>ֽڣ<EFBFBD>DF_DATE_LENGTH=8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
|
|||
|
|
* 3. У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sum=0x16+0x09+0x01+8<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=256-sum<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>ֽڱȶ<EFBFBD>
|
|||
|
|
* 4. У<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡״̬ΪO2_FRAME_COMPLETE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o2_data_decode<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>o2_sensor_data<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>֡״̬<EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
static void request_o2_byte_process(uint8_t byte)
|
|||
|
|
{
|
|||
|
|
static uint8_t wait_data_count = 0;
|
|||
|
|
const uint8_t DF_DATE_LENGTH = 8;
|
|||
|
|
uint8_t check_sum = 0;
|
|||
|
|
|
|||
|
|
switch(o2_sensor_data.receive_state)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
case O2_STATE_WAIT_HEADER1:
|
|||
|
|
if(byte == 0x16)
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER2;
|
|||
|
|
o2_sensor_data.frame_state = O2_FRAME_RECEIVING;
|
|||
|
|
}else{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case O2_STATE_WAIT_HEADER2:
|
|||
|
|
if(byte == 0x09)
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER3;
|
|||
|
|
}else{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case O2_STATE_WAIT_HEADER3:
|
|||
|
|
if(byte == 0x01)
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_RECV_DATA;
|
|||
|
|
wait_data_count = 0;
|
|||
|
|
memset(o2_sensor_data.O2_raw_data.DF, 0, sizeof(o2_sensor_data.O2_raw_data.DF)); // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case O2_STATE_RECV_DATA:
|
|||
|
|
o2_sensor_data.O2_raw_data.DF[wait_data_count] = byte;
|
|||
|
|
wait_data_count++;
|
|||
|
|
if(wait_data_count == DF_DATE_LENGTH)
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_CHECK_FRAME;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case O2_STATE_CHECK_FRAME:
|
|||
|
|
check_sum = 0x16 + 0x09 + 0x01 + o2_sensor_data.O2_raw_data.DF[0] +\
|
|||
|
|
o2_sensor_data.O2_raw_data.DF[1] + o2_sensor_data.O2_raw_data.DF[2] + \
|
|||
|
|
o2_sensor_data.O2_raw_data.DF[3] + o2_sensor_data.O2_raw_data.DF[4] + \
|
|||
|
|
o2_sensor_data.O2_raw_data.DF[5] + o2_sensor_data.O2_raw_data.DF[6] + o2_sensor_data.O2_raw_data.DF[7];
|
|||
|
|
check_sum = 256 - check_sum;
|
|||
|
|
|
|||
|
|
if(check_sum == byte) // <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>У<EFBFBD><D0A3> У<><D0A3><EFBFBD>ϸ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>д<EFBFBD><D0B4><EFBFBD>
|
|||
|
|
{
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
o2_sensor_data.frame_state = O2_FRAME_COMPLETE;
|
|||
|
|
|
|||
|
|
o2_data_decode(&o2_sensor_data);
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1;
|
|||
|
|
o2_sensor_data.frame_state = O2_FRAME_IDLE;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
o2_sensor_data.frame_state = O2_FRAME_IDLE;
|
|||
|
|
o2_sensor_data.receive_state = O2_STATE_WAIT_HEADER1; // Ĭ<><C4AC>״̬<D7B4>½<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ϊԭʼ״̬
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief UART5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param NONE
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UART5<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<EFBFBD>RXBuffFull<EFBFBD>жϣ<EFBFBD>
|
|||
|
|
* 2. <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽں<EFBFBD><EFBFBD><EFBFBD>request_o2_byte_process<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 3. <EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>countδʵ<EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD>ɸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>
|
|||
|
|
* 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>UART5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>ȷ<EFBFBD><EFBFBD>FL_UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
void UART5_IRQHandler(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
uint8_t temp_data;
|
|||
|
|
|
|||
|
|
if((FL_ENABLE == FL_UART_IsEnabledIT_RXBuffFull(O2_SENSOR_USED_UART_NUM))
|
|||
|
|
&&(FL_SET == FL_UART_IsActiveFlag_RXBuffFull(O2_SENSOR_USED_UART_NUM)))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
temp_data = FL_UART_ReadRXBuff(O2_SENSOR_USED_UART_NUM);
|
|||
|
|
request_o2_byte_process(temp_data);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/************************ (C) COPYRIGHT YUWELL *****END OF FILE****/
|