diff options
Diffstat (limited to 'src/sample/io_sample/IR/Rx/io_ir.c')
-rw-r--r-- | src/sample/io_sample/IR/Rx/io_ir.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/sample/io_sample/IR/Rx/io_ir.c b/src/sample/io_sample/IR/Rx/io_ir.c new file mode 100644 index 0000000..43f69c6 --- /dev/null +++ b/src/sample/io_sample/IR/Rx/io_ir.c @@ -0,0 +1,167 @@ +/** +********************************************************************************************************* +* Copyright(c) 2018, Realtek Semiconductor Corporation. All rights reserved. +********************************************************************************************************* +* @file io_ir.c +* @brief This file provides demo code of ir. +* @details +* @author yuan +* @date 2018-12-07 +* @version v1.0 +********************************************************************************************************* +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "io_ir.h" + +#include "app_task.h" + + +/* Globals ------------------------------------------------------------------*/ +IR_Data_TypeDef IR_Rx_Data; +/* Number of data which has been sent */ +uint16_t IR_RX_Count = 0; + +/** + * @brief Initialization ir global data. + * @param No parameter. + * @return void + */ +void global_data_ir_init(void) +{ + /* Initialize adc k value! */ + APP_PRINT_INFO0("[io_ir]global_data_ir_init"); + memset(&IR_Rx_Data, 0, sizeof(IR_Rx_Data)); + IR_RX_Count = 0; +} + +/** + * @brief Initialization of pinmux settings and pad settings. + * @param No parameter. + * @return void + */ +void board_ir_init(void) +{ + Pad_Config(IR_RX_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_LOW); + + Pinmux_Config(IR_RX_PIN, IRDA_RX); +} + + +/** + * @brief Initialize ir peripheral. + * @param No parameter. + * @return void + */ +void driver_ir_init(void) +{ + /* Enable IR clock */ + RCC_PeriphClockCmd(APBPeriph_IR, APBPeriph_IR_CLOCK, ENABLE); + + /* Initialize IR */ + IR_InitTypeDef IR_InitStruct; + IR_StructInit(&IR_InitStruct); + + IR_InitStruct.IR_Freq = 38000;/* IR carrier freqency is 38KHz */ + IR_InitStruct.IR_Mode = IR_MODE_RX;/* IR receiveing mode */ + IR_InitStruct.IR_RxStartMode = IR_RX_AUTO_MODE; + IR_InitStruct.IR_RxFIFOThrLevel = + IR_RX_FIFO_THR_LEVEL; /* Configure RX FIFO threshold level to trigger IR_INT_RF_LEVEL interrupt */ + IR_InitStruct.IR_RxFIFOFullCtrl = + IR_RX_FIFO_FULL_DISCARD_NEWEST;/* Discard the latest received dta if RX FIFO is full */ + IR_InitStruct.IR_RxFilterTime = + IR_RX_FILTER_TIME_50ns;/* If high to low or low to high transition time <= 50ns,Filter out it. */ + IR_InitStruct.IR_RxTriggerMode = IR_RX_FALL_EDGE;/* Configure trigger type */ + IR_InitStruct.IR_RxCntThrType = + IR_RX_Count_High_Level;/* IR_RX_Count_High_Level is counting high level */ + IR_InitStruct.IR_RxCntThr = + 0x1F40;/* Configure RX counter threshold.You can use it to decide to stop receiving IR data */ + IR_Init(&IR_InitStruct); + IR_Cmd(IR_MODE_RX, ENABLE); + IR_ClearRxFIFO(); + + /* Configure NVIC */ + NVIC_InitTypeDef NVIC_InitStruct; + NVIC_InitStruct.NVIC_IRQChannel = IR_IRQn; + NVIC_InitStruct.NVIC_IRQChannelPriority = 3; + NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStruct); + +} + +/** + * @brief Demo code of ir send data. + * @param No parameter. + * @return Void +*/ +void ir_demo(void) +{ + /* Enable IR threshold interrupt. when RX FIFO offset >= threshold value, trigger interrupt*/ + /* Enable IR counter threshold interrupt to stop receiving data */ + IR_INTConfig(IR_INT_RF_LEVEL | IR_INT_RX_CNT_THR, ENABLE); + IR_MaskINTConfig(IR_INT_RF_LEVEL | IR_INT_RX_CNT_THR, DISABLE); +} + +void io_handle_ir_msg(T_IO_MSG *io_ir_msg) +{ + IR_Data_TypeDef *p_buf = io_ir_msg->u.buf; + for (uint16_t i = 0; i < p_buf->DataLen; i++) + { + APP_PRINT_INFO2("[io_ir]io_handle_ir_msg: IR RX data[%d] = 0x%x", i, p_buf->DataBuf[i]); + } + memset(&IR_Rx_Data, 0, sizeof(IR_Rx_Data)); + IR_RX_Count = 0; +} + +/** + * @brief IR interrupt handler function. + * @param No parameter. + * @return void + */ +void IR_Handler(void) +{ + uint16_t len = 0; + ITStatus int_status_rfl = IR_GetINTStatus(IR_INT_RF_LEVEL); + ITStatus int_status_rxcnt = IR_GetINTStatus(IR_INT_RX_CNT_THR); + + /* Mask IR all interrupt */ + IR_MaskINTConfig(IR_INT_RF_LEVEL | IR_INT_RX_CNT_THR, ENABLE); + + /* Receive by interrupt */ + if (int_status_rfl == SET) + { + len = IR_GetRxDataLen(); + IR_ReceiveBuf(IR_Rx_Data.DataBuf + IR_RX_Count, len); + IR_Rx_Data.DataLen += len; + IR_RX_Count += len; + + IR_ClearINTPendingBit(IR_INT_RF_LEVEL_CLR); + } + + /* Stop to receive IR data */ + if (int_status_rxcnt == SET) + { + /* Read remaining data */ + len = IR_GetRxDataLen(); + IR_ReceiveBuf(IR_Rx_Data.DataBuf + IR_RX_Count, len); + IR_Rx_Data.DataLen += len; + IR_RX_Count += len; + + T_IO_MSG int_ir_msg; + int_ir_msg.type = IO_MSG_TYPE_IR; + int_ir_msg.subtype = 0; + int_ir_msg.u.buf = (void *)(&IR_Rx_Data); + if (false == app_send_msg_to_apptask(&int_ir_msg)) + { + APP_PRINT_ERROR0("[io_ir]IR_INT_RX_CNT_THR: Send int_ir_msg failed!"); + //Add user code here! + IR_ClearINTPendingBit(IR_INT_RX_CNT_THR_CLR); + return; + } + IR_ClearINTPendingBit(IR_INT_RX_CNT_THR_CLR); + } + + /* Unmask IR all interrupt */ + IR_MaskINTConfig(IR_INT_RF_LEVEL | IR_INT_RX_CNT_THR, DISABLE); +} + |