123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- /**
- ******************************************************************************
- * 文件名 : PAN312x_HAL.c
- * 作者 : PAN312x RF Team
- * 版本 : V1.0.0
- * 时间 :
- * 文件描述:
- * 该文件为PAN312x模块的硬件层,包含MCU与PAN312x模块的SPI配置,GPIO口初始化,以
- *及用于PAN312x寄存器、FIFO读写操作;
- * 客户在使用模块时候需要移植该文件,保证各个函数名、函数形参不变的情况下
- *根据自己的MCU平台修改函数内容,使各个功能块正常运行。硬件层占用资源如下:
- *
- *SPI:本例程使用STM32L1的SPI3进行与PAN312x模块通信。
- *GPIO口:本例程使用的GPIO口详情如下:
- * PB15 ---> M0SI
- * PB13 ---> SCK
- * PB14 ---> MISO
- * PB10 ---> GPIO8(IRQ)
- * PB11 ---> GPIO0
- * PB12 ---> CSN
- * PB5 ---> GPIO1
- * PB6 ---> GPIO3(nRST)
- * PB7 ---> GPIO2
- * PB8 ---> GPIO9
- * PB10 ---> GPIO10
- *******************************************************************************/
- #include "base_types.h"
- #include "gpio.h"
- #include "board_gpio.h"
- #include "board_spi.h"
- #include "bsp.h"
- //#define PAN312x_SPIx_CSN_GPIO RADIO_NSS_PORT
- //#define PAN312x_SPIx_CSN_PIN RADIO_NSS_PIN
- #define PAN312x_CSN_0() RADIO_NSS_L()
- #define PAN312x_CSN_1() RADIO_NSS_H()
- #define PAN312x_DIO8_GPIO RADIO_IRQ_PORT
- #define PAN312x_DIO8_PIN RADIO_IRQ_PIN
- #define PAN312x_RESET_GPIO RADIO_RST_POT
- #define PAN312x_RESET_PIN RADIO_RST_PIN
- #define pan312x_hspi RADIO_SPI_CHx
- //-----------------------------GPIO-----------------------------//
- //该部分函数为系统用到的GPIO的初始化函数,用户根据自己的平台相应修改
- //--------------------------------------------------------------//
- /**
- * @简介:Reset引脚初始化;
- * @参数:void;
- * @返回值:无
- */
- void PAN312x_Reset_Init(void)
- {
- // GPIO_InitTypeDef GPIO_InitStruct;
- // PAN312x_RESET_CLK_ENABLE();
- // GPIO_InitStruct.Pin = PAN312x_RESET_PIN;
- // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- // GPIO_InitStruct.Pull = GPIO_PULLUP;
- // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- // HAL_GPIO_Init(PAN312x_RESET_GPIO, &GPIO_InitStruct);
-
- Gpio_SetIO( PAN312x_RESET_GPIO,PAN312x_RESET_PIN );
- }
- /**
- * @简介:该函数用于MCU对SPI对应IO口初始化;
- * @参数:无
- * @返回值:无
- */
- void PAN312x_SPIGPIO_Init()
- {
- }
- /**
- * @简介:该函数用于MCU对SPI配置初始化;
- * @参数:无
- * @返回值:无
- */
- void PAN312x_SPI_Init()
- {
- }
- /**
- * @简介:该函数为GPIO8输入初始化及中断、优先级配置;
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DIO8_INPUT()
- {
-
- }
- /**
- * @简介:该函数为GPIO8输入中断开启使能;
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DIO8_INTENABLE()
- {
- /* EXTI interrupt init*/
- // HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
- // HAL_NVIC_EnableIRQ(EXTI0_IRQn);
-
- EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);
-
- }
- /**
- * @简介:该函数为DIO8输入中断关闭使能;
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DIO8_INTDISABLE()
- {
- // HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
- //HAL_NVIC_DisableIRQ(EXTI0_IRQn);
-
- EnableNvic(PORTA_IRQn, IrqLevel3, FALSE);
- }
- /**
- * @简介:该函数为DIO8输入状态获取;
- * @参数:无
- * @返回值:DIO8状态"1"or"0"
- */
- boolean_t PAN312x_DIO8_GetState()
- {
- boolean_t State;
- State = Gpio_GetInputIO(PAN312x_DIO8_GPIO, PAN312x_DIO8_PIN);
- return State;
- }
- /**
- * @简介:该函数为SX1208复位引脚NRST输出控制;
- * @参数:PinState为"1"表示输出高电平,"0"输出低电平;
- * @返回值:无
- */
- void PAN312x_Reset_OUTPUT(boolean_t PinState)
- {
- Gpio_WriteOutputIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN, PinState);
- }
- /**
- * @简介:将Reset引脚拉高;
- * @参数:void;
- * @返回值:无
- */
- void PAN312x_Reset_High(void)
- {
- Gpio_SetIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN);
- }
- /**
- * @简介:将Reset引脚拉低;
- * @参数:void;
- * @返回值:无
- */
- void PAN312x_Reset_Low(void)
- {
- Gpio_ClrIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN);
- }
- //-----------------------------SPI-----------------------------//
- //该部分函数为MCU对PAN312x模块SPI通信部分,包含SPI口及配置初始化
- //--------------------------------------------------------------//
- /**
- * @简介:加锁,让SDK可重入
- * @参数:无
- * @返回值:无
- */
- void PAN312x_Lock(void)
- {
- __disable_irq();
- }
- /**
- * @简介:解锁,让SDK可重入
- * @参数:无
- * @返回值:无
- */
- void PAN312x_Unlock(void)
- {
- __enable_irq();
- }
- #if PAN312x_INTERFACE == PAN312x_IF_SPI
- /**
- * @简介:开始PAN312x的数据收发,即SPI接口拉低CS
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DataBegin(void)
- {
- PAN312x_CSN_0();
- }
- /**
- * @简介:结束PAN312x的数据收发,如果接口为SPI则表示拉高CS,如果接口为I2C则表示发送结束信号
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DataEnd(void)
- {
- PAN312x_CSN_1();
- }
- /**
- * @简介:向PAN312x写入一段数据,如果接口为SPI则不包括CS操作部分
- * @参数:buf - 数据缓冲区
- * len - 数据长度
- * @返回值:写入的数据长度,或者错误值(负数)
- */
- int PAN312x_DataWrite(const void* buf, int len)
- {
- // HAL_SPI_Transmit(&pan312x_hspi, (void*)buf, len, 1000);
- for(int i=0;i<len;i++){
-
- SpiInOut( ((uint8_t*)buf)[i]);
-
- // while(Spi_GetStatus(pan312x_hspi, SpiTxe) == FALSE);//等待发送缓冲器空
- // Spi_SendData( pan312x_hspi,((uint8_t*)buf)[i++] );
- }
-
- return len;
- }
- /**
- * @简介:通过SPI从PAN312x读取一段数据
- * @参数:buf - 数据缓冲区
- * len - 数据长度
- * @返回值:读取的数据长度
- */
- int PAN312x_DataRead(void* buf, int len)
- {
- //HAL_SPI_Receive(&pan312x_hspi, buf, len, 1000);
-
- for( int i=0;i<len;i++ ){
-
- ((uint8_t*)buf)[i] = SpiInOut(0x00);
-
- // while(Spi_GetStatus(RADIO_SPI_CHx, SpiRxne) == FALSE);//等待接收缓冲器非空
- // ((uint8_t*)buf)[i++] = Spi_ReceiveData(RADIO_SPI_CHx);
-
- }
- return len;
- }
- #elif PAN312x_INTERFACE == PAN312x_IF_I2C
- /**
- * @简介:开始PAN312x的数据收发,即I2C表示发送起始信号
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DataBegin(void)
- {
- PAN312x_CSN_0();
- }
- /**
- * @简介:结束PAN312x的数据收发,I2C则表示发送结束信号
- * @参数:无
- * @返回值:无
- */
- void PAN312x_DataEnd(void)
- {
-
- }
- /**
- * @简介:向PAN312x写入一段数据,如果接口为SPI则不包括CS操作部分
- * @参数:buf - 数据缓冲区
- * len - 数据长度
- * @返回值:写入的数据长度,或者错误值(负数)
- */
- int PAN312x_DataWrite(const void* buf, int len)
- {
- }
- /**
- * @简介:通过SPI从PAN312x读取一段数据
- * @参数:buf - 数据缓冲区
- * len - 数据长度
- * @返回值:读取的数据长度
- */
- int PAN312x_DataRead(void* buf, int len)
- {
- }
- #endif //PAN312x_INTERFACE
- /**
- * @简介:PAN312x 向寄存器地址连续发送数据
- * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
- * @返回值:无
- */
- uint8_t PAN312x_ReadWriteByte(uint8_t data)
- {
- unsigned char RxDat;
- //HAL_SPI_TransmitReceive(&pan312x_hspi, &data, &RxDat, 1, 1000);
- RxDat = SpiInOut(data);
-
- return RxDat;
- }
- void PAN312x_Write_Bytes(uint8_t *buffer, uint8_t size)
- {
- uint8_t i;
- //DISABLE_INT();
- PAN312x_CSN_0();
- for(i = 0; i < size; i++){
- PAN312x_ReadWriteByte(buffer[i]);
- }
- PAN312x_CSN_1();
- //ENABLE_INT();
- }
- /**
- * @简介:PAN312x 向寄存器地址连续发送数据
- * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
- * @返回值:无
- */
- void PAN312x_Write_Register_Bytes(uint8_t addr, uint8_t *buffer, uint8_t size)
- {
- uint8_t i;
- //DISABLE_INT();
- PAN312x_CSN_0();
- PAN312x_ReadWriteByte((addr << 0x01) | 0x01);
- for(i = 0; i < size; i++){
- PAN312x_ReadWriteByte(buffer[i]);
- }
- PAN312x_CSN_1();
- //ENABLE_INT();
- }
- /**
- * @简介:PAN312x 向寄存器地址连续读数据
- * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
- * @返回值:数据返回到*buffer中
- */
- void PAN312x_Read_Register_Bytes( uint8_t addr, uint8_t *buffer, uint8_t size)
- {
- uint8_t i;
- //DISABLE_INT();
- PAN312x_CSN_0();
- PAN312x_ReadWriteByte(addr << 0x01);
- for(i = 0; i < size; i++ ){
- buffer[i] = PAN312x_ReadWriteByte(0x00);
- }
- PAN312x_CSN_1();
- //ENABLE_INT();
- }
- /****** Copyright (C) 2025-2050 Shanghai Panchip Microelectronics Co., Ltd. All rights reserved. *******/
|