Files
HBshuiwuConcentrator/APP/hal_radio.c
2025-12-15 16:07:49 +08:00

886 lines
26 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.
/**
******************************************************************************
* @file hal_radio.c
* @author William Liang
* @version V1.0.0
* @date 09/10/2013
* @brief This file contains the initialization and handle of the radio frequency.
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <string.h>
#include <stdlib.h>
#include "hal_radio.h"
#include "uart.h"
#include "Rtc.h"
#include "sx1276-LoRa.h"
#include "sx1276-Fsk.h"
#include "apl.h"
/*****************************************************************************
Prototype : spiReadWriteByte
Description : spi basic function
Input : u8 data
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
u8 spiReadWriteByte(u8 data)
{
while(SPI_I2S_GetFlagStatus(sRF_SPI,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(sRF_SPI, data);
while(SPI_I2S_GetFlagStatus(sRF_SPI,SPI_I2S_FLAG_RXNE)==RESET);
return (u8)(SPI_I2S_ReceiveData(sRF_SPI));
}
/*****************************************************************************
Prototype : SX1276WriteBuffer
Description : spi write buffer
Input : uint8_t addr
uint8_t *buffer
uint8_t size
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
sRF_CS_LOW();
spiReadWriteByte(addr|0x80);
for(u8 i = 0;i < size; i++)
{
spiReadWriteByte(buffer[i]);
}
sRF_CS_HIGH();
}
/*****************************************************************************
Prototype : SX1276ReadBuffer
Description : none
Input : uint8_t addr
uint8_t *buffer
uint8_t size
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
sRF_CS_LOW();
spiReadWriteByte(addr);
for(u8 i = 0;i < size; i++)
{
buffer[i] = spiReadWriteByte(0xFF);
}
sRF_CS_HIGH();
}
/*****************************************************************************
Prototype : SX1276Write
Description : 1276 write Reg
Input : uint8_t addr
uint8_t data
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276Write( uint8_t addr, uint8_t data )
{
SX1276WriteBuffer( addr, &data, 1 );
}
/*****************************************************************************
Prototype : SX1276Read
Description : 1276 read Reg
Input : uint8_t addr
uint8_t *data
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276Read( uint8_t addr, uint8_t *data )
{
SX1276ReadBuffer( addr, data, 1 );
}
/*****************************************************************************
Prototype : SX1276WriteFifo
Description : none
Input : uint8_t *buffer
uint8_t size
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
{
SX1276WriteBuffer( sRF_FIFO_ARRD, buffer, size );
}
/*****************************************************************************
Prototype : SX1276ReadFifo
Description : none
Input : uint8_t *buffer
uint8_t size
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
{
SX1276ReadBuffer( sRF_FIFO_ARRD, buffer, size );
}
/*****************************************************************************
* Function : SX1276Reset
* Description : none
* Input : void
* Output : None
* Return :
* Others :
* Record
* 1.Date : 20170307
* Author : barry
* Modification: Created function
*****************************************************************************/
#define get_sys_time() xTaskGetTickCount()*portTICK_RATE_MS
void SX1276Reset(void)
{
u32 startTick;
GPIO_InitTypeDef GPIO_InitStructure;
hal_DIOx_ITConfig(all, DISABLE);
RCC_APB2PeriphClockCmd(sRF_RESET_SCK, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = sRF_RESET_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( sRF_RESET_PORT, &GPIO_InitStructure );
GPIO_ResetBits( sRF_RESET_PORT, sRF_RESET_PIN);
startTick = get_sys_time( );
while( get_sys_time( ) < ( startTick + 2 ));
GPIO_SetBits( sRF_RESET_PORT, sRF_RESET_PIN );
startTick = get_sys_time( );
while( get_sys_time( ) < ( startTick + 6 ));
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = sRF_RESET_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init( sRF_RESET_PORT, &GPIO_InitStructure );
hal_sRF_ClearAllRF_IT();
}
/*****************************************************************************
Prototype : hal_sRF_ITConfig
Description : none
Input : en_GDOx_IrqLine irqLine
FunctionalState NewState
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_ITConfig(uint32_t irqLine, FunctionalState NewState)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = irqLine;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = NewState;
EXTI_Init(&EXTI_InitStructure);
}
/*****************************************************************************
* Function : hal_sRF_FSK_ITConfig
* Description : none
* Input : uint32_t irqLine
FunctionalState NewState
* Output : None
* Return :
* Others :
* Record
* 1.Date : 20170418
* Author : barry
* Modification: Created function
*****************************************************************************/
void hal_sRF_FSK_ITConfig( uint32_t irqLine, FunctionalState NewState)
{
EXTI_InitTypeDef EXTI_InitStructure;
if (NewState == ENABLE)
{
EXTI_ClearITPendingBit(irqLine);
}
EXTI_InitStructure.EXTI_Line = irqLine;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = NewState;
EXTI_Init(&EXTI_InitStructure);
if (NewState == DISABLE)
{
EXTI_ClearITPendingBit(irqLine);
}
}
/*****************************************************************************
* Function : hal_sRF_ClearAllRF_IT
* Description : none
* Input : void
* Output : None
* Return :
* Others :
* Record
* 1.Date : 20170418
* Author : barry
* Modification: Created function
*****************************************************************************/
void hal_sRF_ClearAllRF_IT(void)
{
EXTI_ClearITPendingBit(DIO0_IRQ);
EXTI_ClearITPendingBit(DIO1_IRQ);
EXTI_ClearITPendingBit(DIO2_IRQ);
EXTI_ClearITPendingBit(DIO3_IRQ);
}
/*****************************************************************************
Prototype : hal_Init_RF_pins
Description : none
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_Init_RF_pins(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(sRF_CS_GPIO_CLK | sRF_SPI_MOSI_GPIO_CLK | sRF_SPI_MISO_GPIO_CLK |
sRF_SPI_SCK_GPIO_CLK | sRF_DIOx_SCK | sRF_RESET_SCK | sRF_DIO4_SCK, ENABLE);
hal_DIOx_ITConfig(all,DISABLE);
hal_sRF_ClearAllRF_IT();
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = sRF_RESET_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( sRF_RESET_PORT, &GPIO_InitStructure );
/*!< Configure sRF_SPI pins: SCK */
GPIO_InitStructure.GPIO_Pin = sRF_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(sRF_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sRF_SPI pins: MOSI */
GPIO_InitStructure.GPIO_Pin = sRF_SPI_MOSI_PIN;
GPIO_Init(sRF_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sRF_SPI pins: MISO */
GPIO_InitStructure.GPIO_Pin = sRF_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(sRF_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sRF_CS_PIN pin: sRF CS pin */
GPIO_InitStructure.GPIO_Pin = sRF_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(sRF_CS_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sRF_IRQ_PINs pin: DDO0~GDO5 */
GPIO_InitStructure.GPIO_Pin = sRF_DIO0_PIN | sRF_DIO1_PIN | sRF_DIO3_PIN;// | sRF_DIO2_PIN ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(sRF_DIOx_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = sRF_DIO4_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(sRF_DIO4_PORT, &GPIO_InitStructure);
/*TX LED pin*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = sRF_TX_CTRL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( sRF_TX_CTRL_PORT, &GPIO_InitStructure );
}
void hal_Init_RF_int(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Disable sRF_IRQ_EXTI clock */
RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(sRF_DIOx_PORT_SOURCE, sRF_DIO0_PIN_SOURCE);
GPIO_EXTILineConfig(sRF_DIOx_PORT_SOURCE, sRF_DIO1_PIN_SOURCE);
//GPIO_EXTILineConfig(sRF_DIOx_PORT_SOURCE, sRF_DIO2_PIN_SOURCE);
GPIO_EXTILineConfig(sRF_DIOx_PORT_SOURCE, sRF_DIO3_PIN_SOURCE);
GPIO_EXTILineConfig(sRF_DIO4_PORT_SOURCE, sRF_DIO4_PIN_SOURCE);
/* Enable AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
}
/*****************************************************************************
Prototype : hal_sRF_SPI_Config
Description : none
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_Init_RF_SPI(void)
{
SPI_InitTypeDef SPI_InitStructure;
if (sRF_SPI == SPI1)
{
RCC_APB2PeriphClockCmd(sRF_SPI_CLK, ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(sRF_SPI_CLK, ENABLE);
}
/* Enable sRF SPI DMA clock */
RCC_AHBPeriphClockCmd(sRF_SPI_DMA_CLK, ENABLE);
/*!< Deselect the RF: Chip Select high */
sRF_CS_HIGH();
/* Disable sRF_SPI */
SPI_Cmd(sRF_SPI, DISABLE);
/*!< SPI configuration */
SPI_I2S_DeInit(sRF_SPI);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(sRF_SPI, &SPI_InitStructure);
/*!< Enable the sRF_SPI */
SPI_Cmd(sRF_SPI, ENABLE);
}
/*****************************************************************************
Prototype : hal_sRF_InitSPI
Description : none
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_InitSPI(void)
{
hal_Init_RF_pins();
hal_Init_RF_int();
hal_Init_RF_SPI();
#ifdef SPI_DMA_FIFO
init_SPI_DMA();
#endif
}
/*****************************************************************************
* Function : SX1276_lora_init
* Description : none
* Input : bool lora
* Output : None
* Return :
* Others :
* Record
* 1.Date : 20170320
* Author : barry
* Modification: Created function
*****************************************************************************/
void SX1276_init(bool lora)
{
SX1276Reset();
if (lora)
{
SX1276LoRaInit();
}
else
{
#ifndef USE_LORA_MODE
SX1276FskInit();
#endif
}
}
/*****************************************************************************
Prototype : hal_InitRF
Description : none
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_InitRF(void)
{
hal_sRF_InitSPI();
#ifdef USE_LORA_MODE
SX1276_init(true);
#else
SX1276_init(false);
#endif
}
#if 0
/*****************************************************************************
Prototype : init_SPI_DMA
Description : none
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void init_SPI_DMA(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* Enable SPI Rx and Tx request */
SPI_I2S_DMACmd(sRF_SPI, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, ENABLE);
/* sRF_SPI_DMA_RX_Channel configuration ---------------------------------------------*/
DMA_DeInit(sRF_SPI_DMA_RX_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)sRF_SPI_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)0;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(sRF_SPI_DMA_RX_Channel, &DMA_InitStructure);
/* sRF_SPI_DMA_TX_Channel configuration ---------------------------------------------*/
DMA_DeInit(sRF_SPI_DMA_TX_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)sRF_SPI_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)0;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(sRF_SPI_DMA_TX_Channel, &DMA_InitStructure);
}
/*****************************************************************************
Prototype : hal_sRF_ReadRegister
Description : none
Input : u8 reg
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
u8 hal_sRF_ReadRegister(u8 reg)
{
if (reg > TOTAL_REGISTER_NUMBER)
{
printf("regsiter input error\r\n");
return 0;
}
/*!< Deselect the Radio: Chip Select high */
sRF_CS_HIGH();
/*!< Select the radio by pulling low the nSEL pin */
sRF_CS_LOW();
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sRF_SPI, reg);
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* read from the SPI bus */
SPI_I2S_ReceiveData(sRF_SPI);
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sRF_SPI, sRF_DUMMY_BYTE);
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/*!< Return the byte read from the SPI bus */
reg = SPI_I2S_ReceiveData(sRF_SPI);
/*!< Deselect the radio by pulling high the nSEL pin */
sRF_CS_HIGH();
return reg;
}
/*****************************************************************************
Prototype : hal_sRF_WriteRegister
Description : none
Input : u8 reg
u8 val
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_WriteRegister(u8 reg, u8 val)
{
reg |= 0x80;
/*!< Deselect the Radio: Chip Select high */
sRF_CS_HIGH();
/*!< Select the radio by pulling low the nSEL pin */
sRF_CS_LOW();
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sRF_SPI, reg);
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* read from the SPI bus */
SPI_I2S_ReceiveData(sRF_SPI);
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sRF_SPI, val);
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* read from the SPI bus */
SPI_I2S_ReceiveData(sRF_SPI);
/*!< Deselect the radio by pulling high the nSEL pin */
sRF_CS_HIGH();
}
/*****************************************************************************
Prototype : hal_sRF_DMA_Read
Description : none
Input : u8 startReg
u8 *pBuffer
u8 length
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_DMA_Read(u8 startReg, u8 *pBuffer, u8 length)
{
/* Allocate storage for CPU status register */
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u;
#endif
if (startReg > TOTAL_REGISTER_NUMBER)
{
return;
}
if (length > 0)
{
/*!< Deselect the Radio: Chip Select high */
sRF_CS_HIGH();
/*!< Select the radio by pulling low the nSEL pin */
sRF_CS_LOW();
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_TXE) == RESET);
/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sRF_SPI, startReg);
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sRF_SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* read from the SPI bus */
SPI_I2S_ReceiveData(sRF_SPI);
OS_ENTER_CRITICAL();
sRF_SPI->CR1 |= SPI_Direction_2Lines_RxOnly;
/* sRF_SPI_DMA_RX_Channel configuration ---------------------------------------------*/
sRF_SPI_DMA_RX_Channel->CMAR = (u32)pBuffer;
sRF_SPI_DMA_RX_Channel->CNDTR = (u32)length;
/* Enable sRF_SPI_DMA_RX_Channel and TC interrupt*/
sRF_SPI_DMA_RX_Channel->CCR |= DMA_CCR1_EN | DMA_CCR1_TCIE;
OS_EXIT_CRITICAL();
}
}
/*****************************************************************************
Prototype : hal_sRF_DMA_Write
Description : none
Input : u8 *pBuffer
u8 length
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_DMA_Write(u8 *pBuffer, u8 length)
{
if (length > 0)
{
/*!< Deselect the Radio: Chip Select high */
sRF_CS_HIGH();
/*!< Select the radio by pulling low the nSEL pin */
sRF_CS_LOW();
/* sRF_SPI_DMA_TX_Channel configuration ---------------------------------------------*/
sRF_SPI_DMA_TX_Channel->CMAR = (u32)pBuffer;
sRF_SPI_DMA_TX_Channel->CNDTR = (u32)length;
/* Enable sRF_SPI_DMA_TX_Channel */
sRF_SPI_DMA_TX_Channel->CCR |= DMA_CCR1_EN | DMA_CCR1_TCIE;
}
else
{
printf("length input error\r\n");
}
}
/*****************************************************************************
Prototype : hal_sRF_Config
Description : none
Input : u8 startReg
u8 *pBuffer
u8 length
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_Config(u8 startReg, u8 *pBuffer, u8 length)
{
if (startReg >= TOTAL_REGISTER_NUMBER)
{
printf("startReg input error\r\n");
return;
}
if (length > 0)
{
hal_sRF_InitSPI();
*pBuffer = startReg | 0x80;
hal_sRF_DMA_Write(pBuffer, length + 1);
}
}
/*****************************************************************************
Prototype : hal_sRF_Read
Description : DMA read FIFO
Input : u8 startReg
u8 *pBuffer
u8 length
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void hal_sRF_Read(u8 startReg, u8 *pBuffer, u8 length)
{
if (length > 0)
{
hal_sRF_InitSPI();
hal_sRF_DMA_Read(startReg,pBuffer,length);
}
}
/*****************************************************************************
Prototype : hal_sRF_readFIFO_DMA
Description : none
Input : u8 * pBufferָ<72><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
u8 length
Output : None
Return Value :
Date : 2014/3/21
Author : Barry
*****************************************************************************/
void hal_sRF_readFIFO_DMA(u8 * pBuffer, u8 length)
{
hal_sRF_DMA_Read(0,pBuffer+1,length);
}
/*****************************************************************************
Prototype : hal_sRF_writeFIFO_DMA
Description : none
Input : u8 * pBuffer ָ<><D6B8><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>ΪFIFO<46><4F>ַ
u8 length ʵ<>ʷ<EFBFBD><CAB7>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
Output : None
Return Value :
Date : 2014/3/21
Author : Barry
*****************************************************************************/
void hal_sRF_writeFIFO_DMA(u8 * pBuffer, u8 length)
{
hal_sRF_Config(0,pBuffer,length);
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/******************************************************************************/
/*****************************************************************************
Prototype : DMA1_Channel2_IRQHandler
Description : This function handles SPI1 Rx Transfer Complete interrupt
and Transfer Error interrupt.
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void DMA1_Channel2_IRQHandler(void)
{
if (DMA_GetITStatus(DMA1_IT_TC2) != RESET)
{
/* hal_sRF_InitSPI();<3B><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ȥ */
RxEndProcess(TRUE);
}
/*!< Deselect the RADIO: Chip Select high */
//sRF_CS_HIGH();
/* Disable the selected SPI peripheral */
//sRF_SPI->CR1 &= 0xFFBF;
/* Clear the DMA1 interrupt pending bits */
DMA1->IFCR = DMA1_IT_TC2 | DMA1_IT_HT2 | DMA1_IT_TE2;
/* Disable the selected DMA1_Channel2 */
DMA1_Channel2->CCR &= (u16)(~DMA_CCR1_EN);
}
/*****************************************************************************
Prototype : DMA1_Channel3_IRQHandler
Description : This function handles SPI1 Tx Transfer Complete interrupt
and Transfer Error interrupt.
Input : void
Output : None
Return Value :
Date : 2014/3/15
Author : Barry
*****************************************************************************/
void DMA1_Channel3_IRQHandler(void)
{
if (DMA_GetITStatus(DMA1_IT_TC3) != RESET)
{
SX1276LoRaStartTransmit();
}
/* Clear the DMA1 interrupt pending bits */
DMA1->IFCR = DMA1_IT_TC3 | DMA1_IT_HT3 | DMA1_IT_TE3;
/* Disable the selected DMA1_Channel3 */
DMA1_Channel3->CCR &= (u16)(~DMA_CCR1_EN);
}
/*****************************************************************************
Prototype : hal_sRF_Transmit
Description : PHY send
Input : u8 *pBuffer
u8 length
u8 channel
Output : None
Return Value :
Calls :
Called By :
History :
1.Date : 2014/10/29
Author : liwei
Modification : Created function
*****************************************************************************/
void hal_sRF_Transmit(u8 *pBuffer, u8 length, u8 channel)
{
SX1276LoRa_NormalTx(pBuffer,length);
}
#endif
/******************* (C) COPYRIGHT 2013 Robulink Technology Ltd.*****END OF FILE****/