JunMo Hong
/
cubebite_rnd_SPSGRFC433
Cubebite Publish
Fork of HelloWorld_IDS01A4 by
Revision 14:1a6faeda6579, committed 2018-02-13
- Comitter:
- jmhong
- Date:
- Tue Feb 13 06:35:39 2018 +0000
- Parent:
- 13:d802c6ed2e75
- Commit message:
- 180213 HJM commit;
Changed in this revision
diff -r d802c6ed2e75 -r 1a6faeda6579 main.cpp --- a/main.cpp Wed Jan 17 04:04:16 2018 +0000 +++ b/main.cpp Tue Feb 13 06:35:39 2018 +0000 @@ -14,22 +14,34 @@ ****************************************************************************** */ + + //************************************************************************************* -//Include +//Define : Test, Compile //************************************************************************************* -#include "mbed.h" -#include "SimpleSpirit1.h" +/* 180108 cubebite HJM : cubebite Testing define, 1ê°ì©ë§ ì¼ì¼ í¨. */ +#define CUBEBITE_RF_SPEED_TEST_SEND_ON +//#define CUBEBITE_RF_SPEED_TEST_RECV_ON + -#include <fstream> // library that contains file input/output functions +/* 180109 cubebite HJM : cubebite Compile define, 1ê°ì©ë§ ì¼ì¼ í¨. */ +//#define CUBEBITE_BOARD_F746ZG +#define CUBEBITE_BOARD_F401RE + + +#define CUBEBITE_RF_SETTING_VALUE_PRINT //************************************************************************************* + + //************************************************************************************* //Define : Debug //************************************************************************************* /* 180108 cubebite HJM : SimpleSpirit1 Debug define */ #define NDEBUG #define HEAVY_DEBUG +#define DEBUG_IRQ /* 180108 cubebite HJM : cubebite Debug define */ @@ -37,138 +49,207 @@ //************************************************************************************* -//************************************************************************************* -//Define : Test, Compile -//************************************************************************************* -/* 180108 cubebite HJM : cubebite Testing define, 1ê°ì©ë§ ì¼ì¼ í¨. */ -//#define CUBEBITE_RF_USER_BUTTON_SEND_TEST -//#define CUBEBITE_RF_DEVICE_PARTNUMBER_TEST -//#define CUBEBITE_RF_GPIO_0_TEST -#define CUBEBITE_RF_SPEED_TEST_SEND_ON -//#define CUBEBITE_RF_SPEED_TEST_RECV_ON - - -/* 180109 cubebite HJM : cubebite Compile define, 1ê°ì©ë§ ì¼ì¼ í¨. */ -//#define CUBEBITE_BOARD_F746ZG -#define CUBEBITE_BOARD_F401RE -//************************************************************************************* - - -//************************************************************************************* -//Global variable : Create an instance by board -//************************************************************************************* -/* 180108 cubebite HJM : orignal code, backup */ -//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(D11, D12, D3, D9, D10, D2); /* (SPI_CLK) = (D13:PA5:resistorR7 --> D3:PB3:resistorR4)*/ - -#ifdef CUBEBITE_BOARD_F401RE -/* 180108 cubebite HJM : F401re borad, AnalogIn PIN Info, A0(PA_0) A1(PA_1) A2(PA_4) A3(PB_0) A4(PC_1) A5(PC_0) */ -/* RF Module ê³¼ ìê´ ê´ê³ => A0(PA_0)[SPI GPIO 3] A1(PA_1)[CSN] A2(PA_4)[SPI1 GPIO 2] A3(PB_0)[SPI1 GPIO 1] A4(PC_1)[SPI1_GPIO 0] */ -/* 180108 cubebite HJM : F401re borad Init code */ -//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PC_7, PB_6, PA_10); //F401re borad -static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ -//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance2(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ -#endif - - - -#ifdef CUBEBITE_BOARD_F746ZG -/* 180108 cubebite HJM : F746zg borad, AnalogIn PIN Info, A0(PA_3) A1(PC_0) A2(PC_3) A3(PF_3) A4(PF_5) A5(PF_10) */ -/* RF Module ê³¼ ìê´ ê´ê³ => A0(PA_3)[SPI GPIO 3] A1(PC_0)[CSN] A2(PC_3)[SPI1 GPIO 2] A3(PF_3)[SPI1 GPIO 1] A4(PF_5)[SPI1_GPIO 0] */ -/* 180108 cubebite HJM : F746zg borad Init code */ -//static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PD_14, PD_5, PD_6); //F746zg borad -static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ -//static SimpleSpirit1 &myspirit2 = SimpleSpirit1::CreateInstance2(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ -#endif -//************************************************************************************* //************************************************************************************* -//Global variable : LEDs and user buttons by board -//************************************************************************************* -#ifdef CUBEBITE_BOARD_F401RE -//180116 HJM : ê·¸ ì ë ë»ì´ì í¹ì ì´ìª½ LED ë³ë ¬íì ì ì¬ì©íë¤ê° ì¤ë¥ê° ë¬ì ìë ìì ê² ê°ë¤ë ìì¬ì íê² ë¨. 주ìì²ë¦¬íê³ ë¤ì í ì¤í¸ íê¸°ë¡ í¨. -//static DigitalOut TestLED(D5); /* LED of IDS01A4/5 */ -#endif - -#ifdef CUBEBITE_BOARD_F746ZG -static DigitalOut TestLED(PB_0); /* LED of IDS01A4/5 */ -#endif - -#ifdef CUBEBITE_RF_USER_BUTTON_SEND_TEST -static InterruptIn event(USER_BUTTON); /* Interrupt event to give userinterface to send pkt. */ -#endif -//************************************************************************************* - - -//************************************************************************************* -//Global variable : Rf Send, read Buffer -//************************************************************************************* -/* 180108 cubebite HJM : send testing, orignal code */ -#define TEST_STR_LEN (32) -static uint8_t send_buf[TEST_STR_LEN] ={'S','P','I','R','I','T','1',' ','H','E','L','L','O',' ','W','O','R','L','D',' ','P','2','P',' ','D','E','M','O'}; -static uint8_t read_buf[TEST_STR_LEN] ={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; -//************************************************************************************* - - -//************************************************************************************* -//Global variable : tx, rx Flag -//************************************************************************************* -static volatile bool rx_done_flag = false; -static volatile bool tx_done_flag = false; -static volatile bool send_data_flag = false; -//************************************************************************************* - - +//Include //************************************************************************************* -//Global variable : Testing -//************************************************************************************* -/* Test : GPIO 0 */ -#ifdef CUBEBITE_RF_GPIO_0_TEST - #ifdef CUBEBITE_BOARD_F401RE -/* 180108 cubebite HJM : F401re borad, PC_1 == RF_MODULE_GPIO 0, Testing code */ -static DigitalIn RF_GPIO_0_INPUT(PC_1); //F401re borad -//static DigitalIn RF_GPIO_3_INPUT(PA_0); //F401re borad, ì¬ì©ì, send ì ì ëì ìí¨, Spirit1 IRQ íì´ë ê°ì´ ë¬¼ë ¤ì기 ë문 - #endif -#endif - -#ifdef CUBEBITE_RF_GPIO_0_TEST - #ifdef CUBEBITE_BOARD_F746ZG -/* 180108 cubebite HJM : F746zg borad, PC_1 == RF_MODULE_GPIO 0, Testing code */ -static DigitalIn RF_GPIO_0_INPUT(PF_5); //F746zg borad -//static DigitalIn RF_GPIO_3_INPUT(PA_3); //F746zg borad, ì¬ì©ì, send ì ì ëì ìí¨, Spirit1 IRQ íì´ë ê°ì´ ë¬¼ë ¤ì기 ë문 - #endif -#endif - - -/* Test : RF Speed Test */ -#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON -static clock_t clockRfSpeedTestStart, clockRfSpeedTestEnd; -static float fRfSpeedTestResultTime; - -static bool bIsSendFirstClockFunctionStarted = false; -static bool bIsSetSendFlag = false; - -#endif - -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON -#define TEST_ACK_STR_LEN (6) -static uint8_t send_ack_buf[TEST_ACK_STR_LEN] ={'O','K'}; -size_t curr_ack_len = strlen((const char*)send_ack_buf) + 1; - -static bool bIsAckSended = false; -#endif +#ifndef __MAIN_H__ +#define __MAIN_H__ +#include "main.h" +#endif //__MAIN_H__ //************************************************************************************* +enum RecvReturnValue +{ + CUBEBITE_RECV_OK = 0, CUBEBITE_RECV_ERROR_READ_NOTHING, CUBEBITE_RECV_ERROR_READ_NOT_MATCH +}; + +enum SendReturnValue +{ + CUBEBITE_SEND_OK = 0, CUBEBITE_SEND_ERROR, CUBEBITE_SEND_COLLISION, CUBEBITE_SEND_NOACK, CUBEBITE_SEND_ERROR_UNKNOWN +}; + + + + + +static void callback_func(int event); + +static int ReadRcvdData(SimpleSpirit1& myspirit); +static int ReadRcvdData_ClockMeasure_AckEnd(SimpleSpirit1& myspirit); + +static int SendData(SimpleSpirit1& myspirit); +static int SendData_ClockMeasure_AckStart(SimpleSpirit1& myspirit); +/* + <RF ì¤ì ê°> +í©ë¬´ì§ -> ì í +ê³ ìëë¡ -> 주íì +ì°¨ì -> ì±ë + +#define POWER_DBM 11.6 +#define CHANNEL_SPACE 100e3 +#define FREQ_DEVIATION 20e3 +#define BANDWIDTH 100.5e3 +#define MODULATION_SELECT GFSK_BT1 +#define DATARATE 38400 +#define XTAL_OFFSET_PPM 0 +#define SYNC_WORD 0x88888888 +#define LENGTH_WIDTH 8 // betzw - NOTE: only 255 bytes for payload!!! +#define CRC_MODE PKT_CRC_MODE_16BITS_2 +#define EN_WHITENING S_DISABLE +#define INFINITE_TIMEOUT 0.0 + +#define BASE_FREQUENCY 433.0e6 + +*/ +/** + * @brief main routine + * @param None + * @retval int + */ +int main() +{ + /* 180108 cubebite HJM : function return value print */ + int iReturn = 0; + + //************************************************************************************* + //Global variable : Create an instance by board + //************************************************************************************* + /* 180108 cubebite HJM : orignal code, backup */ + //static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(D11, D12, D3, D9, D10, D2); /* (SPI_CLK) = (D13:PA5:resistorR7 --> D3:PB3:resistorR4)*/ + +#ifdef CUBEBITE_BOARD_F401RE + /* 180108 cubebite HJM : F401re borad, AnalogIn PIN Info, A0(PA_0) A1(PA_1) A2(PA_4) A3(PB_0) A4(PC_1) A5(PC_0) */ + /* RF Module ê³¼ ìê´ ê´ê³ => A0(PA_0)[SPI GPIO 3] A1(PA_1)[CSN] A2(PA_4)[SPI1 GPIO 2] A3(PB_0)[SPI1 GPIO 1] A4(PC_1)[SPI1_GPIO 0] */ + /* 180108 cubebite HJM : F401re borad Init code */ + //static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PC_7, PB_6, PA_10); //F401re borad + static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ + //static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance_RSSI_negative_OneHundredTwenty(PA_7, PA_6, PA_5, PA_0, PB_6, PA_10); //F401re borad, IRQ Testing, GPIO 3 -> IRQ +#endif + + + +#ifdef CUBEBITE_BOARD_F746ZG + /* 180108 cubebite HJM : F746zg borad, AnalogIn PIN Info, A0(PA_3) A1(PC_0) A2(PC_3) A3(PF_3) A4(PF_5) A5(PF_10) */ + /* RF Module ê³¼ ìê´ ê´ê³ => A0(PA_3)[SPI GPIO 3] A1(PC_0)[CSN] A2(PC_3)[SPI1 GPIO 2] A3(PF_3)[SPI1 GPIO 1] A4(PF_5)[SPI1_GPIO 0] */ + /* 180108 cubebite HJM : F746zg borad Init code */ + //static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PD_14, PD_5, PD_6); //F746zg borad + static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ + //static SimpleSpirit1 &myspirit2 = SimpleSpirit1::CreateInstance2(PB_5, PB_4, PB_3, PA_3, PD_5, PD_6); //F746zg borad, IRQ Testing, GPIO 3 -> IRQ +#endif + //************************************************************************************* + + + + + /* 180108 cubebite HJM : spirit module, init code */ + printf("[CUBEBITE] Init "); + /* LED off */ + TestLED = 0; + myspirit.attach_irq_callback(callback_func); + iReturn = myspirit.on(); + if ( 0 == iReturn ) + { + printf("OK.\n"); + } + else + { + printf("ERROR.\n"); + } + +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] CUBEBITE_DEBUG ON. \n"); +#endif //CUBEBITE_DEBUG + + +#ifdef CUBEBITE_RF_SETTING_VALUE_PRINT + printf("Xtal offset in ppm : [%d]\n", XTAL_OFFSET_PPM); + printf("base frequency : [%d]\n", (uint32_t)BASE_FREQUENCY); + printf("channel space : [%d]\n", (uint32_t)CHANNEL_SPACE); + printf("channel number : [%d]\n", CHANNEL_NUMBER); + printf("modulation select : [%d]\n", MODULATION_SELECT); + printf("data rate : [%d]\n", DATARATE); + printf("frequency deviation : [%d]\n", (uint32_t)FREQ_DEVIATION); + printf("channel filter bandwidth : [%d]\n", (uint32_t)BANDWIDTH); + #ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON +// printf("\nOutput Power(dBm) : [%f]\n", POWER_DBM); + printf("\nOutput Power(dBm) : [%f]\n", (float)CUBEBITE_OUTPUT_POWER_DBM_TEST); + + #endif //CUBEBITE_RF_SPEED_TEST_SEND_ON + + #ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON + printf("\nRSSI threshold Setting value : [%d]\n", (int)CCA_THRESHOLD); + #endif //CUBEBITE_RF_SPEED_TEST_RECV_ON + + wait(2); +#endif //CUBEBITE_RF_SETTING_VALUE_PRINT + + while(1) + { + /* low power in idle condition., waiting for an event */ + __WFE(); + +#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON + iReturn = SendData(myspirit); + if (CUBEBITE_SEND_OK == iReturn) + { + printf("[DEBUG] send OK.\n"); + } + else if (CUBEBITE_SEND_ERROR == iReturn) + { + printf("[DEBUG] send ERROR.\n"); + } + + iReturn = (int)myspirit.get_last_sqi(); //HJM : LQI, íì¬ ì£¼ë³ íµì íì§ ê°, ëììë¡ ì¢ì ê². + printf("get_last_sqi() return : [%d]\n", iReturn); +#endif + +#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON + if (bRxDoneFlag) + { + iReturn = ReadRcvdData(myspirit); + if (CUBEBITE_RECV_OK == iReturn) + { + //íµì ìë ì²´í¬ì, ìëµ send code. + printf("[DEBUG] recv OK.\n"); + + float fReturn1 = myspirit.get_last_rssi_dbm(); + printf("get_last_rssi_dbm() return : [%f]\n", fReturn1); //HJM : ìì ê°ê³¼ ê°ì ê±°ë¼ê³ ìì ë¨. ëì¤ì í ì¤í¸. + if (-50 < fReturn1) //-80 < fReturn1 + { + TestLED3 = !TestLED3; /* Toggle LED at the receiver */ + } + else if (-50 >= fReturn1) + { +// TestLED = !TestLED; /* Toggle LED at the receiver */ + TestLED2 = !TestLED2; /* Toggle LED at the receiver */ +// TestLED3 = !TestLED3; /* Toggle LED at the receiver */ + } + else if (-70 >= fReturn1) //-100 >= fReturn1 + { + TestLED = !TestLED; /* Toggle LED at the receiver */ + } + } + bRxDoneFlag = 0; + } +#endif + + } + /* unreachable */ + // myspirit.off(); + // return 0; +} @@ -184,111 +265,43 @@ #ifdef CUBEBITE_DEBUG printf("[CUBEBITE] callback_func(int event) \n"); #endif - - + if(event == SimpleSpirit1::RX_DONE) { - rx_done_flag = 1; + bRxDoneFlag = 1; } else if (event == SimpleSpirit1::TX_DONE) { - tx_done_flag = 1; + bTxDoneFlag = 1; } } - -/** - * @brief set_send_data_flag - * @param None - * @retval None - */ -static void set_send_data_flag(void) -{ - send_data_flag = 1 ; -} - - -static void set_ack_send_data_flag(void) -{ -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON - bIsAckSended = 1; -#endif -} - - - - -/** - * @brief send_data - * @param None - * @retval None - */ -static void send_data(void) -{ -#ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] send_data() í¸ì¶ ë¨.\n"); - printf("[CUBEBITE] myspirit, is_receiving()\t......"); -#endif - while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM ìë§ ì´ ì ì ë³´ë´ë ê±° ë§ì ë¤ ë³´ë´ë ¤ê³ íë ê±° ê°ë¤. */ -#ifdef CUBEBITE_DEBUG - printf("OK\n"); -#endif - - - size_t curr_len = strlen((const char*)send_buf) + 1; - int iRet = 0; - - -#ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] myspirit, send()\t......"); -#endif - iRet = myspirit.send(send_buf, curr_len); - if (iRet == RADIO_TX_OK) - { -#ifdef CUBEBITE_DEBUG - printf("[RADIO_TX_OK]\n"); -#endif - -#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON - #ifdef CUBEBITE_BOARD_F401RE - if (false == bIsSendFirstClockFunctionStarted) - { - clockRfSpeedTestStart = clock(); - bIsSendFirstClockFunctionStarted = true; - } - #endif -#endif - } - else if (iRet == RADIO_TX_ERR) - { -#ifdef CUBEBITE_DEBUG - printf("[RADIO_TX_ERR]\n"); -#endif - } - else if (iRet == RADIO_TX_COLLISION) - { -#ifdef CUBEBITE_DEBUG - printf("[RADIO_TX_COLLISION]\n"); -#endif - } - else if (iRet == RADIO_TX_NOACK) - { -#ifdef CUBEBITE_DEBUG - printf("[RADIO_TX_NOACK]\n"); -#endif - } - -#ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] send_data() í¸ì¶ ë.\n"); -#endif -} - - - - +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//recv @@ -296,36 +309,47 @@ /** - * @brief read_rcvd_data + * @brief ReadRcvdData * @param None * @retval None */ -static void read_rcvd_data(void) +static int ReadRcvdData(SimpleSpirit1& myspirit) { #ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] read_rcvd_data() í¸ì¶ ë¨. \n"); + printf("[CUBEBITE] ReadRcvdData() í¸ì¶ ë¨. \n"); #endif - for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) read_buf[flush_count] = 0 ;/* clear the read buffer */ + for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) uiRendBuf[flush_count] = 0 ;/* clear the read buffer */ + - int ret = myspirit.read(read_buf, sizeof(read_buf)); + int ret = myspirit.read(uiRendBuf, sizeof(uiRendBuf)); if (ret == 0) { printf("[CUBEBITE] Read() Error : Nothing to read\n"); - return; + return CUBEBITE_RECV_ERROR_READ_NOTHING; } -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON - ret = strcmp((const char *)read_buf, (const char *)send_buf); + printf("ReadRcvdData() 1"); + + printf("[DEBUG]recv -> %s ", uiRendBuf); + + ret = strcmp((const char *)uiRendBuf, (const char *)uiSendBuf); + printf(" 3"); if (0 == ret) { - set_ack_send_data_flag(); +// set_ack_bSendDataFlag(); //180118 HJM : ë¤ì ë°ë¡ ë³´ë´ë ê±¸ë¡ ìì // printf("read, send buf collect!!\n"); - TestLED = !TestLED; /* Toggle LED at the receiver */ +// TestLED = !TestLED; /* Toggle LED at the receiver */ + printf(" 4"); // bIsAckSended = true; - - //746zg ë³´ë - /* - int iRet = myspirit.send(send_ack_buf, curr_ack_len); +// printf("[DEBUG]recv -> %s\n", uiRendBuf); +#ifdef CUBEBITE_DEBUG + printf("[DEBUG]recv -> %s\n", uiRendBuf); +#endif + + //746zg ë³´ë +// wait(1.0); +/* + int iRet = myspirit.send(uiSendAckBuf, sizetCurrAckBufLen); if (iRet == RADIO_TX_OK) { #ifdef CUBEBITE_DEBUG @@ -349,8 +373,81 @@ #ifdef CUBEBITE_DEBUG printf("ACK : [RADIO_TX_NOACK]\n"); #endif - } - */ + } + */ + + return CUBEBITE_RECV_OK; + printf(" 5 ok\n"); + } + + +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] ReadRcvdData() í¸ì¶ ë. \n"); +#endif + + return CUBEBITE_RECV_ERROR_READ_NOT_MATCH; + printf(" 6 error\n"); +} + + + +static int ReadRcvdData_ClockMeasure_AckEnd(SimpleSpirit1& myspirit) +{ +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] ReadRcvdData() í¸ì¶ ë¨. \n"); +#endif + + for(unsigned int flush_count = 0; flush_count < TEST_STR_LEN; flush_count++) uiRendBuf[flush_count] = 0 ;/* clear the read buffer */ + + int ret = myspirit.read(uiRendBuf, sizeof(uiRendBuf)); + if (ret == 0) + { + printf("[CUBEBITE] Read() Error : Nothing to read\n"); + return CUBEBITE_RECV_ERROR_READ_NOTHING; + } +#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON + ret = strcmp((const char *)uiRendBuf, (const char *)uiSendBuf); + if (0 == ret) + { +// set_ack_bSendDataFlag(); //180118 HJM : ë¤ì ë°ë¡ ë³´ë´ë ê±¸ë¡ ìì +// printf("read, send buf collect!!\n"); + TestLED = !TestLED; /* Toggle LED at the receiver */ +// bIsAckSended = true; +#ifdef CUBEBITE_DEBUG + printf("[DEBUG]recv -> %s\n", uiRendBuf); +#endif + + //746zg ë³´ë +// wait(1.0); +/* + int iRet = myspirit.send(uiSendAckBuf, sizetCurrAckBufLen); + if (iRet == RADIO_TX_OK) + { + #ifdef CUBEBITE_DEBUG + printf("ACK : [RADIO_TX_OK]\n"); + #endif + } + else if (iRet == RADIO_TX_ERR) + { + #ifdef CUBEBITE_DEBUG + printf("ACK : [RADIO_TX_ERR]\n"); + #endif + } + else if (iRet == RADIO_TX_COLLISION) + { + #ifdef CUBEBITE_DEBUG + printf("ACK : [RADIO_TX_COLLISION]\n"); + #endif + } + else if (iRet == RADIO_TX_NOACK) + { + #ifdef CUBEBITE_DEBUG + printf("ACK : [RADIO_TX_NOACK]\n"); + #endif + } + */ + + return CUBEBITE_RECV_OK; } #endif @@ -358,214 +455,169 @@ //401re ë³´ë if (true == bIsSendFirstClockFunctionStarted) { - clockRfSpeedTestEnd = clock(); + clocktimeRFSpeedTestEnd = clock(); } -// printf("[DEBUG]recv -> %s\n", read_buf); + //printf("[DEBUG]recv -> %s\n", uiRendBuf); #endif #ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] read_rcvd_data() í¸ì¶ ë. \n"); + printf("[CUBEBITE] ReadRcvdData() í¸ì¶ ë. \n"); #endif + + return CUBEBITE_RECV_ERROR_READ_NOT_MATCH; } -static void ack_send_data(void) -{ -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON - //746zg ë³´ë - int iRet = myspirit.send(send_ack_buf, curr_ack_len); - if (iRet == RADIO_TX_OK) - { - #ifdef CUBEBITE_DEBUG - printf("ACK : [RADIO_TX_OK]\n"); - #endif - } - else if (iRet == RADIO_TX_ERR) - { - #ifdef CUBEBITE_DEBUG - printf("ACK : [RADIO_TX_ERR]\n"); - #endif - } - else if (iRet == RADIO_TX_COLLISION) - { - #ifdef CUBEBITE_DEBUG - printf("ACK : [RADIO_TX_COLLISION]\n"); - #endif - } - else if (iRet == RADIO_TX_NOACK) - { - #ifdef CUBEBITE_DEBUG - printf("ACK : [RADIO_TX_NOACK]\n"); - #endif - } -#endif -} + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//send + + + /** - * @brief main routine + * @brief SendData * @param None - * @retval int + * @retval None */ -int main() -{ -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON - /* LED off */ - TestLED = 0; -#endif - /* 180108 cubebite HJM : function return value print */ +static int SendData(SimpleSpirit1& myspirit) +{ +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] SendData() í¸ì¶ ë¨.\n"); +#endif + while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM ìë§ ì´ ì ì ë³´ë´ë ê±° ë§ì ë¤ ë³´ë´ë ¤ê³ íë ê±° ê°ë¤. */ + + size_t curr_len = strlen((const char*)uiSendBuf) + 1; int iRet = 0; -#ifdef CUBEBITE_RF_GPIO_0_TEST - /* 180108 cubebite HJM : GPIO 0, init code */ - SGpioInit gpioIRQ={ - SPIRIT_GPIO_0, - SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, - SPIRIT_GPIO_DIG_OUT_IRQ - }; - SpiritGpioInit(&gpioIRQ); - - /* 180108 cubebite HJM : GPIO 0, For spiritFunctionalState(), Testing code */ - SpiritFunctionalState spiritFunctionalState={ - S_DISABLE - }; -#endif + printf("SendData() uiSendBuf -> [%s]\n", uiSendBuf); + iRet = myspirit.send(uiSendBuf, curr_len); + if (iRet == RADIO_TX_OK) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_OK]\n"); +#endif + return CUBEBITE_SEND_OK; + } + else if (iRet == RADIO_TX_ERR) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_ERR]\n"); +#endif + return CUBEBITE_SEND_ERROR; + } + else if (iRet == RADIO_TX_COLLISION) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_COLLISION]\n"); +#endif + return CUBEBITE_SEND_COLLISION; + } + else if (iRet == RADIO_TX_NOACK) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_NOACK]\n"); +#endif + return CUBEBITE_SEND_NOACK; + } - /* 180108 cubebite HJM : spirit module, init code */ - printf("[CUBEBITE] myspirit, attach_irq_callback()\t......"); - myspirit.attach_irq_callback(callback_func); - printf("OK\n"); - - printf("[CUBEBITE] myspirit, on()\t......"); - iRet = myspirit.on(); - if ( 0 == iRet ) - { - printf("OK\n"); - } - else - { - printf("ERROR\n"); - } #ifdef CUBEBITE_DEBUG - printf("[CUBEBITE] CUBEBITE_DEBUG ON. \n"); + printf("[CUBEBITE] SendData() í¸ì¶ ë.\n"); #endif - -#ifdef CUBEBITE_RF_USER_BUTTON_SEND_TEST - event.rise(&set_send_data_flag); /*User button interrupt trigger to set send data flag */ -#endif + return CUBEBITE_SEND_ERROR_UNKNOWN; +} -#ifdef CUBEBITE_RF_DEVICE_PARTNUMBER_TEST - uint16_t int16SpiritPartNum = 0; +static int SendData_ClockMeasure_AckStart(SimpleSpirit1& myspirit) +{ +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] SendData() í¸ì¶ ë¨.\n"); #endif - while(1) + while(myspirit.is_receiving()); /* wait for ongoing RX ends 180110 HJM ìë§ ì´ ì ì ë³´ë´ë ê±° ë§ì ë¤ ë³´ë´ë ¤ê³ íë ê±° ê°ë¤. */ + + size_t curr_len = strlen((const char*)uiSendBuf) + 1; + int iRet = 0; + + iRet = myspirit.send(uiSendBuf, curr_len); + if (iRet == RADIO_TX_OK) { -#ifdef CUBEBITE_RF_DEVICE_PARTNUMBER_TEST - printf("[CUBEBITE][devicePartNumber] SpiritGeneralGetDevicePartNumber()\t......"); +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_OK]\n"); +#endif + +#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON + if (false == bIsSendFirstClockFunctionStarted) + { + clocktimeRFSpeedTestStart = clock(); + bIsSendFirstClockFunctionStarted = true; + } +#endif + + return CUBEBITE_SEND_OK; + } + else if (iRet == RADIO_TX_ERR) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_ERR]\n"); +#endif + return CUBEBITE_SEND_ERROR; + } + else if (iRet == RADIO_TX_COLLISION) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_COLLISION]\n"); +#endif + return CUBEBITE_SEND_COLLISION; + } + else if (iRet == RADIO_TX_NOACK) + { +#ifdef CUBEBITE_DEBUG + printf("[RADIO_TX_NOACK]\n"); +#endif + return CUBEBITE_SEND_NOACK; + } - int16SpiritPartNum = SpiritGeneralGetDevicePartNumber(); - printf("OK => "); - printf("int16SpiritPartNum value : [0x%04X]\n", int16SpiritPartNum); - int16SpiritPartNum = 0; -#endif +#ifdef CUBEBITE_DEBUG + printf("[CUBEBITE] SendData() í¸ì¶ ë.\n"); +#endif + + return CUBEBITE_SEND_ERROR_UNKNOWN; +} - /* low power in idle condition., waiting for an event */ - __WFE(); - - - - - -#ifdef CUBEBITE_RF_GPIO_0_TEST - //180108 HJM : For spiritFunctionalState(), testing code - - if (S_ENABLE == spiritFunctionalState) - { - spiritFunctionalState = S_DISABLE; - } - else - { - spiritFunctionalState = S_ENABLE; - } - - /* 180108 cubebite HJM : GPIO 0, For, spiritFunctionalState() => Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. */ - SpiritGpioTemperatureSensor(spiritFunctionalState); - - /* 180108 cubebite HJM : RF_GPIO_0_INPUT pin value print */ - printf("****** RF GPIO_0 Status Testing => [%d] ******\n", (int)RF_GPIO_0_INPUT); - wait(1); -#endif - -#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON - //180112 HJM : Ack ìëµ ì¬ ë ê¹ì§ì Timeout. -// wait(0.5); //100ms, ì ì ëì, . ( í ì¤í¸) - wait(0.1); //100ms, ì ì ëì, ì¡ì 쪽 ì¤ë¥ O. (1ì¼ í ì¤í¸) -// wait(0.08); //100ms, ì ì ëì, ì¤ë¥ X. (5ë¶ í ì¤í¸) -// wait(0.07); //70ms, -// wait(0.06); //60ms, ì ì ëì, ì¡ì 쪽 ì¤ë¥ O, (1ìê° í ì¤í¸) -// wait(0.05); // 50ms, ì ì ëì, ì¤ë¥ X. (13ë¶ í ì¤í¸) -// wait(0.03); // 30ms, ì ì ëì, ??? ì¤ë¥ O. (1ìê° í ì¤í¸) -// wait(0.02); // 20ms, ì ì ëì, ìì 쪽 ì¤ë¥ O. (2ë¶ í ì¤í¸) -// wait(0.01); // 10ms, ì ì ëì, ìì 쪽 ì¤ë¥ O. (1ë¶ í ì¤í¸) -// wait(0.008); // 8ms, ì ì ëì, íì§ë§ 0.01 ì´ ìµë ìëê°ì¼ë¡ ë³´ì. -// wait(0.005); // 5ms, ì ì ëì, íì§ë§ 0.01 ì´ ìµë ìëê°ì¼ë¡ ë³´ì, íì§ë§ Nothing to read ì¤ë¥ê° ë§ì´ ë¸. (20ë¶ í ì¤í¸) -// wait(0.00001); // 0.01ms, ë¹ ì ì ëì. (30ë¶ í ì¤í¸) - set_send_data_flag(); -#endif - - if(rx_done_flag) - { - rx_done_flag = false; - read_rcvd_data(); -// printf("recvedd.\n"); -#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON - if (true == bIsSendFirstClockFunctionStarted) - { - fRfSpeedTestResultTime = (float)(clockRfSpeedTestEnd - clockRfSpeedTestStart)/CLOCKS_PER_SEC; - //180115 HJM : .csv íìì¼ë¡ ì¶ë ¥íì¬ ë°ì´í°ë¥¼ ëìí í기ìí´ log ìì , - //((puttyì¶ë ¥ä¸)ì,ë¶,ì´,)ì¡ì ìì¹,ìì ìì¹,ëëµê±°ë¦¬(m),ì¡ì ëë ì´(sec),ì¡ì ë°ì´í°ì(byte),ìë(sec) -// printf("Clock Rf Speed Test : [%.9f(sec)] \n", fRfSpeedTestResultTime); -// printf(",hjm(keyboard-right),hjm(keyboard-left),1,0.1,28,%.9f\n", fRfSpeedTestResultTime); //1ì°¨, 2ìê° í ì¤í¸ - printf(",hjm(keyboard-left),mars(tv-desk),10,0.1,28,%.9f\n", fRfSpeedTestResultTime); //2ì°¨ - - - bIsSendFirstClockFunctionStarted = false; - } -#endif - } - - else if (send_data_flag) - { + + - send_data_flag = false; - send_data(); -// printf("sended.\n"); + - } - - else if (tx_done_flag) - { - tx_done_flag = false; - // printf("\n***Packet sent ***\nSent string ='%s' (len=%d)\n", send_buf, strlen((const char*)send_buf) + 1); - } - -#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON -//180112 HJM ì¤í 1ì, íì¬ ì¬ì© ìíë ì¤, recv 쪽ìì strcmpë¡ ë³´ë¸ ë°ì´í°ì ë°ì ë°ì´í° ë¹êµ í, send 를 ë°ë¡ íë ì½ëë¡ ë°ê¿¨ì. -//180116 HJM ì¤ì 9ì, ê·¸ ì ë ë ë»ê³ , OK ì í¸ë¥¼ ì ëë¡ ë°ì§ë¥¼ ììì recv 쪽 ok send ë³´ë´ë 쪽ì ìì¬, ë¤ì ë°ê¾¸ê¸°ë¡í¨. - else if (true == bIsAckSended) - { - bIsAckSended = false; - ack_send_data(); -// printf("recv sended.\n"); - } -#endif - } - /* unreachable */ - // myspirit.off(); - // return 0; -} +
diff -r d802c6ed2e75 -r 1a6faeda6579 main.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Tue Feb 13 06:35:39 2018 +0000 @@ -0,0 +1,94 @@ +#pragma once + +#ifndef __MBED_H__ +#define __MBED_H__ +#include "mbed.h" +#endif //__MBED_H__ + +#ifndef __SIMPLESPIRIT1_H__ +#define __SIMPLESPIRIT1_H__ +#include "SimpleSpirit1.h" +#endif //__SIMPLESPIRIT1_H__ + + +//************************************************************************************* +//Global variable : LEDs and user buttons by board +//************************************************************************************* +#ifdef CUBEBITE_BOARD_F401RE +static DigitalOut TestLED(D5); /* LED of IDS01A4/5 */ +#endif + +#ifdef CUBEBITE_BOARD_F746ZG +static DigitalOut TestLED(PB_0); /* LED of IDS01A4/5 */ +static DigitalOut TestLED2(PB_7); /* LED of IDS01A4/5 */ +static DigitalOut TestLED3(PB_14); /* LED of IDS01A4/5 */ +#endif + +#ifdef CUBEBITE_RF_USER_BUTTON_SEND_TEST +static InterruptIn event(USER_BUTTON); /* Interrupt event to give userinterface to send pkt. */ +#endif +//************************************************************************************* + + + + + +//************************************************************************************* +//Global variable : Rf Send, read Buffer +//************************************************************************************* +/* 180108 cubebite HJM : send testing, orignal code */ +#define TEST_STR_LEN (32) +static uint8_t uiSendBuf[TEST_STR_LEN] ={'S','P','I','R','I','T','1',' ','H','E','L','L','O',' ','W','O','R','L','D',' ','P','2','P',' ','D','E','M','O'}; +static uint8_t uiRendBuf[TEST_STR_LEN] ={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; +//************************************************************************************* + + + +//************************************************************************************* +//Global variable : tx, rx Flag +//************************************************************************************* +static volatile bool bRxDoneFlag = false; +static volatile bool bTxDoneFlag = false; +static volatile bool bSendDataFlag = false; +//************************************************************************************* + + + + +//************************************************************************************* +//Global variable : Testing +//************************************************************************************* + +/* Test : RF Speed Test */ +#ifdef CUBEBITE_RF_SPEED_TEST_SEND_ON +static clock_t clocktimeRFSpeedTestStart, clocktimeRFSpeedTestEnd; +static float fRfSpeedTestResultTime; + +static bool bIsSendFirstClockFunctionStarted = false; +static bool bIsSetSendFlag = false; +#endif + + +#ifdef CUBEBITE_RF_SPEED_TEST_RECV_ON +#define TEST_ACK_STR_LEN (6) +static uint8_t uiSendAckBuf[TEST_ACK_STR_LEN] ={'O','K'}; +size_t sizetCurrAckBufLen = strlen((const char*)uiSendAckBuf) + 1; + +static bool bIsAckSended = false; +#endif +//************************************************************************************* + + + + + + + + + + + + + + +
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stm-spirit1-rf-driver.lib Tue Feb 13 06:35:39 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/jmhong/code/stm-spirit1-rf-driver/#6c5fc276194a
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/.gitignore --- a/stm-spirit1-rf-driver/.gitignore Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -BUILD -.mbed -projectfiles -*.py* -RCS -atmel-rf-driver
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/README.md --- a/stm-spirit1-rf-driver/README.md Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -# Prototype RF Driver for STM Sub-1 GHz RF Expansion Boards based on the SPSGRF-868 Module for STM32 Nucleo # - -Currently supported boards: - * [X-NUCLEO-IDS01A4](http://www.st.com/content/st_com/en/products/ecosystems/stm32-open-development-environment/stm32-nucleo-expansion-boards/stm32-ode-connect-hw/x-nucleo-ids01a4.html) - -**Note**, in order to use expansion board `X-NUCLEO-IDS01A4` in mbed you need to perform the following HW modifications on the board: - * **Un**mount resistor `R4` - * **Mount** resistor `R7` - -Furthermore, on some Nucleo development boards (e.g. the [NUCLEO_F429ZI](https://developer.mbed.org/platforms/ST-Nucleo-F429ZI/)), in order to be able to use Ethernet together with these Sub-1 GHz RF expansion boards, you need to compile this driver with macro `SPIRIT1_SPI_MOSI=PB_5` defined, while the development board typically requires some HW modification as e.g. described [here](https://github.com/ARMmbed/sal-nanostack-driver-stm32-eth)! - -This driver can be used together with the 6LoWPAN stack (*a.k.a.* Nanostack).
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/mbed_lib.json --- a/stm-spirit1-rf-driver/mbed_lib.json Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -{ - "name": "spirit1", - "config": { - "mac-address": "{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}" - }, - "macros": ["USE_STM32F4XX_NUCLEO", "X_NUCLEO_IDS01A4", "SPIRIT_USE_FULL_ASSERT"] -}
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/NanostackRfPhySpirit1.cpp --- a/stm-spirit1-rf-driver/source/NanostackRfPhySpirit1.cpp Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,829 +0,0 @@ -#if MBED_CONF_RTOS_PRESENT - -#include "NanostackRfPhySpirit1.h" -#include "SimpleSpirit1.h" -#include "nanostack/platform/arm_hal_phy.h" -#include "platform/arm_hal_interrupt.h" - -#include "mbed_trace.h" -#define TRACE_GROUP "SPIRIT" - -/* Define beyond macro if you want to perform heavy debug tracing (includes tracing in IRQ context) */ -// #define HEAVY_TRACING - -static phy_device_driver_s device_driver; -static int8_t rf_radio_driver_id = -1; - -const phy_rf_channel_configuration_s phy_subghz = {868000000, 1000000, 250000, 11, M_GFSK}; - -static phy_device_channel_page_s phy_channel_pages[] = { - {CHANNEL_PAGE_2, &phy_subghz}, - {CHANNEL_PAGE_0, NULL} -}; - -static uint8_t tx_sequence = 0xff; -static uint8_t mac_tx_handle = 0; - -static SimpleSpirit1 *rf_device = NULL; -static uint8_t rf_rx_buf[MAX_PACKET_LEN]; - -static uint16_t stored_short_adr; -static uint16_t stored_pan_id; -static uint8_t stored_mac_address[8] = MBED_CONF_SPIRIT1_MAC_ADDRESS; - -#define RF_SIG_ACK_NEEDED (1<<0) -#define RF_SIG_CB_TX_DONE (1<<1) -#define RF_SIG_CB_RX_RCVD (1<<2) -static Thread rf_ack_sender(osPriorityRealtime); -static volatile uint8_t rf_rx_sequence; -static volatile bool rf_ack_sent = false; -static volatile bool expecting_ack = false; -static volatile bool need_ack = false; - -/* MAC frame helper macros */ -#define MAC_FCF_FRAME_TYPE_MASK 0x0007 -#define MAC_FCF_FRAME_TYPE_SHIFT 0 -#define MAC_FCF_SECURITY_BIT_MASK 0x0008 -#define MAC_FCF_SECURITY_BIT_SHIFT 3 -#define MAC_FCF_PENDING_BIT_MASK 0x0010 -#define MAC_FCF_PENDING_BIT_SHIFT 4 -#define MAC_FCF_ACK_REQ_BIT_MASK 0x0020 -#define MAC_FCF_ACK_REQ_BIT_SHIFT 5 -#define MAC_FCF_INTRA_PANID_MASK 0x0040 -#define MAC_FCF_INTRA_PANID_SHIFT 6 -#define MAC_FCF_DST_ADDR_MASK 0x0c00 -#define MAC_FCF_DST_ADDR_SHIFT 10 -#define MAC_FCF_VERSION_MASK 0x3000 -#define MAC_FCF_VERSION_SHIFT 12 -#define MAC_FCF_SRC_ADDR_MASK 0xc000 -#define MAC_FCF_SRC_ADDR_SHIFT 14 - -/* MAC supported frame types */ -#define FC_BEACON_FRAME 0x00 -#define FC_DATA_FRAME 0x01 -#define FC_ACK_FRAME 0x02 -#define FC_CMD_FRAME 0x03 - -static inline void rf_if_lock(void) -{ - platform_enter_critical(); -} - -static inline void rf_if_unlock(void) -{ - platform_exit_critical(); -} - -static inline uint16_t rf_read_16_bit(uint8_t *data_ptr) { // little-endian - uint16_t ret; - - ret = ((uint16_t)data_ptr[0]) + (((uint16_t)data_ptr[1]) << 8); - return ret; -} - -/* Note: we are in IRQ context */ -static inline void rf_send_signal(int32_t signal) { -#ifdef HEAVY_TRACING - tr_info("%s (%d): %d", __func__, __LINE__, signal); -#endif - rf_ack_sender.signal_set(signal); -} - -static volatile phy_link_tx_status_e phy_status; -/* Note: we are in IRQ context */ -static void rf_handle_ack(uint8_t seq_number) -{ - /*Received ACK sequence must be equal with transmitted packet sequence*/ - if(tx_sequence == seq_number) - { -#ifdef HEAVY_TRACING - tr_info("%s (%d)", __func__, __LINE__); -#endif - - /*Call PHY TX Done API*/ - if(device_driver.phy_tx_done_cb){ - phy_status = PHY_LINK_TX_DONE; - rf_send_signal(RF_SIG_CB_TX_DONE); - } - } else { -#ifdef HEAVY_TRACING - tr_info("%s (%d)", __func__, __LINE__); -#endif - - /*Call PHY TX Done API*/ - if(device_driver.phy_tx_done_cb){ - phy_status = PHY_LINK_TX_FAIL; - rf_send_signal(RF_SIG_CB_TX_DONE); - } - } -} - -/* Note: we are in IRQ context */ -static inline bool rf_check_mac_address(uint8_t *dest) { - for(int i = 0; i < 8; i++) { - if(dest[i] != stored_mac_address[7-i]) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d): i=%d, dest=%x, stored=%x", - __func__, __LINE__, - i, dest[i], stored_mac_address[7-i]); -#endif - return false; - } - } - return true; -} - -/* Note: we are in IRQ context */ -/* Returns true if packet should be accepted */ -static bool rf_check_destination(int len, uint8_t *ack_requested) { - uint8_t frame_type; - uint16_t dst_pan_id; - uint16_t dst_short_adr; - uint8_t dst_addr_mode = 0x0; /*0x00 = no address 0x01 = reserved 0x02 = 16-bit short address 0x03 = 64-bit extended address */ - uint8_t src_addr_mode = 0x0; /*0x00 = no address 0x01 = reserved 0x02 = 16-bit short address 0x03 = 64-bit extended address */ - uint8_t min_size = 3; // FCF & SeqNr - bool ret = false; -#if defined(HEAVY_TRACING) - bool panid_compr = false; -#endif - - if(len < 3) { - tr_debug("%s (%d)", __func__, __LINE__); - return false; - } - - uint16_t fcf = rf_read_16_bit(rf_rx_buf); - frame_type = ((fcf & MAC_FCF_FRAME_TYPE_MASK) >> MAC_FCF_FRAME_TYPE_SHIFT); - (*ack_requested) = ((fcf & MAC_FCF_ACK_REQ_BIT_MASK) >> MAC_FCF_ACK_REQ_BIT_SHIFT); - dst_addr_mode = ((fcf & MAC_FCF_DST_ADDR_MASK) >> MAC_FCF_DST_ADDR_SHIFT); - src_addr_mode = ((fcf & MAC_FCF_SRC_ADDR_MASK) >> MAC_FCF_SRC_ADDR_SHIFT); -#if defined(HEAVY_TRACING) - panid_compr = ((fcf & MAC_FCF_INTRA_PANID_MASK) >> MAC_FCF_INTRA_PANID_SHIFT); -#endif - -#ifdef HEAVY_TRACING - tr_info("%s (%d): len=%d, ftype=%x, snr=%x, ack=%d, dst=%x, src=%x, intra=%d", __func__, __LINE__, len, frame_type, - rf_rx_buf[2], (*ack_requested), dst_addr_mode, src_addr_mode, panid_compr); -#endif - - if(frame_type == FC_ACK_FRAME) { // betzw: we support up to two different forms of ACK frames! - if((len == 3) && (dst_addr_mode == 0x0) && (src_addr_mode == 0x0)) { - ret = true; - } - -#ifdef HEAVY_TRACING - tr_info("%s (%d): ret=%d", __func__, __LINE__, ret); -#endif - (*ack_requested) = 0; // Never acknowledge ACK frames - return ret; - } - - switch(dst_addr_mode) { - case 0x00: - ret = true; // no check possible; - break; - - case 0x02: - min_size += 4; // pan id + short dest adr - - if(len < 5) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - dst_pan_id = rf_read_16_bit(&rf_rx_buf[3]); - if((dst_pan_id != stored_pan_id) && (dst_pan_id != 0xFFFF)) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - if(len < 7) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - dst_short_adr = rf_read_16_bit(&rf_rx_buf[5]); - if((dst_short_adr != stored_short_adr) && (dst_short_adr != 0xFFFF)) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d): %d!=%d", __func__, __LINE__, dst_short_adr, stored_short_adr); -#endif - return false; - } - - ret = true; - break; - - case 0x03: - min_size += 10; // pan id + dest mac addr - - if(len < 5) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - dst_pan_id = rf_read_16_bit(&rf_rx_buf[3]); - if((dst_pan_id != stored_pan_id) && (dst_pan_id != 0xFFFF)) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - if(len < 13) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - ret = rf_check_mac_address(&rf_rx_buf[5]); - - if(!ret) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - break; - - default: - /* not supported */ -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return false; - } - - if(ret && (*ack_requested)) { - rf_rx_sequence = rf_rx_buf[2]; - } - -#ifdef HEAVY_TRACING - tr_info("%s (%d), ret=%d, ack=%d", __func__, __LINE__, ret, (*ack_requested)); -#endif - return ret; -} - -static uint16_t rf_buffer_len = 0; -static uint8_t rf_sqi; -static int8_t rf_rssi; -/* Note: we are in IRQ context */ -static inline void rf_handle_rx_end(void) -{ - uint8_t ack_requested = 0; - - /* Get received data */ - rf_buffer_len = rf_device->read(rf_rx_buf, MAX_PACKET_LEN); - if(!rf_buffer_len) - return; - -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - - /* Check if packet should be accepted */ - if(!rf_check_destination(rf_buffer_len, &ack_requested)) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return; - } - - /* If waiting for ACK, check here if the packet is an ACK to a message previously sent */ - if(expecting_ack) { - uint16_t fcf = rf_read_16_bit(rf_rx_buf); - expecting_ack = false; - - if(((fcf & MAC_FCF_FRAME_TYPE_MASK) >> MAC_FCF_FRAME_TYPE_SHIFT) == FC_ACK_FRAME) { - /*Send sequence number in ACK handler*/ -#ifdef HEAVY_TRACING - tr_debug("%s (%d), len=%u", __func__, __LINE__, (unsigned int)rf_buffer_len); -#endif - rf_handle_ack(rf_rx_buf[2]); - return; - } else { - /*Call PHY TX Done API*/ - if(device_driver.phy_tx_done_cb){ - phy_status = PHY_LINK_TX_FAIL; - rf_send_signal(RF_SIG_CB_TX_DONE); - } - } - } - - /* Kick off ACK sending */ - if(ack_requested) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d), len=%u", __func__, __LINE__, (unsigned int)rf_buffer_len); -#endif - rf_send_signal(RF_SIG_ACK_NEEDED); - } - - /* Get link information */ - rf_rssi = (int8_t)rf_device->get_last_rssi_dbm(); - rf_sqi = (uint8_t)rf_device->get_last_sqi(); // use SQI as link quality - - /* Note: Checksum of the packet must be checked and removed before entering here */ - /* TODO - betzw: what to do? */ - -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - - /* Send received data and link information to the network stack */ - if( device_driver.phy_rx_cb ){ - rf_send_signal(RF_SIG_CB_RX_RCVD); - } -} - -/* Note: we are in IRQ context */ -static inline void rf_handle_tx_end(void) -{ - /* Check if this is an ACK sending which is still pending */ - if(rf_ack_sent) { - rf_ack_sent = false; -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - return; // no need to inform stack - } - - /* Transform `need_ack` in `expecting_ack` */ - if(need_ack) { - need_ack = false; - expecting_ack = true; - } - - /*Call PHY TX Done API*/ - if(device_driver.phy_tx_done_cb){ - phy_status = PHY_LINK_TX_SUCCESS; - rf_send_signal(RF_SIG_CB_TX_DONE); - } -} - -/* Note: we might be in IRQ context */ -static inline void rf_handle_tx_err(phy_link_tx_status_e phy_val = PHY_LINK_TX_FAIL) { - /*Call PHY TX Done API*/ - if(device_driver.phy_tx_done_cb){ - need_ack = false; - phy_status = phy_val; - rf_send_signal(RF_SIG_CB_TX_DONE); - } -} - -/* Note: we are in IRQ context */ -static void rf_callback_func(int event) { - switch(event) { - case SimpleSpirit1::RX_DONE: - rf_handle_rx_end(); - break; - case SimpleSpirit1::TX_DONE: - rf_handle_tx_end(); - break; - case SimpleSpirit1::TX_ERR: -#ifdef HEAVY_TRACING - tr_debug("%s (%d): TX_ERR!!!", __func__, __LINE__); -#endif - rf_handle_tx_err(); - break; - } -} - -static int8_t rf_trigger_send(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_handle, data_protocol_e data_protocol) -{ -#ifndef NDEBUG - debug_if(!(data_length >= 3), "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - - /* Give 'rf_ack_sender' a better chance to run */ - Thread::yield(); - - /* Get Lock */ - rf_if_lock(); - - /*Check if transmitter is busy*/ - if(rf_device->is_receiving()) { /* betzw - WAS: (rf_device->channel_clear() != 0)), do NOT use this but rather study and enable automatic CCA */ -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - - /* Release Lock */ - rf_if_unlock(); - - /*Return busy*/ - return -1; - } else { - uint16_t fcf = rf_read_16_bit(data_ptr); - - /*Check if transmitted data needs to be acked*/ - if((fcf & MAC_FCF_ACK_REQ_BIT_MASK) >> MAC_FCF_ACK_REQ_BIT_SHIFT) - need_ack = true; - else - need_ack = false; - - /*Store the sequence number for ACK handling*/ - tx_sequence = *(data_ptr + 2); - - /*Store TX handle*/ - mac_tx_handle = tx_handle; - -#ifdef HEAVY_TRACING - tr_info("%s (%d), len=%d, tx_handle=%x, tx_seq=%x, need_ack=%d (%x:%x, %x:%x, %x:%x, %x:%x)", __func__, __LINE__, - data_length, tx_handle, tx_sequence, need_ack, - data_ptr[3], data_ptr[4], data_ptr[5], data_ptr[6], - data_ptr[7], data_ptr[8], data_ptr[9], data_ptr[10]); -#endif - - /*Send the packet*/ - int ret = rf_device->send(data_ptr, data_length); - if(ret != RADIO_TX_OK) { - rf_handle_tx_err(PHY_LINK_CCA_FAIL); - } - - /* Release Lock */ - rf_if_unlock(); - } - - /*Return success*/ - return 0; -} - -static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel) -{ - int8_t ret_val = 0; - switch (new_state) - { - /*Reset PHY driver and set to idle*/ - case PHY_INTERFACE_RESET: - tr_debug("%s (%d)", __func__, __LINE__); - rf_device->reset_board(); - break; - /*Disable PHY Interface driver*/ - case PHY_INTERFACE_DOWN: - tr_debug("%s (%d)", __func__, __LINE__); - ret_val = rf_device->off(); - if(ret_val != 0) ret_val = -1; - break; - /*Enable PHY Interface driver*/ - case PHY_INTERFACE_UP: - ret_val = rf_device->on(); - if(ret_val != 0) { - tr_debug("%s (%d)", __func__, __LINE__); - ret_val = -1; - break; - } - tr_debug("%s (%d) - channel: %d", __func__, __LINE__, (int)rf_channel); - rf_device->set_channel(rf_channel); - break; - /*Enable wireless interface ED scan mode*/ - case PHY_INTERFACE_RX_ENERGY_STATE: - tr_debug("%s (%d)", __func__, __LINE__); - break; - /*Enable Sniffer state*/ - case PHY_INTERFACE_SNIFFER_STATE: - // TODO - if we really need this - WAS: rf_setup_sniffer(rf_channel); - tr_debug("%s (%d)", __func__, __LINE__); - ret_val = -1; - break; - default: - tr_debug("%s (%d)", __func__, __LINE__); - break; - } - return ret_val; -} - -static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_ptr) -{ - switch (extension_type) - { - /*Control MAC pending bit for Indirect data transmission*/ - case PHY_EXTENSION_CTRL_PENDING_BIT: - tr_debug("%s (%d)", __func__, __LINE__); - break; - - /*Return frame pending status*/ - case PHY_EXTENSION_READ_LAST_ACK_PENDING_STATUS: - tr_debug("%s (%d)", __func__, __LINE__); - *data_ptr = 0; - break; - - /*Set channel, used for setting channel for energy scan*/ - case PHY_EXTENSION_SET_CHANNEL: - tr_debug("%s (%d)", __func__, __LINE__); - break; - - /*Read energy on the channel*/ - case PHY_EXTENSION_READ_CHANNEL_ENERGY: - // TODO: *data_ptr = rf_get_channel_energy(); - tr_debug("%s (%d)", __func__, __LINE__); - *data_ptr = (int8_t)rf_device->get_last_rssi_dbm(); - break; - - /*Read status of the link*/ - case PHY_EXTENSION_READ_LINK_STATUS: - // TODO: *data_ptr = rf_get_link_status(); - tr_debug("%s (%d)", __func__, __LINE__); - *data_ptr = rf_device->get_last_sqi(); // use SQI as link quality - break; - - default: - tr_debug("%s (%d)", __func__, __LINE__); - break; - } - return 0; -} - -static inline void rf_set_mac_address(uint8_t *ptr) { - tr_debug("%s (%d), adr0=%x, adr1=%x, adr2=%x, adr3=%x, adr4=%x, adr5=%x, adr6=%x, adr7=%x", - __func__, __LINE__, - ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]); - for(int i = 0; i < 8; i++) { - stored_mac_address[i] = ptr[i]; - } -} - -static inline void rf_get_mac_address(uint8_t *ptr) { - for(int i = 0; i < 8; i++) { - ptr[i] = stored_mac_address[i]; - } - tr_debug("%s (%d), adr0=%x, adr1=%x, adr2=%x, adr3=%x, adr4=%x, adr5=%x, adr6=%x, adr7=%x", - __func__, __LINE__, - ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]); -} - -static inline void rf_set_short_adr(uint8_t *ptr) { - stored_short_adr = (ptr[0] << 8) + ptr[1]; // big-endian - tr_debug("%s (%d), adr0=%x, adr1=%x, val=%d", - __func__, __LINE__, - ptr[0], ptr[1], stored_short_adr); -} - -static inline void rf_set_pan_id(uint8_t *ptr) { - stored_pan_id = (ptr[0] << 8) + ptr[1]; // big-endian - tr_debug("%s (%d), adr0=%x, adr1=%x, val=%d", - __func__, __LINE__, - ptr[0], ptr[1], stored_pan_id); -} - -static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address_ptr) -{ - switch (address_type) - { - /*Set 48-bit address*/ - case PHY_MAC_48BIT: - /* Not used in this example */ - // betzw - WAS: rf_set_mac_48bit(address_ptr); - break; - /*Set 64-bit address*/ - case PHY_MAC_64BIT: - rf_set_mac_address(address_ptr); - break; - /*Set 16-bit address*/ - case PHY_MAC_16BIT: - rf_set_short_adr(address_ptr); - break; - /*Set PAN Id*/ - case PHY_MAC_PANID: - rf_set_pan_id(address_ptr); - break; - } - - return 0; -} - -static void rf_ack_loop(void) { - static uint16_t buffer[2] = { - (FC_ACK_FRAME << MAC_FCF_FRAME_TYPE_SHIFT), - 0x0 - }; - - tr_debug("%s (%d)", __func__, __LINE__); - - do { - /* Wait for signal */ - osEvent event = rf_ack_sender.signal_wait(0); - - if(event.status != osEventSignal) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - continue; - } - - int32_t signals = event.value.signals; - -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - - /* Get Lock */ - rf_if_lock(); - - if(signals & RF_SIG_ACK_NEEDED) { -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - - /* Prepare payload */ - uint8_t *ptr = (uint8_t*)&buffer[1]; - ptr[0] = rf_rx_sequence; // Sequence number - - /* Wait for device not receiving */ - while(rf_device->is_receiving()) { -#ifdef HEAVY_TRACING - tr_info("%s (%d)", __func__, __LINE__); -#endif - wait_us(10); - } - -#ifdef HEAVY_TRACING - tr_debug("%s (%d), hdr=%x, nr=%x", __func__, __LINE__, buffer[0], ptr[0]); -#endif - - /* Set information that we have sent an ACK */ - rf_ack_sent = true; - - /*Send the packet*/ - rf_device->send((uint8_t*)buffer, 3, false); - -#ifdef HEAVY_TRACING - tr_debug("%s (%d), hdr=%x, nr=%x", __func__, __LINE__, buffer[0], ptr[0]); -#endif - } - - if(signals & RF_SIG_CB_TX_DONE) { - device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, phy_status, - (phy_status == PHY_LINK_CCA_FAIL) ? 0xFF : 0, 0); -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - } - - if(signals & RF_SIG_CB_RX_RCVD) { - device_driver.phy_rx_cb(rf_rx_buf, rf_buffer_len, rf_sqi, rf_rssi, rf_radio_driver_id); -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - } - - /* Release Lock */ - rf_if_unlock(); - -#ifdef HEAVY_TRACING - tr_debug("%s (%d)", __func__, __LINE__); -#endif - } while(true); -} - -void NanostackRfPhySpirit1::rf_init(void) { -#ifndef NDEBUG - osStatus ret; -#endif - - if(rf_device == NULL) { - rf_device = &SimpleSpirit1::CreateInstance(_spi_mosi, _spi_miso, _spi_sclk, _dev_irq, _dev_cs, _dev_sdn, _brd_led); - rf_device->attach_irq_callback(rf_callback_func); - -#ifndef NDEBUG - ret = -#endif - rf_ack_sender.start(rf_ack_loop); - -#ifndef NDEBUG - debug_if(!(ret == osOK), "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - } -} - -NanostackRfPhySpirit1::NanostackRfPhySpirit1(PinName spi_mosi, PinName spi_miso, PinName spi_sclk, - PinName dev_irq, PinName dev_cs, PinName dev_sdn, PinName brd_led) : - _spi_mosi(spi_mosi), - _spi_miso(spi_miso), - _spi_sclk(spi_sclk), - _dev_irq(dev_irq), - _dev_cs(dev_cs), - _dev_sdn(dev_sdn), - _brd_led(brd_led) -{ - /* Nothing to do */ - tr_debug("%s (%d)", __func__, __LINE__); -} - -NanostackRfPhySpirit1::~NanostackRfPhySpirit1() -{ - /* Nothing to do */ - tr_debug("%s (%d)", __func__, __LINE__); -} - -int8_t NanostackRfPhySpirit1::rf_register() -{ - tr_debug("%s (%d)", __func__, __LINE__); - - /* Get Lock */ - rf_if_lock(); - - /* Do some initialization */ - rf_init(); - - /* Set pointer to MAC address */ - device_driver.PHY_MAC = stored_mac_address; - - /* Set driver Name */ - device_driver.driver_description = (char*)"Spirit1 Sub-GHz RF"; - - /*Type of RF PHY is SubGHz*/ - device_driver.link_type = PHY_LINK_15_4_SUBGHZ_TYPE; - - /*Maximum size of payload*/ - device_driver.phy_MTU = MAX_PACKET_LEN; - - /*No header in PHY*/ - device_driver.phy_header_length = 0; - - /*No tail in PHY*/ - device_driver.phy_tail_length = 0; - - /*Set up driver functions*/ - device_driver.address_write = &rf_address_write; - device_driver.extension = &rf_extension; - device_driver.state_control = &rf_interface_state_control; - device_driver.tx = &rf_trigger_send; - - /*Set supported channel pages*/ - device_driver.phy_channel_pages = phy_channel_pages; - - //Nullify rx/tx callbacks - device_driver.phy_rx_cb = NULL; - device_driver.phy_tx_done_cb = NULL; - device_driver.arm_net_virtual_rx_cb = NULL; - device_driver.arm_net_virtual_tx_cb = NULL; - - /*Register device driver*/ - rf_radio_driver_id = arm_net_phy_register(&device_driver); - - /* Release Lock */ - rf_if_unlock(); - - tr_debug("%s (%d)", __func__, __LINE__); - return rf_radio_driver_id; -} - -void NanostackRfPhySpirit1::rf_unregister() -{ - tr_debug("%s (%d)", __func__, __LINE__); - - /* Get Lock */ - rf_if_lock(); - - if (rf_radio_driver_id >= 0) { - arm_net_phy_unregister(rf_radio_driver_id); - rf_radio_driver_id = -1; - } - - /* Release Lock */ - rf_if_unlock(); -} - -void NanostackRfPhySpirit1::get_mac_address(uint8_t *mac) -{ - tr_debug("%s (%d)", __func__, __LINE__); - - /* Get Lock */ - rf_if_lock(); - - if(rf_radio_driver_id >= 0) { - rf_get_mac_address(mac); - } else { - error("NanostackRfPhySpirit1 must be registered to read mac address"); - } - - /* Release Lock */ - rf_if_unlock(); -} - -void NanostackRfPhySpirit1::set_mac_address(uint8_t *mac) -{ - tr_debug("%s (%d)", __func__, __LINE__); - - /* Get Lock */ - rf_if_lock(); - - if(rf_radio_driver_id < 0) { - rf_set_mac_address(mac); - } else { - error("NanostackRfPhySpirit1 cannot change mac address when running"); - } - - /* Release Lock */ - rf_if_unlock(); -} - -#endif /* MBED_CONF_RTOS_PRESENT */
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/SimpleSpirit1.cpp --- a/stm-spirit1-rf-driver/source/SimpleSpirit1.cpp Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,642 +0,0 @@ -/*** Mbed Includes ***/ -#include "SimpleSpirit1.h" -#include "radio_spi.h" - -#define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_3) - -static uint16_t last_state; -#define SPIRIT1_STATUS() ((last_state = (uint16_t)refresh_state()) & SPIRIT1_STATE_STATEBITS) - -#define XO_ON (0x1) - -#define BUSYWAIT_UNTIL(cond, millisecs) \ - do { \ - uint32_t start = us_ticker_read(); \ - uint32_t limit = (uint32_t)millisecs*1000U; \ - while (!(cond)) { \ - uint32_t now = us_ticker_read(); \ - if((now - start) > limit) break; \ - } \ - } while(0) - -#define st_lib_spirit_irqs SpiritIrqs - -#define STATE_TIMEOUT (100) - -// betzw: switching force & back from standby is on some devices quite unstable -#define USE_STANDBY_STATE - -/*** Class Implementation ***/ -/** Static Class Variables **/ -SimpleSpirit1 *SimpleSpirit1::_singleton = NULL; - -/** Constructor **/ -SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk, - PinName irq, PinName cs, PinName sdn, - PinName led) : - _spi(mosi, miso, sclk), - _irq(irq), - _chip_select(cs), - _shut_down(sdn), - _led(led), - _current_irq_callback(), - _rx_receiving_timeout() -{ -} - -/** Init Function **/ -void SimpleSpirit1::init() { - /* reset irq disable counter and irq callback & disable irq */ - _nr_of_irq_disables = 0; - disable_spirit_irq(); - - /* unselect chip */ - chip_unselect(); - - /* configure spi */ - _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */ - _spi.frequency(10000000); // 10MHz (i.e. max speed allowed for Spirit1) - - /* install irq handler */ - _irq.mode(PullUp); - _irq.fall(Callback<void()>(this, &SimpleSpirit1::IrqHandler)); - - /* init cube vars */ - spirit_on = OFF; - last_rssi = 0 ; //MGR - last_sqi = 0 ; //MGR - - /* set frequencies */ - radio_set_xtal_freq(XTAL_FREQUENCY); - mgmt_set_freq_base((uint32_t)BASE_FREQUENCY); - - /* restart board */ - enter_shutdown(); - exit_shutdown(); - - /* soft core reset */ - cmd_strobe(SPIRIT1_STROBE_SRES); - - /* Configures the SPIRIT1 radio part */ - SRadioInit x_radio_init = { - XTAL_OFFSET_PPM, - (uint32_t)BASE_FREQUENCY, - (uint32_t)CHANNEL_SPACE, - CHANNEL_NUMBER, - MODULATION_SELECT, - DATARATE, - (uint32_t)FREQ_DEVIATION, - (uint32_t)BANDWIDTH - }; - radio_init(&x_radio_init); - /*180117 HJM : ì¡ì ì í¸ ì¸ê¸° */ - radio_set_pa_level_dbm(0,POWER_DBM); - radio_set_pa_level_max_index(0); - - /* Configures the SPIRIT1 packet handler part*/ - PktBasicInit x_basic_init = { - PREAMBLE_LENGTH, - SYNC_LENGTH, - SYNC_WORD, - LENGTH_TYPE, - LENGTH_WIDTH, - CRC_MODE, - CONTROL_LENGTH, - EN_ADDRESS, - EN_FEC, - EN_WHITENING - }; - pkt_basic_init(&x_basic_init); - - /* Enable the following interrupt sources, routed to GPIO */ - irq_de_init(NULL); - irq_clear_status(); - irq_set_status(TX_DATA_SENT, S_ENABLE); - irq_set_status(RX_DATA_READY,S_ENABLE); - irq_set_status(RX_DATA_DISC, S_ENABLE); - irq_set_status(VALID_SYNC, S_ENABLE); - irq_set_status(TX_FIFO_ERROR, S_ENABLE); - irq_set_status(RX_FIFO_ERROR, S_ENABLE); -#ifndef RX_FIFO_THR_WA - irq_set_status(TX_FIFO_ALMOST_EMPTY, S_ENABLE); - irq_set_status(RX_FIFO_ALMOST_FULL, S_ENABLE); -#endif // !RX_FIFO_THR_WA - - /* Configure Spirit1 */ - radio_persistent_rx(S_ENABLE); - qi_set_sqi_threshold(SQI_TH_0); - qi_sqi_check(S_ENABLE); - qi_set_rssi_threshold_dbm(CCA_THRESHOLD); //180117 HJM : RSSI ì ì¡ ì í . ì±ëì´ ë® ì¼ë©´ ì±ëì´ íµí ì¤ì¼ë¡ íì, íì¬ CCA_THRESHOLD => -98.0 ì¤ì ëì´ìì. - timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD); - timer_set_infinite_rx_timeout(); - radio_afc_freeze_on_sync(S_ENABLE); - calibration_rco(S_ENABLE); - - spirit_on = OFF; - CLEAR_TXBUF(); - CLEAR_RXBUF(); - _spirit_tx_started = false; - _is_receiving = false; - - /* Configure the radio to route the IRQ signal to its GPIO 3 */ - SGpioInit x_gpio_init = { - SPIRIT_GPIO_IRQ, - SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, - SPIRIT_GPIO_DIG_OUT_IRQ - }; - spirit_gpio_init(&x_gpio_init); - - /* Setup CSMA/CA */ - CsmaInit x_csma_init = { - S_ENABLE, // enable persistent mode - TBIT_TIME_64, // Tcca time - TCCA_TIME_3, // Lcca length - 5, // max nr of backoffs (<8) - 1, // BU counter seed - 8 // BU prescaler - }; - csma_ca_init(&x_csma_init); - -#ifdef USE_STANDBY_STATE - /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */ - cmd_strobe(SPIRIT1_STROBE_STANDBY); -#endif // USE_STANDBY_STATE -} - - - - - - - - -static volatile int tx_fifo_remaining = 0; // to be used in irq handler -static volatile int tx_buffer_pos = 0; // to be used in irq handler -static const volatile uint8_t *tx_fifo_buffer = NULL; // to be used in irq handler -int SimpleSpirit1::send(const void *payload, unsigned int payload_len, bool use_csma_ca) { - /* Checks if the payload length is supported */ - if(payload_len > MAX_PACKET_LEN) { - return RADIO_TX_ERR; - } - - disable_spirit_irq(); - - BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT); -#ifndef NDEBUG - if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) { - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1); - } -#endif - - /* Reset State to Ready */ - set_ready_state(); - - cmd_strobe(SPIRIT1_STROBE_FTX); // flush TX FIFO buffer - -#ifndef NDEBUG - debug_if(!(linear_fifo_read_num_elements_tx_fifo() == 0), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - - pkt_basic_set_payload_length(payload_len); // set desired payload len - - if(use_csma_ca) { - csma_ca_state(S_ENABLE); // enable CSMA/CA - } - - /* Init buffer & number of bytes to be send */ - tx_fifo_remaining = payload_len; - tx_fifo_buffer = (const uint8_t*)payload; - - int8_t fifo_available = SPIRIT_MAX_FIFO_LEN; // fill-up whole fifo - int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining; - - tx_fifo_remaining -= to_send; - - /* Fill FIFO Buffer */ - if(to_send > 0) { - spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[0]); - } - - tx_buffer_pos = to_send; - _spirit_tx_started = true; - - enable_spirit_irq(); - - /* Start transmitting */ - cmd_strobe(SPIRIT1_STROBE_TX); - - while(tx_fifo_remaining != 0); // wait until not everything is yet send (evtl. by irq handler) - - BUSYWAIT_UNTIL(!_spirit_tx_started, STATE_TIMEOUT); -#ifdef HEAVY_DEBUG - debug("\r\n%s (%d): state=%x, _spirit_tx_started=%d\r\n", __func__, __LINE__, SPIRIT1_STATUS()>>1, _spirit_tx_started); -#endif - - if(use_csma_ca) { - csma_ca_state(S_DISABLE); // disable CSMA/CA - } - - cmd_strobe(SPIRIT1_STROBE_RX); // Return to RX state - - disable_spirit_irq(); - if(_spirit_tx_started) { // in case of state timeout - _spirit_tx_started = false; - enable_spirit_irq(); - return RADIO_TX_ERR; - } else { - enable_spirit_irq(); - return RADIO_TX_OK; - } -} - -/** Set Ready State **/ -void SimpleSpirit1::set_ready_state(void) { - uint16_t state; - - disable_spirit_irq(); - - _spirit_tx_started = false; - _is_receiving = false; - stop_rx_timeout(); - - cmd_strobe(SPIRIT1_STROBE_FRX); - CLEAR_RXBUF(); - CLEAR_TXBUF(); - - state = SPIRIT1_STATUS(); - if(state == SPIRIT1_STATE_STANDBY) { - cmd_strobe(SPIRIT1_STROBE_READY); - } else if(state == SPIRIT1_STATE_RX) { - cmd_strobe(SPIRIT1_STROBE_SABORT); - } else if(state != SPIRIT1_STATE_READY) { -#ifndef NDEBUG - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, state>>1); -#endif - } - - BUSYWAIT_UNTIL((SPIRIT1_STATUS() == SPIRIT1_STATE_READY) && ((last_state & XO_ON) == XO_ON), STATE_TIMEOUT); - if(last_state != (SPIRIT1_STATE_READY | XO_ON)) { - error("\r\nSpirit1: failed to become ready (%x) => pls. reset!\r\n", last_state); - enable_spirit_irq(); - return; - } - - irq_clear_status(); - - enable_spirit_irq(); -} - -int SimpleSpirit1::off(void) { - if(spirit_on == ON) { - /* Disables the mcu to get IRQ from the SPIRIT1 */ - disable_spirit_irq(); - - /* first stop rx/tx */ - set_ready_state(); - -#ifdef USE_STANDBY_STATE - /* Puts the SPIRIT1 in STANDBY */ - cmd_strobe(SPIRIT1_STROBE_STANDBY); - BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, STATE_TIMEOUT); - if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_STANDBY) { - error("\r\nSpirit1: failed to enter standby (%x)\r\n", last_state>>1); - return 1; - } -#endif // USE_STANDBY_STATE - - spirit_on = OFF; - _nr_of_irq_disables = 1; - } - return 0; -} - -int SimpleSpirit1::on(void) { - if(spirit_on == OFF) { - set_ready_state(); - - /* now we go to Rx */ - cmd_strobe(SPIRIT1_STROBE_RX); - - BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT); - if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) { - error("\r\nSpirit1: failed to enter rx (%x) => retry\r\n", last_state>>1); - } - - /* Enables the mcu to get IRQ from the SPIRIT1 */ - spirit_on = ON; -#ifndef NDEBUG - debug_if(!(_nr_of_irq_disables == 1), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - enable_spirit_irq(); - } - -#ifndef NDEBUG - if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) { - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1); - } -#endif - - return 0; -} - -uint8_t SimpleSpirit1::refresh_state(void) { - uint8_t mcstate; - - SpiritSpiReadRegisters(MC_STATE0_BASE, 1, &mcstate); - - return mcstate; -} - -int SimpleSpirit1::read(void *buf, unsigned int bufsize) -{ - disable_spirit_irq(); - - /* Checks if the RX buffer is empty */ - if(IS_RXBUF_EMPTY()) { -#ifndef NDEBUG - debug("\r\nBuffer is empty\r\n"); -#endif - set_ready_state(); - - cmd_strobe(SPIRIT1_STROBE_RX); - BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT); - enable_spirit_irq(); - return 0; - } - - if(bufsize < spirit_rx_len) { - enable_spirit_irq(); - - /* If buf has the correct size */ -#ifndef NDEBUG - debug("\r\nTOO SMALL BUF\r\n"); -#endif - return 0; - } else { - /* Copies the packet received */ - memcpy(buf, spirit_rx_buf, spirit_rx_len); - - bufsize = spirit_rx_len; - CLEAR_RXBUF(); - - enable_spirit_irq(); - - return bufsize; - } - -} - -int SimpleSpirit1::channel_clear(void) -{ - float rssi_value; - /* Local variable used to memorize the SPIRIT1 state */ - uint8_t spirit_state = ON; - - if(spirit_on == OFF) { - /* Wakes up the SPIRIT1 */ - on(); - spirit_state = OFF; - } - -#ifndef NDEBUG - if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) { - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1); - } -#endif - - disable_spirit_irq(); - - /* Reset State to Ready */ - set_ready_state(); - - /* Stores the RSSI value */ - rssi_value = qi_get_rssi_dbm(); - - enable_spirit_irq(); - - /* Puts the SPIRIT1 in its previous state */ - if(spirit_state==OFF) { - off(); -#ifndef NDEBUG -#ifdef USE_STANDBY_STATE - if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) { -#else - if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) { -#endif - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1); - } -#endif - } else { - disable_spirit_irq(); - - set_ready_state(); - - cmd_strobe(SPIRIT1_STROBE_RX); - BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT); - if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) { - error("\r\nSpirit1: (#2) failed to enter rx (%x) => retry\r\n", last_state>>1); - } - - enable_spirit_irq(); - -#ifndef NDEBUG - if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) { - debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1); - } -#endif - } - - /* Checks the RSSI value with the threshold */ - if(rssi_value<CCA_THRESHOLD) { - return 0; - } else { - return 1; - } - } - - int SimpleSpirit1::get_pending_packet(void) - { - return !IS_RXBUF_EMPTY(); - } - - /** Spirit Irq Callback **/ - /* betzw - TODO: use threaded interrupt handling when `MBED_CONF_RTOS_PRESENT` is defined (see `atmel-rf-driver`) */ - void SimpleSpirit1::IrqHandler() { - st_lib_spirit_irqs x_irq_status; - - /* get interrupt source from radio */ - irq_get_status(&x_irq_status); - - /* The IRQ_TX_DATA_SENT notifies the packet has been sent. Puts the SPIRIT1 in RX */ - if(x_irq_status.IRQ_TX_DATA_SENT) { /* betzw - NOTE: MUST be handled before `IRQ_RX_DATA_READY` for Nanostack integration! - Logically, Nanostack only expects the "DONE" after "SUCCESS" (if it gets - DONE before SUCCESS, it assumes you're not going to bother to send SUCCESS). - */ -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); - debug_if(tx_fifo_remaining != 0, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - - if(_spirit_tx_started) { - _spirit_tx_started = false; - - /* call user callback */ - if(_current_irq_callback) { - _current_irq_callback(TX_DONE); - } - } - - /* Disable handling of other TX flags */ - x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET; - tx_fifo_buffer = NULL; - } - -#ifndef RX_FIFO_THR_WA - /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */ - if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); - debug_if(!_spirit_tx_started, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); - debug_if(tx_fifo_buffer == NULL, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - - int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo - int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining; - - tx_fifo_remaining -= to_send; - - /* Fill FIFO Buffer */ - if(to_send > 0) { - spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]); - } - tx_buffer_pos += to_send; - } -#endif // !RX_FIFO_THR_WA - - /* TX FIFO underflow/overflow error */ - if(x_irq_status.IRQ_TX_FIFO_ERROR) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); - debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - if(_spirit_tx_started) { - _spirit_tx_started = false; - /* call user callback */ - if(_current_irq_callback) { - _current_irq_callback(TX_ERR); - } - } - - /* reset data still to be sent */ - tx_fifo_remaining = 0; - } - - /* The IRQ_RX_DATA_READY notifies a new packet arrived */ - if(x_irq_status.IRQ_RX_DATA_READY) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug_if(!((*tmp) & IRQ_RX_DATA_READY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - - if(!_is_receiving) { // spurious irq?!? (betzw: see comments on macro 'RX_FIFO_THR_WA'!) -#ifdef HEAVY_DEBUG - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); -#endif - } else { - _is_receiving = false; // Finished receiving - stop_rx_timeout(); - - spirit_rx_len = pkt_basic_get_received_pkt_length(); - -#ifdef DEBUG_IRQ - debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); -#endif - - if(spirit_rx_len <= MAX_PACKET_LEN) { - uint8_t to_receive = spirit_rx_len - _spirit_rx_pos; - if(to_receive > 0) { - spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]); - _spirit_rx_pos += to_receive; - } - } - - cmd_strobe(SPIRIT1_STROBE_FRX); - - last_rssi = qi_get_rssi(); //MGR - last_sqi = qi_get_sqi(); //MGR - - /* call user callback */ - if((_spirit_rx_pos == spirit_rx_len) && _current_irq_callback) { - _current_irq_callback(RX_DONE); - } - - /* Disable handling of other RX flags */ - x_irq_status.IRQ_RX_FIFO_ALMOST_FULL = S_RESET; - } - } - -#ifndef RX_FIFO_THR_WA - /* RX FIFO almost full */ - if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug_if(!((*tmp) & IRQ_RX_FIFO_ALMOST_FULL_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - if(!_is_receiving) { // spurious irq?!? -#ifdef DEBUG_IRQ - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); -#endif - } else { - uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo(); - if((fifo_available + _spirit_rx_pos) <= MAX_PACKET_LEN) { - spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]); - _spirit_rx_pos += fifo_available; - } else { -#ifdef DEBUG_IRQ - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); -#endif - } - } - } -#endif // !RX_FIFO_THR_WA - - /* Reception errors */ - if((x_irq_status.IRQ_RX_FIFO_ERROR) || (x_irq_status.IRQ_RX_DATA_DISC)) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); - debug_if(!((*tmp) & (IRQ_RX_FIFO_ERROR_MASK | IRQ_RX_DATA_DISC_MASK)), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - rx_timeout_handler(); - if(_spirit_tx_started) { - _spirit_tx_started = false; - /* call user callback */ - if(_current_irq_callback) { - _current_irq_callback(TX_ERR); - } - } - } - - /* The IRQ_VALID_SYNC is used to notify a new packet is coming */ - if(x_irq_status.IRQ_VALID_SYNC) { -#ifdef DEBUG_IRQ - uint32_t *tmp = (uint32_t*)&x_irq_status; - debug_if(!((*tmp) & IRQ_VALID_SYNC_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - /* betzw - NOTE: there is a race condition between Spirit1 receiving packets and - * the MCU trying to send a packet, which gets resolved in favor of - * sending. - */ - if(_spirit_tx_started) { -#ifdef DEBUG_IRQ - debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp); -#endif - } else { - _is_receiving = true; - start_rx_timeout(); - } - } - }
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/README.md --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/README.md Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -Getting Started with Contiki for STM32 Nucleo equipped with sub-1GHz SPIRIT1 expansion boards -============================================================================================= - -This guide explains how to get started with the STM32 Nucleo and expansion boards port to Contiki. - -Port Feature -============ - -The port supports the following boards from ST: -- NUCLEO-L152RE board, based on the STM32L152RET6 ultra-low power microcontroller -- X-NUCLEO-IDS01A4 based on sub-1GHz SPSGRF-868 SPIRIT1 module (operating at 868 MHz) -- X-NUCLEO-IDS01A5 based on sub-1GHz SPSGRF-915 SPIRIT1 module (operating at 915 MHz) -- X-NUCLEO-IKS01A1 featuring motion MEMS and environmental sensors (optional) - -The following drivers are included: -- LEDs and buttons (user, reset) -- USB -- SPIRIT1 sub-1GHz transceiver -- HTS221, LIS3MDL, LPS25HB, LSM6DS0 sensors - - -Hardware Requirements -===================== - -* NUCLEO-L152RE development board - - >The NUCLEO-L152RE board belongs to the STM32 Nucleo family. -It features an STM32L152RET6 ultra-low power microcontroller based on ARM Cortex M3 MCU. -Detailed information on the NUCLEO-L152RE development board can be found at: -http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260002 - - -* X-NUCLEO-IDS01Ax sub-1GHz expansion board - - >The X-NUCLEO-IDS01A4 and X-NUCLEO-IDS01A5 are STM32 Nucleo expansion boards that use -the module SPSGRF-868 or SPSGRF-915 based on SPIRIT1 low data rate, low power sub-1 GHz transceiver. - - >The user can select the X-NUCLEO-IDS01A4 board to operate the SPIRIT1 transceiver at 868MHz or the X-NUCLEO-IDS01A5 board to operate the SPIRIT1 transceiver at 915MHz. - - >Detailed information on the X-NUCLEO-IDS01A4 expansion board can be found at: -http://www.st.com/web/catalog/tools/FM146/CL2167/SC2006/PF261982 - - >Detailed information on the X-NUCLEO-IDS01A5 expansion board can be found at: -http://www.st.com/web/catalog/tools/FM146/CL2167/SC2006/PF261983 - - >Detailed information on the SPIRIT1 sub-1GHz transceiver can be found at: -http://www.st.com/web/catalog/sense_power/FM2185/SC1845/PF253167 - -* X-NUCLEO-IKS01A1, motion MEMS and environmental sensors expansion board (OPTIONAL) - - >The X-NUCLEO-IKS01A1 is a motion MEMS and environmental sensor evaluation board. -The use of this board is optional in the stm32nucleo-spirit1 Contiki platform. - - >Detailed information on the X-NUCLEO-IKS01A1 expansion board can be found at: -http://www.st.com/web/catalog/tools/FM146/CL2167/SC2006/PF261191 - - -* USB type A to Mini-B USB cable, to connect the STM32 Nucleo board to the PC - -Software Requirements -===================== - -The following software are needed: - -* ST port of Contiki for STM32 Nucleo and expansion boards. - - >The port is automatically installed when both the Contiki and the submodule repository are cloned: the former hosts the Contiki distribution and the ST platform interface, the latter hosts the actual library. The following commands are needed to download the full porting: - - git clone https://github.com/STclab/contiki.git - cd contiki/ - git checkout stm32nucleo-spirit1 - git submodule init - git submodule update - - -Note: the first and third steps are required only if using the STclab GitHub repository, they won't be needed any more once the Pull Request is accepted. - -The platform name is: stm32nucleo-spirit1 - -* A toolchain to build the firmware: The port has been developed and tested with GNU Tools -for ARM Embedded Processors. - >The toolchain can be found at: https://launchpad.net/gcc-arm-embedded -The port was developed and tested using this version: gcc-arm-none-eabi v4.8.3 - - -Examples -======== - -The following examples have been successfully tested: - -* examples/stm32nucleo-spirit1/sensor-demo -* examples/ipv6/simple-udp-rpl (multicast, rpl-border-router, simple-udp-rpl) - - -Build an example -================ -In order to build an example go to the selected example directory (see a list of tested -examples in the previous section). - -For example, go to examples/ipv6/simple-udp-rpl directory. - - -If the X-NUCLEO-IDS01A4 sub-1GHz RF expansion board is used, the following must be run: - - make TARGET=stm32nucleo-spirit1 USE_SUBGHZ_BOARD=IDS01A4 clean - make TARGET=stm32nucleo-spirit1 USE_SUBGHZ_BOARD=IDS01A4 - -If the X-NUCLEO-IDS01A5 sub-1GHz RF expansion board is used, the following must be run: - - make TARGET=stm32nucleo-spirit1 USE_SUBGHZ_BOARD=IDS01A5 clean - make TARGET=stm32nucleo-spirit1 USE_SUBGHZ_BOARD=IDS01A5 - - -This will create executables for UDP sender and receiver nodes. - -In order to generate binary files that can be flashed on the STM32 Nucleo the following command must be run: - - arm-none-eabi-objcopy -O binary unicast-sender.stm32nucleo-spirit1 unicast-sender.bin - arm-none-eabi-objcopy -O binary unicast-receiver.stm32nucleo-spirit1 unicast-receiver.bin - -These executables can be programmed on the nodes using the procedure described hereafter. - - -In case you need to build an example that uses the additional sensors expansion board -(for example, considering a system made of NUCLEO-L152RE, X-NUCLEO-IDS01A4 and X-NUCLEO-IKS01A1) -then the command to be run would be: - - make TARGET=stm32nucleo-spirit1 USE_SUBGHZ_BOARD=IDS01A4 USE_SENSOR_BOARD=1 - -System setup -============ - -1. Check that the jumper on the J1 connector on the X-NUCLEO-IDS01Ax expansion board is connected. -This jumper provides the required voltage to the devices on the board. - -2. Connect the X-NUCLEO-IDS01Ax board to the STM32 Nucleo board (NUCLEO-L152RE) from the top. - -3. If the optional X-NUCLEO-IKS01A1 board is used, connect it on top of the X-NUCLEO-IDS01Ax board. - -4. Power the STM32 Nucleo board using the Mini-B USB cable connected to the PC. - -5. Program the firmware on the STM32 Nucleo board. -This can be done by copying the binary file on the USB mass storage that is -automatically created when plugging the STM32 Nucleo board to the PC. - -6. Reset the MCU by using the reset button on the STM32 Nucleo board - - - - - - - - -
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/contiki-conf.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/contiki-conf.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/** -****************************************************************************** -* @file platform/stm32nucleo-spirit1/contiki-conf.h -* @author System LAB -* @version V1.0.0 -* @date 17-May-2015 -* @brief Contiki configuration parameters -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ -/*---------------------------------------------------------------------------*/ -#ifndef __CONTIKI_CONF_H__ -#define __CONTIKI_CONF_H__ -/*---------------------------------------------------------------------------*/ -#include "platform-conf.h" -//#include "project-conf.h" -/*---------------------------------------------------------------------------*/ -#define SLIP_BRIDGE_CONF_NO_PUTCHAR 1 - -#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 -#define NULLRDC_CONF_802154_AUTOACK 0 -#define NETSTACK_CONF_FRAMER framer_802154 -#define NETSTACK_CONF_NETWORK sicslowpan_driver - -#undef NETSTACK_CONF_RDC -#define NETSTACK_CONF_RDC nullrdc_driver -#define NETSTACK_RDC_HEADER_LEN 0 - -#undef NETSTACK_CONF_MAC -#define NETSTACK_CONF_MAC csma_driver -#define NETSTACK_MAC_HEADER_LEN 0 - -#define SICSLOWPAN_CONF_MAC_MAX_PAYLOAD \ - (NETSTACK_RADIO_MAX_PAYLOAD_LEN - NETSTACK_MAC_HEADER_LEN - \ - NETSTACK_RDC_HEADER_LEN ) - -#define RIMESTATS_CONF_ENABLED 0 -#define RIMESTATS_CONF_ON 0 - - -/* Network setup for IPv6 */ - -#define CXMAC_CONF_ANNOUNCEMENTS 0 - - -/* A trick to resolve a compilation error with IAR. */ -#ifdef __ICCARM__ -#define UIP_CONF_DS6_AADDR_NBU 1 -#endif - -/* radio driver blocks until ACK is received */ -#define NULLRDC_CONF_ACK_WAIT_TIME (0) -#define CONTIKIMAC_CONF_BROADCAST_RATE_LIMIT 0 -#define IEEE802154_CONF_PANID 0xABCD - -#define AODV_COMPLIANCE - -#define WITH_ASCII 1 - -#define PROCESS_CONF_NUMEVENTS 8 -#define PROCESS_CONF_STATS 1 -/*#define PROCESS_CONF_FASTPOLL 4*/ - - -#define LINKADDR_CONF_SIZE 8 - -#define UIP_CONF_LL_802154 1 -#define UIP_CONF_LLH_LEN 0 - -#define UIP_CONF_ROUTER 1 - -/* configure number of neighbors and routes */ -#ifndef UIP_CONF_DS6_ROUTE_NBU -#define UIP_CONF_DS6_ROUTE_NBU 30 -#endif /* UIP_CONF_DS6_ROUTE_NBU */ - -#ifndef UIP_CONF_ND6_SEND_RA -#define UIP_CONF_ND6_SEND_RA 0 -#endif -#define UIP_CONF_ND6_REACHABLE_TIME 600000 //90000// 600000 -#define UIP_CONF_ND6_RETRANS_TIMER 10000 - - -#define UIP_CONF_IPV6 1 -#ifndef UIP_CONF_IPV6_QUEUE_PKT -#define UIP_CONF_IPV6_QUEUE_PKT 0 -#endif /* UIP_CONF_IPV6_QUEUE_PKT */ -#define UIP_CONF_IP_FORWARD 0 -#ifndef UIP_CONF_BUFFER_SIZE -//#define UIP_CONF_BUFFER_SIZE 280 -#define UIP_CONF_BUFFER_SIZE 600 -#endif - -#define SICSLOWPAN_CONF_MAXAGE 4 -#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 - - -#ifndef SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS -#define SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS 5 -#endif /* SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS */ - -#define UIP_CONF_ICMP_DEST_UNREACH 1 - -#define UIP_CONF_DHCP_LIGHT -#define UIP_CONF_LLH_LEN 0 -#ifndef UIP_CONF_RECEIVE_WINDOW -#define UIP_CONF_RECEIVE_WINDOW 150 -#endif -#ifndef UIP_CONF_TCP_MSS -#define UIP_CONF_TCP_MSS UIP_CONF_RECEIVE_WINDOW -#endif -#define UIP_CONF_MAX_CONNECTIONS 4 -#define UIP_CONF_MAX_LISTENPORTS 8 -#define UIP_CONF_UDP_CONNS 12 -#define UIP_CONF_FWCACHE_SIZE 30 -#define UIP_CONF_BROADCAST 1 -#define UIP_ARCH_IPCHKSUM 0 -#define UIP_CONF_UDP 1 -#define UIP_CONF_UDP_CHECKSUMS 1 -#define UIP_CONF_TCP 1 -/*---------------------------------------------------------------------------*/ -/* include the project config */ -/* PROJECT_CONF_H might be defined in the project Makefile */ -#ifdef PROJECT_CONF_H -#include "project-conf.h" -#endif /* PROJECT_CONF_H */ -/*---------------------------------------------------------------------------*/ -#endif /* CONTIKI_CONF_H */ -/*---------------------------------------------------------------------------*/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/hw-config.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/hw-config.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ - /** - ****************************************************************************** - * @file hw-config.h - * @author System LAB - * @version V1.0.0 - * @date 17-May-2015 - * @brief Header file for Hardware Configuration & Setup - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ -/*---------------------------------------------------------------------------*/ -#ifndef __HW_CONFIG_H -#define __HW_CONFIG_H -/*---------------------------------------------------------------------------*/ -#include "stm32l-spirit1-config.h" -/*---------------------------------------------------------------------------*/ -#define UART_RxBufferSize 512 -/*---------------------------------------------------------------------------*/ -#define I2Cx I2C1 -#define I2Cx_CLK_ENABLE() __I2C1_CLK_ENABLE() -#define I2Cx_SDA_GPIO_CLK_ENABLE() __GPIOB_CLK_ENABLE() -#define I2Cx_SCL_GPIO_CLK_ENABLE() __GPIOB_CLK_ENABLE() -/*---------------------------------------------------------------------------*/ -#define I2Cx_FORCE_RESET() __I2C1_FORCE_RESET() -#define I2Cx_RELEASE_RESET() __I2C1_RELEASE_RESET() -/*---------------------------------------------------------------------------*/ -/* Definition for I2Cx Pins */ -#define I2Cx_SCL_PIN GPIO_PIN_8 -#define I2Cx_SCL_GPIO_PORT GPIOB -#define I2Cx_SDA_PIN GPIO_PIN_9 -#define I2Cx_SDA_GPIO_PORT GPIOB -#define I2Cx_SCL_SDA_AF GPIO_AF4_I2C1 - -/* Definition for I2Cx's NVIC */ -#define I2Cx_EV_IRQn I2C1_EV_IRQn -#define I2Cx_ER_IRQn I2C1_ER_IRQn -#define I2Cx_EV_IRQHandler I2C1_EV_IRQHandler -#define I2Cx_ER_IRQHandler I2C1_ER_IRQHandler - - -#define I2Cx I2C1 -#define I2Cx_CLK_ENABLE() __I2C1_CLK_ENABLE() -#define I2Cx_SDA_GPIO_CLK_ENABLE() __GPIOB_CLK_ENABLE() -#define I2Cx_SCL_GPIO_CLK_ENABLE() __GPIOB_CLK_ENABLE() - -#define I2Cx_FORCE_RESET() __I2C1_FORCE_RESET() -#define I2Cx_RELEASE_RESET() __I2C1_RELEASE_RESET() - -/* Definition for I2Cx Pins */ -#define I2Cx_SCL_PIN GPIO_PIN_8 -#define I2Cx_SCL_GPIO_PORT GPIOB -#define I2Cx_SDA_PIN GPIO_PIN_9 -#define I2Cx_SDA_GPIO_PORT GPIOB -#define I2Cx_SCL_SDA_AF GPIO_AF4_I2C1 - -/* Definition for I2Cx's NVIC */ -#define I2Cx_EV_IRQn I2C1_EV_IRQn -#define I2Cx_ER_IRQn I2C1_ER_IRQn -#define I2Cx_EV_IRQHandler I2C1_EV_IRQHandler -#define I2Cx_ER_IRQHandler I2C1_ER_IRQHandler - -/* User can use this section to tailor USARTx/UARTx instance used and associated - resources */ -/* Definition for USARTx clock resources */ -#define USARTx USART2 -#define USARTx_CLK_ENABLE() __USART2_CLK_ENABLE(); -#define DMAx_CLK_ENABLE() __DMA1_CLK_ENABLE() -#define USARTx_RX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE() -#define USARTx_TX_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE() - -#define USARTx_FORCE_RESET() __USART2_FORCE_RESET() -#define USARTx_RELEASE_RESET() __USART2_RELEASE_RESET() - -/* Definition for USARTx Pins */ -#define USARTx_TX_PIN GPIO_PIN_2 -#define USARTx_TX_GPIO_PORT GPIOA - -#define USARTx_RX_PIN GPIO_PIN_3 -#define USARTx_RX_GPIO_PORT GPIOA - - /* Definition for USARTx's NVIC */ -#define USARTx_IRQn USART2_IRQn -#define USARTx_IRQHandler USART2_IRQHandler - -#define USARTx_TX_AF GPIO_AF7_USART2 -#define USARTx_RX_AF GPIO_AF7_USART2 - - - /* Enable sensor mask */ -#define PRESSURE_SENSOR 0x00000001 -#define TEMPERATURE_SENSOR 0x00000002 -#define HUMIDITY_SENSOR 0x00000004 -#define UV_SENSOR 0x00000008 -#define ACCELEROMETER_SENSOR 0x00000010 -#define GYROSCOPE_SENSOR 0x00000020 -#define MAGNETIC_SENSOR 0x00000040 -/*---------------------------------------------------------------------------*/ -#endif /*__HW_CONFIG_H*/ -/*---------------------------------------------------------------------------*/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/ip64-conf.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/ip64-conf.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2012, Thingsquare, http://www.thingsquare.com/. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions 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 the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER 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. - * - */ -#ifndef IP64_CONF_H -#define IP64_CONF_H - -/* -#include "ip64-tap-driver.h" -#include "ip64-eth-interface.h" - -#define IP64_CONF_UIP_FALLBACK_INTERFACE ip64_eth_interface -#define IP64_CONF_INPUT ip64_eth_interface_input - -#define IP64_CONF_ETH_DRIVER ip64_tap_driver - - -#undef UIP_FALLBACK_INTERFACE -#define UIP_FALLBACK_INTERFACE ip64_uip_fallback_interface -*/ -#ifdef MY_DRIVERS -#include <my_wifi_interface.h> -#include <my_wifi_driver.h> - -#define IP64_CONF_UIP_FALLBACK_INTERFACE_SLIP 0 -#define IP64_CONF_UIP_FALLBACK_INTERFACE my_wifi_interface -#define IP64_CONF_INPUT my_wifi_interface_input -#define IP64_CONF_ETH_DRIVER my_wifi_driver - -#undef UIP_CONF_ND6_RA_RDNSS -#define UIP_CONF_ND6_RA_RDNSS 1 - -#undef UIP_CONF_ND6_SEND_RA -#define UIP_CONF_ND6_SEND_RA 1 - -#undef UIP_CONF_ROUTER -#define UIP_CONF_ROUTER 1 - -#ifndef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 16 -#endif - - -#else - - -#include "net/ip64/ip64-slip-interface.h" -#include "net/ip64/ip64-null-driver.h" - -#define IP64_CONF_UIP_FALLBACK_INTERFACE_SLIP 1 -#define IP64_CONF_UIP_FALLBACK_INTERFACE ip64_slip_interface -#define IP64_CONF_INPUT ip64_slip_interface_input -#define IP64_CONF_ETH_DRIVER ip64_null_driver - -#undef UIP_CONF_ND6_RA_RDNSS -#define UIP_CONF_ND6_RA_RDNSS 1 - -#undef UIP_CONF_ND6_SEND_RA -#define UIP_CONF_ND6_SEND_RA 1 - -#undef UIP_CONF_ROUTER -#define UIP_CONF_ROUTER 1 - -#ifndef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 16 -#endif - -#endif//MY_DRIVERS - -#endif /* IP64_CONF_H */
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/platform-conf.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/platform-conf.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/** -****************************************************************************** -* @file platform/stm32nucleo-spirit1/platform-conf.h -* @author System LAB -* @version V1.0.0 -* @date 17-May-2015 -* @brief Configuration parameters -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ -/*---------------------------------------------------------------------------*/ -/** - * \addtogroup stm32nucleo-spirit1 - * @{ - * - * \defgroup stm32nucleo-spirit1-peripherals User Button on STM32 Nucleo - * - * Defines some of the platforms capabilities - * @{ - * - * \file - * Header file for the stm32nucleo-spirit1 platform configuration - */ -/*---------------------------------------------------------------------------*/ -#ifndef __PLATFORM_CONF_H__ -#define __PLATFORM_CONF_H__ -/*---------------------------------------------------------------------------*/ -#ifdef USE_STM32L1XX_NUCLEO -#include <inttypes.h> -#include <string.h> -/*---------------------------------------------------------------------------*/ -#define PLATFORM_HAS_LEDS 1 -#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_RADIO 1 - -#define LEDS_GREEN 1 /*Nucleo LED*/ -#define LEDS_RED 2 /*SPIRIT1 LED*/ - -#ifdef COMPILE_SENSORS -#define LEDS_CONF_ALL 1 /*Can't use SPIRIT1 LED in this case*/ -#else -#define LEDS_CONF_ALL 3 /*No sensors -> we can use SPIRIT1 LED in this case*/ -#endif /*COMPILE_SENSORS*/ -/*---------------------------------------------------------------------------*/ -#define F_CPU 32000000ul -#define RTIMER_ARCH_SECOND 32768 -#define PRESCALER ((F_CPU / (RTIMER_ARCH_SECOND*2))) - -#define UART1_CONF_TX_WITH_INTERRUPT 0 -#define WITH_SERIAL_LINE_INPUT 1 -#define TELNETD_CONF_NUMLINES 6 -#define NETSTACK_CONF_RADIO spirit_radio_driver -#define NETSTACK_RADIO_MAX_PAYLOAD_LEN 96 /* spirit1-config.h */ - -#if WITH_IP64 -#include "ip64-conf.h" -#define WITH_SLIP 1 -#ifndef UIP_FALLBACK_INTERFACE -#define UIP_FALLBACK_INTERFACE ip64_uip_fallback_interface -#endif -#endif /* WITH_IP64 */ - -/*---------------------------------------------------------------------------*/ -/* define ticks/second for slow and fast clocks. Notice that these should be a - power of two, eg 64,128,256,512 etc, for efficiency as POT's can be optimized - well. */ -#define CLOCK_CONF_SECOND 128 -#define RELOAD_VALUE ((F_CPU/CLOCK_CONF_SECOND) - 1) -/* One tick: 62.5 ms */ - -#define RTIMER_CLOCK_LT(a,b) ((signed short)((a)-(b)) < 0) -/*---------------------------------------------------------------------------*/ -typedef unsigned long clock_time_t; -typedef unsigned long long rtimer_clock_t; -/*---------------------------------------------------------------------------*/ -#define CC_CONF_REGISTER_ARGS 0 -#define CC_CONF_FUNCTION_POINTER_ARGS 1 -#define CC_CONF_FASTCALL -#define CC_CONF_VA_ARGS 1 -#define CC_CONF_INLINE inline - -#define CCIF -#define CLIF -/*---------------------------------------------------------------------------*/ -typedef uint8_t u8_t; -typedef uint16_t u16_t; -typedef uint32_t u32_t; -typedef int32_t s32_t; -typedef unsigned short uip_stats_t; -/*---------------------------------------------------------------------------*/ -#define MULTICHAN_CONF_SET_CHANNEL(x) -#define MULTICHAN_CONF_READ_RSSI(x) 0 -/*---------------------------------------------------------------------------*/ -#endif//USE_STM32L1XX_NUCLEO - -#ifdef USE_STM32F4XX_NUCLEO -#include <inttypes.h> -#include <string.h> -#include "main.h" -/*---------------------------------------------------------------------------*/ -#define PLATFORM_HAS_LEDS 1 -#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_RADIO 1 - -#define LEDS_GREEN 1 /*Nucleo LED*/ -#define LEDS_RED 2 /*SPIRIT1 LED*/ - -#ifdef COMPILE_SENSORS -#define LEDS_CONF_ALL 1 /*Can't use SPIRIT1 LED in this case*/ -#else -#define LEDS_CONF_ALL 3 /*No sensors -> we can use SPIRIT1 LED in this case*/ -#endif /*COMPILE_SENSORS*/ -/*---------------------------------------------------------------------------*/ -#define F_CPU 84000000ul -#define RTIMER_ARCH_SECOND 96000//32678 -//#define PRESCALER uwPrescalerValue - -#define UART1_CONF_TX_WITH_INTERRUPT 0 -#define WITH_SERIAL_LINE_INPUT 1 -#define TELNETD_CONF_NUMLINES 6 -#define NETSTACK_CONF_RADIO spirit_radio_driver -#define NETSTACK_RADIO_MAX_PAYLOAD_LEN 96 /* spirit1-config.h */ - -#if WITH_IP64 -#include "ip64-conf.h" -#define WITH_SLIP 1 -#ifndef UIP_FALLBACK_INTERFACE -#define UIP_FALLBACK_INTERFACE ip64_uip_fallback_interface -#endif -#endif /* WITH_IP64 */ - -/*---------------------------------------------------------------------------*/ -/* define ticks/second for slow and fast clocks. Notice that these should be a - power of two, eg 64,128,256,512 etc, for efficiency as POT's can be optimized - well. */ -#define CLOCK_CONF_SECOND 512 -#define RELOAD_VALUE ((F_CPU/CLOCK_CONF_SECOND) - 1) - -/* One tick: 62.5 ms */ - -#define RTIMER_CLOCK_LT(a,b) ((signed short)((a)-(b)) < 0) -/*---------------------------------------------------------------------------*/ -typedef unsigned long clock_time_t; -typedef unsigned long long rtimer_clock_t; -/*---------------------------------------------------------------------------*/ -#define CC_CONF_REGISTER_ARGS 0 -#define CC_CONF_FUNCTION_POINTER_ARGS 1 -#define CC_CONF_FASTCALL -#define CC_CONF_VA_ARGS 1 -#define CC_CONF_INLINE inline - -#define CCIF -#define CLIF -/*---------------------------------------------------------------------------*/ -typedef uint8_t u8_t; -typedef uint16_t u16_t; -typedef uint32_t u32_t; -typedef int32_t s32_t; -typedef unsigned short uip_stats_t; -/*---------------------------------------------------------------------------*/ -#define MULTICHAN_CONF_SET_CHANNEL(x) -#define MULTICHAN_CONF_READ_RSSI(x) 0 -/*---------------------------------------------------------------------------*/ -#endif//USE_STM32F4XX_NUCLEO - -#endif /* __PLATFORM_CONF_H__ */ -/*---------------------------------------------------------------------------*/ -/** - * @} - * @} - */
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/radio.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/radio.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,282 +0,0 @@ -/* - * Copyright (c) 2005, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions 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 the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE 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. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * Header file for the radio API - * \author - * Adam Dunkels <adam@sics.se> - * Joakim Eriksson <joakime@sics.se> - * Niclas Finne <nfi@sics.se> - * Nicolas Tsiftes <nvt@sics.se> - */ - -/** - * \addtogroup dev - * @{ - */ - -/** - * \defgroup radio Radio API - * - * The radio API module defines a set of functions that a radio device - * driver must implement. - * - * @{ - */ - -#ifndef RADIO_H_ -#define RADIO_H_ - -#include <stddef.h> - -/** - * Each radio has a set of parameters that designate the current - * configuration and state of the radio. Parameters can either have - * values of type radio_value_t, or, when this type is insufficient, a - * generic object that is specified by a memory pointer and the size - * of the object. - * - * The radio_value_t type is set to an integer type that can hold most - * values used to configure the radio, and is therefore the most - * common type used for a parameter. Certain parameters require - * objects of a considerably larger size than radio_value_t, however, - * and in these cases the documentation below for the parameter will - * indicate this. - * - * All radio parameters that can vary during runtime are prefixed by - * "RADIO_PARAM", whereas those "parameters" that are guaranteed to - * remain immutable are prefixed by "RADIO_CONST". Each mutable - * parameter has a set of valid parameter values. When attempting to - * set a parameter to an invalid value, the radio will return - * RADIO_RESULT_INVALID_VALUE. - * - * Some radios support only a subset of the defined radio parameters. - * When trying to set or get such an unsupported parameter, the radio - * will return RADIO_RESULT_NOT_SUPPORTED. - */ - -typedef int radio_value_t; -typedef unsigned radio_param_t; - -enum { - - /* Radio power mode determines if the radio is on - (RADIO_POWER_MODE_ON) or off (RADIO_POWER_MODE_OFF). */ - RADIO_PARAM_POWER_MODE, - - /* - * Channel used for radio communication. The channel depends on the - * communication standard used by the radio. The values can range - * from RADIO_CONST_CHANNEL_MIN to RADIO_CONST_CHANNEL_MAX. - */ - RADIO_PARAM_CHANNEL, - - /* Personal area network identifier, which is used by the address filter. */ - RADIO_PARAM_PAN_ID, - - /* Short address (16 bits) for the radio, which is used by the address - filter. */ - RADIO_PARAM_16BIT_ADDR, - - /* - * Radio receiver mode determines if the radio has address filter - * (RADIO_RX_MODE_ADDRESS_FILTER) and auto-ACK (RADIO_RX_MODE_AUTOACK) - * enabled. This parameter is set as a bit mask. - */ - RADIO_PARAM_RX_MODE, - - /* - * Radio transmission mode determines if the radio has send on CCA - * (RADIO_TX_MODE_SEND_ON_CCA) enabled or not. This parameter is set - * as a bit mask. - */ - RADIO_PARAM_TX_MODE, - - /* - * Transmission power in dBm. The values can range from - * RADIO_CONST_TXPOWER_MIN to RADIO_CONST_TXPOWER_MAX. - * - * Some radios restrict the available values to a subset of this - * range. If an unavailable TXPOWER value is requested to be set, - * the radio may select another TXPOWER close to the requested - * one. When getting the value of this parameter, the actual value - * used by the radio will be returned. - */ - RADIO_PARAM_TXPOWER, - - /* - * Clear channel assessment threshold in dBm. This threshold - * determines the minimum RSSI level at which the radio will assume - * that there is a packet in the air. - * - * The CCA threshold must be set to a level above the noise floor of - * the deployment. Otherwise mechanisms such as send-on-CCA and - * low-power-listening duty cycling protocols may not work - * correctly. Hence, the default value of the system may not be - * optimal for any given deployment. - */ - RADIO_PARAM_CCA_THRESHOLD, - - /* Received signal strength indicator in dBm. */ - RADIO_PARAM_RSSI, - - /* - * Long (64 bits) address for the radio, which is used by the address filter. - * The address is specified in network byte order. - * - * Because this parameter value is larger than what fits in radio_value_t, - * it needs to be used with radio.get_object()/set_object(). - */ - RADIO_PARAM_64BIT_ADDR, - - /* Constants (read only) */ - - /* The lowest radio channel. */ - RADIO_CONST_CHANNEL_MIN, - /* The highest radio channel. */ - RADIO_CONST_CHANNEL_MAX, - - /* The minimum transmission power in dBm. */ - RADIO_CONST_TXPOWER_MIN, - /* The maximum transmission power in dBm. */ - RADIO_CONST_TXPOWER_MAX -}; - -/* Radio power modes */ -enum { - RADIO_POWER_MODE_OFF, - RADIO_POWER_MODE_ON -}; - -/** - * The radio reception mode controls address filtering and automatic - * transmission of acknowledgements in the radio (if such operations - * are supported by the radio). A single parameter is used to allow - * setting these features simultaneously as an atomic operation. - * - * To enable both address filter and transmissions of automatic - * acknowledgments: - * - * NETSTACK_RADIO.set_value(RADIO_PARAM_RX_MODE, - * RADIO_RX_MODE_ADDRESS_FILTER | RADIO_RX_MODE_AUTOACK); - */ -#define RADIO_RX_MODE_ADDRESS_FILTER (1 << 0) -#define RADIO_RX_MODE_AUTOACK (1 << 1) - -/** - * The radio transmission mode controls whether transmissions should - * be done using clear channel assessment (if supported by the - * radio). If send-on-CCA is enabled, the radio's send function will - * wait for a radio-specific time window for the channel to become - * clear. If this does not happen, the send function will return - * RADIO_TX_COLLISION. - */ -#define RADIO_TX_MODE_SEND_ON_CCA (1 << 0) - -/* Radio return values when setting or getting radio parameters. */ -typedef enum { - RADIO_RESULT_OK, - RADIO_RESULT_NOT_SUPPORTED, - RADIO_RESULT_INVALID_VALUE, - RADIO_RESULT_ERROR -} radio_result_t; - -/* Radio return values for transmissions. */ -enum { - RADIO_TX_OK, - RADIO_TX_ERR, - RADIO_TX_COLLISION, - RADIO_TX_NOACK, -}; - -/** - * The structure of a device driver for a radio in Contiki. - */ -struct radio_driver { - - int (* init)(void); - - /** Prepare the radio with a packet to be sent. */ - int (* prepare)(const void *payload, unsigned short payload_len); - - /** Send the packet that has previously been prepared. */ - int (* transmit)(unsigned short transmit_len); - - /** Prepare & transmit a packet. */ - int (* send)(const void *payload, unsigned short payload_len); - - /** Read a received packet into a buffer. */ - int (* read)(void *buf, unsigned short buf_len); - - /** Perform a Clear-Channel Assessment (CCA) to find out if there is - a packet in the air or not. */ - int (* channel_clear)(void); - - /** Check if the radio driver is currently receiving a packet */ - int (* receiving_packet)(void); - - /** Check if the radio driver has just received a packet */ - int (* pending_packet)(void); - - /** Turn the radio on. */ - int (* on)(void); - - /** Turn the radio off. */ - int (* off)(void); - - /** Get a radio parameter value. */ - radio_result_t (* get_value)(radio_param_t param, radio_value_t *value); - - /** Set a radio parameter value. */ - radio_result_t (* set_value)(radio_param_t param, radio_value_t value); - - /** - * Get a radio parameter object. The argument 'dest' must point to a - * memory area of at least 'size' bytes, and this memory area will - * contain the parameter object if the function succeeds. - */ - radio_result_t (* get_object)(radio_param_t param, void *dest, size_t size); - - /** - * Set a radio parameter object. The memory area referred to by the - * argument 'src' will not be accessed after the function returns. - */ - radio_result_t (* set_object)(radio_param_t param, const void *src, - size_t size); - -}; - -#endif /* RADIO_H_ */ - -/** @} */ -/** @} */
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1-config.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1-config.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2012, STMicroelectronics. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions 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 the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE 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. - * - * This file is part of the Contiki operating system. - * - */ -/*---------------------------------------------------------------------------*/ -#ifndef __SPIRIT1_CONFIG_H__ -#define __SPIRIT1_CONFIG_H__ -/*---------------------------------------------------------------------------*/ -#include "radio.h" -#include "SPIRIT_Config.h" -#include "spirit1-const.h" -/*---------------------------------------------------------------------------*/ -#define CCA_THRESHOLD -98.0 /* dBm */ -#define XTAL_FREQUENCY 50000000 /* Hz */ -#define SPIRIT_MAX_FIFO_LEN (96) // betzw - WAS: 600 -/*---------------------------------------------------------------------------*/ - -/* Sometimes Spirit1 seems to NOT deliver (correctly) the 'IRQ_RX_DATA_READY' - * event for packets which have a length which is close to a multiple of - * RX FIFO size. Furthermore, in these cases also the content delivery seems - * to be compromised as well as the generation of RX/TX FIFO errors. - * This can be avoided by reducing the maximum packet length to a value which - * is lower than the RX FIFO size. - * - * Enable beyond macro if you want to use the version of the driver which avoids - * FIFO overflows by reducing packet length. - * - * NOTE: the non delivery of event 'IRQ_RX_DATA_READY' MUST still be - * investigated further deeply (both on HW & SW level)! - */ -#define RX_FIFO_THR_WA - -/** - * The MAX_PACKET_LEN is an arbitrary value used to define the two array - * spirit_txbuf and spirit_rxbuf. - * The SPIRIT1 supports with its packet handler a length of 65,535 bytes, - * and in direct mode (without packet handler) there is no limit of data. - */ -#ifdef RX_FIFO_THR_WA -#define MAX_PACKET_LEN (SPIRIT_MAX_FIFO_LEN-1) -#else -#define MAX_PACKET_LEN (255) // betzw - WAS: SPIRIT_MAX_FIFO_LEN, but LEN_WIDTH is set to 7 so the variable payload length is theoretically from 0 to 255 bytes -#endif - -/*---------------------------------------------------------------------------*/ -/** - * Spirit1 IC version - */ -#define SPIRIT1_VERSION SPIRIT_VERSION_3_0 -/*---------------------------------------------------------------------------*/ -#endif /* __SPIRIT1_CONFIG_H__ */ -/*---------------------------------------------------------------------------*/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1-const.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1-const.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2012, STMicroelectronics. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions 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 the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER 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. - * - */ -/*---------------------------------------------------------------------------*/ -#ifndef __SPIRIT1_CONST_H__ -#define __SPIRIT1_CONST_H__ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ - -/* The state bitfield and values for different states, as read from MC_STATE[1:0] registers, -which are returned on any SPI read or write operation. */ -#define SPIRIT1_STATE_STATEBITS (0x00FE) -/*---------------------------------------------------------------------------*/ - -#define SPIRIT1_STATE_STANDBY ((0x0040)<<1) -#define SPIRIT1_STATE_SLEEP ((0x0036)<<1) -#define SPIRIT1_STATE_READY ((0x0003)<<1) -#define SPIRIT1_STATE_LOCK ((0x000F)<<1) -#define SPIRIT1_STATE_RX ((0x0033)<<1) -#define SPIRIT1_STATE_TX ((0x005F)<<1) -/* NB the below states were extracted from ST drivers, but are not specified in the datasheet */ -#define SPIRIT1_STATE_PM_SETUP ((0x003D)<<1) -#define SPIRIT1_STATE_XO_SETTLING ((0x0023)<<1) -#define SPIRIT1_STATE_SYNTH_SETUP ((0x0053)<<1) -#define SPIRIT1_STATE_PROTOCOL ((0x001F)<<1) -#define SPIRIT1_STATE_SYNTH_CALIBRATION ((0x004F)<<1) -/*---------------------------------------------------------------------------*/ -/* strobe commands */ -#define SPIRIT1_STROBE_TX 0x60 -#define SPIRIT1_STROBE_RX 0x61 -#define SPIRIT1_STROBE_READY 0x62 -#define SPIRIT1_STROBE_STANDBY 0x63 -#define SPIRIT1_STROBE_SLEEP 0x64 -#define SPIRIT1_STROBE_SABORT 0x67 -#define SPIRIT1_STROBE_SRES 0x70 -#define SPIRIT1_STROBE_FRX 0x71 -#define SPIRIT1_STROBE_FTX 0x72 -/*---------------------------------------------------------------------------*/ - - - -/* Exported types ------------------------------------------------------------*/ -/*------------------------------------------------------------------*/ - - -#endif /* __SPIRIT1_CONST_H__ */ -/*---------------------------------------------------------------------------*/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/spirit1.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2012, STMicroelectronics. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions 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 the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE 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. - * - * This file is part of the Contiki operating system. - * - */ -/*---------------------------------------------------------------------------*/ -#ifndef __SPIRIT_H__ -#define __SPIRIT_H__ -/*---------------------------------------------------------------------------*/ -#include "radio.h" -#include "SPIRIT_Config.h" -#include "spirit1-config.h" -//#include "spirit1_appli.h" -#include "spirit1-const.h" -/*---------------------------------------------------------------------------*/ -extern const struct radio_driver spirit_radio_driver; -void spirit1_interrupt_callback(void); - -/* exported from spirit1appli.h */ - -#include "radio_shield_config.h" -#include "MCU_Interface.h" -#include "SPIRIT_Config.h" -// betzw - WAS: #include "SPIRIT1_Util.h" - - -#if defined(X_NUCLEO_IDS01A3) - #define USE_SPIRIT1_433MHz -#elif defined(X_NUCLEO_IDS01A4) - #define USE_SPIRIT1_868MHz -#elif defined(X_NUCLEO_IDS01A5) - #define USE_SPIRIT1_915MHz -#else -#error SPIRIT1 Nucleo Shield undefined or unsupported -#endif - -/* Uncomment the Link Layer features to be used */ -// #define USE_AUTO_ACK -// #define USE_AUTO_ACK_PIGGYBACKING -// #define USE_AUTO_RETRANSMISSION - -#if defined(USE_AUTO_ACK)&& defined(USE_AUTO_ACK_PIGGYBACKING)&& defined(USE_AUTO_RETRANSMISSION) -#define USE_STack_PROTOCOL - -/* LLP configuration parameters */ -#define EN_AUTOACK S_ENABLE -#define EN_PIGGYBACKING S_ENABLE -#define MAX_RETRANSMISSIONS PKT_N_RETX_2 - -#else -#define USE_BASIC_PROTOCOL - -#endif - -/* Uncomment the system Operating mode */ -//#define USE_LOW_POWER_MODE - -#if defined (USE_LOW_POWER_MODE) -#define LPM_ENABLE -#define MCU_STOP_MODE -//#define MCU_SLEEP_MODE -//#define RF_STANDBY -#endif - - -/* Exported constants --------------------------------------------------------*/ - -/* Radio configuration parameters */ -/* General Remarks: - * Two SPSGRF modules will only communicate when both are having same frequency , same channel number, - * same modulation scheme, same data rate, etc. - * For example, the SPSGRF-915 module supports frequencies 902 to 928 MHz. User can select any frequency - * between this band. - */ -#define XTAL_OFFSET_PPM 0 -#define INFINITE_TIMEOUT 0.0 - -#ifdef USE_SPIRIT1_433MHz -#define BASE_FREQUENCY 433.0e6 -#endif - -#ifdef USE_SPIRIT1_868MHz -#define BASE_FREQUENCY 868.0e6 -#endif - -#ifdef USE_SPIRIT1_915MHz -#define BASE_FREQUENCY 915.0e6 -#endif - - -/* Addresses configuration parameters */ -#define EN_FILT_MY_ADDRESS S_DISABLE -#define MY_ADDRESS 0x24 -#define EN_FILT_MULTICAST_ADDRESS S_DISABLE -#define MULTICAST_ADDRESS 0xEE -#define EN_FILT_BROADCAST_ADDRESS S_DISABLE -#define BROADCAST_ADDRESS 0xFF -#define DESTINATION_ADDRESS 0x44 -#define EN_FILT_SOURCE_ADDRESS S_DISABLE -#define SOURCE_ADDR_MASK 0xf0 -#define SOURCE_ADDR_REF 0x37 - -#define APPLI_CMD 0x11 -#define NWK_CMD 0x22 -#define LED_TOGGLE 0xff -#define ACK_OK 0x01 -#define MAX_BUFFER_LEN 96 -#define TIME_TO_EXIT_RX 3000 -#define DELAY_RX_LED_TOGGLE 200 -#define DELAY_TX_LED_GLOW 1000 -#define LPM_WAKEUP_TIME 100 -#define DATA_SEND_TIME 30 - -#define PREAMBLE_LENGTH PKT_PREAMBLE_LENGTH_04BYTES -#define SYNC_LENGTH PKT_SYNC_LENGTH_4BYTES -#define CONTROL_LENGTH PKT_CONTROL_LENGTH_0BYTES -#define EN_ADDRESS S_DISABLE -#define EN_FEC S_DISABLE -#define CHANNEL_NUMBER 1 // betzw - WAS: 0 -#define LENGTH_TYPE PKT_LENGTH_VAR -#define POWER_INDEX 7 -#define RECEIVE_TIMEOUT 2000.0 /*change the value for required timeout period*/ -#define RSSI_THRESHOLD -120 - - - -#define POWER_DBM 11.6 -#define CHANNEL_SPACE 100e3 -#define FREQ_DEVIATION 127e3 -#define BANDWIDTH 540.0e3 -#define MODULATION_SELECT GFSK_BT1 -#define DATARATE 250000 -#define XTAL_OFFSET_PPM 0 -#define SYNC_WORD 0x88888888 -#define LENGTH_WIDTH 8 // betzw - NOTE: only 255 bytes for payload!!! -#define CRC_MODE PKT_CRC_MODE_16BITS_2 -#define EN_WHITENING S_DISABLE -#define INFINITE_TIMEOUT 0.0 - -// extern volatile FlagStatus xRxDoneFlag, xTxDoneFlag; -// extern volatile FlagStatus PushButtonStatusWakeup; -extern uint16_t wakeupCounter; -extern uint16_t dataSendCounter ; -// extern volatile FlagStatus PushButtonStatusData, datasendFlag; - -typedef struct -{ - uint8_t Cmdtag; - uint8_t CmdType; - uint8_t CmdLen; - uint8_t Cmd; - uint8_t DataLen; - uint8_t* DataBuff; -}AppliFrame_t; - -/*---------------------------------------------------------------------------*/ -#endif /* __SPIRIT_H__ */ -/*---------------------------------------------------------------------------*/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/stm32l-spirit1-config.h --- a/stm-spirit1-rf-driver/source/libs/Contiki_STM32_Library/stm32l-spirit1-config.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/** - ****************************************************************************** - * @file stm32l-spirit1-config.h - * @author MCD Application Team - * @version V3.4.0 - * @date 29-June-2012 - * @brief Evaluation board specific configuration file. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> - * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32L_SPIRIT1_CONFIG_H -#define __STM32L_SPIRIT1_CONFIG_H - -/* Includes ------------------------------------------------------------------*/ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* Define the STM32F10x hardware depending on the used evaluation board */ -#ifdef USE_STM3210B_EVAL - #define USB_DISCONNECT GPIOD - #define USB_DISCONNECT_PIN GPIO_PIN_9 - #define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOD - #define EVAL_COM1_IRQHandler USART1_IRQHandler - -#elif defined (USE_STM3210E_EVAL) - #define USB_DISCONNECT GPIOB - #define USB_DISCONNECT_PIN GPIO_PIN_14 - #define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOB - #define EVAL_COM1_IRQHandler USART1_IRQHandler - -#elif defined (USE_STM3210C_EVAL) - #define USB_DISCONNECT 0 - #define USB_DISCONNECT_PIN 0 - #define RCC_APB2Periph_GPIO_DISCONNECT 0 - #define EVAL_COM1_IRQHandler USART2_IRQHandler - -#elif defined (USE_STM32L152_EVAL) || defined (USE_STM32L152D_EVAL) - /* - For STM32L15xx devices it is possible to use the internal USB pullup - controlled by register SYSCFG_PMC (refer to RM0038 reference manual for - more details). - It is also possible to use external pullup (and disable the internal pullup) - by setting the define USB_USE_EXTERNAL_PULLUP in file platform_config.h - and configuring the right pin to be used for the external pull up configuration. - To have more details on how to use an external pull up, please refer to - STM3210E-EVAL evaluation board manuals. - */ - /* Uncomment the following define to use an external pull up instead of the - integrated STM32L15xx internal pull up. In this case make sure to set up - correctly the external required hardware and the GPIO defines below.*/ -/* #define USB_USE_EXTERNAL_PULLUP */ - - #if !defined(USB_USE_EXTERNAL_PULLUP) - #define STM32L15_USB_CONNECT SYSCFG_USBPuCmd(ENABLE) - #define STM32L15_USB_DISCONNECT SYSCFG_USBPuCmd(DISABLE) - - #elif defined(USB_USE_EXTERNAL_PULLUP) - /* PA0 is chosen just as illustrating example, you should modify the defines - below according to your hardware configuration. */ - #define USB_DISCONNECT GPIOA - #define USB_DISCONNECT_PIN GPIO_PIN_0 - #define RCC_AHBPeriph_GPIO_DISCONNECT RCC_AHBPeriph_GPIOA - #define STM32L15_USB_CONNECT GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) - #define STM32L15_USB_DISCONNECT GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN) - #endif /* USB_USE_EXTERNAL_PULLUP */ - -#ifdef USE_STM32L152_EVAL - #define EVAL_COM1_IRQHandler USART2_IRQHandler -#elif defined (USE_STM32L152D_EVAL) - #define EVAL_COM1_IRQHandler USART1_IRQHandler -#endif /*USE_STM32L152_EVAL*/ - -#endif /* USE_STM3210B_EVAL */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __STM32L_SPIRIT1_CONFIG_H */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/Release_Notes.html --- a/stm-spirit1-rf-driver/source/libs/spirit1/Release_Notes.html Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head> - -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> -<link rel="File-List" href="Library_files/filelist.xml"> -<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for SPIRIT1 Driver</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> - - - -<style> -<!-- -/* Style Definitions */ -p.MsoNormal, li.MsoNormal, div.MsoNormal -{mso-style-parent:""; -margin:0in; -margin-bottom:.0001pt; -mso-pagination:widow-orphan; -font-size:12.0pt; -font-family:"Times New Roman"; -mso-fareast-font-family:"Times New Roman";} -h2 -{mso-style-next:Normal; -margin-top:12.0pt; -margin-right:0in; -margin-bottom:3.0pt; -margin-left:0in; -mso-pagination:widow-orphan; -page-break-after:avoid; -mso-outline-level:2; -font-size:14.0pt; -font-family:Arial; -font-weight:bold; -font-style:italic;} -a:link, span.MsoHyperlink -{color:blue; -text-decoration:underline; -text-underline:single;} -a:visited, span.MsoHyperlinkFollowed -{color:blue; -text-decoration:underline; -text-underline:single;} -p -{mso-margin-top-alt:auto; -margin-right:0in; -mso-margin-bottom-alt:auto; -margin-left:0in; -mso-pagination:widow-orphan; -font-size:12.0pt; -font-family:"Times New Roman"; -mso-fareast-font-family:"Times New Roman";} -@page Section1 -{size:8.5in 11.0in; -margin:1.0in 1.25in 1.0in 1.25in; -mso-header-margin:.5in; -mso-footer-margin:.5in; -mso-paper-source:0;} -div.Section1 -{page:Section1;} ---> -</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> -<meta content="MCD Application Team" name="author"></head><body link="blue" vlink="blue"> -<div class="Section1"> -<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br> -</o:p></span></p> -<div align="center"> -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> -<tbody> -<tr> -<td style="padding: 0cm;" valign="top"> -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900"> -<tbody> -<tr> -<td style="vertical-align: top;"> -<p class="MsoNormal"><span style="font-size: 8pt; font-family: Arial; color: blue;"><a href="../../../../Release_Notes.html">Back to Release page</a><o:p></o:p></span></p> -</td> -</tr> -<tr style=""> -<td style="padding: 1.5pt;"> -<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release -Notes for SPIRIT1 Driver</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1> -<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright -2014 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p> -<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../../../_htmresc/st_logo.png" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> -<p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p> </o:p></span></p> -<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900"> -<tbody> -<tr style=""> -<td style="padding: 0cm;" valign="top"> -<span style="font-family: "Times New Roman";"> -</span> -<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a name="History"></a><span style="font-size: 12pt; color: white;">Update History</span></h2> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-right: 500pt; width: 200px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V3.0.1 -/ 10-Oct-2014</span></h3> -<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main -Changes<o:p></o:p></span></u></b></p> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<span style="font-size: 10pt; font-family: Verdana;"></span> -<ul style="list-style-type: square;"> -<li><span style="font-size: 10pt; font-family: Verdana;">First -official release.</span><span style="color: rgb(0, 0, 0); font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; display: inline ! important; float: none;"></span><span style="font-size: 10pt; font-family: Verdana;"></span><span style="font-size: 10pt; font-family: Verdana;"></span></li> -</ul> -<span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic; font-weight: bold;"></span></span><span style="font-size: 10pt; font-family: Verdana;"></span> -<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><a name="License"></a><span style="font-size: 12pt; color: white;">License<o:p></o:p></span><br> -</h2> - - -<font size="-1"><span style="font-family: "Verdana","sans-serif";">Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"). You may not use this file except in compliance with the License. You may obtain a copy of the License at:</span><br><br> - - -<font size="-1"><span style="font-family: "Verdana","sans-serif";"><center> -<a href=http://www.st.com/software_license_agreement_liberty_v2> http://www.st.com/software_license_agreement_liberty_v2</a></center></span><br><br> - -<font size="-1"><span style="font-family: "Verdana","sans-serif";">Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -</a></span> - -</font> - - -<p class="MsoNormal"><span style="font-size: 10pt; font-family: "Verdana","sans-serif"; color: black;"><o:p></o:p></span></p> -<b><span style="font-size: 10pt; font-family: Verdana; color: black;"></span></b> -<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;"> -<hr align="center" size="2" width="100%"></span></div> -<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana; color: black;">For -complete documentation on</span><span style="font-size: 10pt; font-family: Verdana;"><span style="color: black;"> SPIRIT1 Driver -visit </span><u><span style="color: blue;"><a href="http://www.st.com/web/catalog/sense_power/FM1968/CL1976/SC1845/PF253167" target="_blank">www.st.com/SPIRIT1</a></span></u></span><span style="font-size: 10pt; font-family: Verdana;"><a target="_blank" href="http://www.st.com/web/catalog/sense_power/FM1968/CL1976/SC1898/PF258646"><u><span style="color: blue;"></span></u></a></span><span style="font-size: 10pt; font-family: Verdana;"><u><span style="color: blue;"></span></u></span><span style="color: black;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> -<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p> -</td> -</tr> -</tbody> -</table> -</div> -<p class="MsoNormal"><o:p> </o:p></p> -</div> -</body></html> \ No newline at end of file
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/MCU_Interface.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/MCU_Interface.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/** - * @file MCU_Interface.h - * @author VMA division - AMS - * @version V2.0.2 - * @date Febrary 7, 2015 - * @brief Header file for low level SPIRIT SPI driver. - * @details - * - * This header file constitutes an interface to the SPI driver used to - * communicate with Spirit. - * It exports some function prototypes to write/read registers and FIFOs - * and to send command strobes. - * Since the Spirit libraries are totally platform independent, the implementation - * of these functions are not provided here. The user have to implement these functions - * taking care to keep the exported prototypes. - * - * These functions are: - * - * <ul> - * <li>SpiritSpiInit</i> - * <li>SpiritSpiWriteRegisters</i> - * <li>SpiritSpiReadRegisters</i> - * <li>SpiritSpiCommandStrobes</i> - * <li>SpiritSpiWriteLinearFifo</i> - * <li>SpiritSpiReadLinearFifo</i> - * </ul> - * - * @note An example of SPI driver implementation is available in the <i>Sdk_Eval</i> library. - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - * THIS SOURCE CODE IS PROTECTED BY A LICENSE. - * FOR MORE INFORMATION PLEASE CAREFULLY READ THE LICENSE AGREEMENT FILE LOCATED - * IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE. - * - * <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> - */ - - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MCU_INTERFACE_H -#define __MCU_INTERFACE_H - - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** @defgroup SPIRIT_SPI_Driver SPI Driver - * @brief Header file for low level SPIRIT SPI driver. - * @details See the file <i>@ref MCU_Interface.h</i> for more details. - * @{ - */ - - - -/** @defgroup SPI_Exported_Types SPI Exported Types - * @{ - */ - -/** - * @} - */ - - - -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** - * @} - */ - - - -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ - -/** - * @} - */ - - - -/** @defgroup SPI_Exported_Functions SPI Exported Functions - * @{ - */ - -typedef SpiritStatus StatusBytes; - -void SdkEvalSpiInit(void); -StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode); -StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - -void SdkEvalEnterShutdown(void); -void SdkEvalExitShutdown(void); -SpiritFlagStatus SdkEvalCheckShutdown(void); - -#define SpiritEnterShutdown SdkEvalEnterShutdown -#define SpiritExitShutdown SdkEvalExitShutdown -#define SpiritCheckShutdown (SpiritFlagStatus)SdkEvalCheckShutdown - - -#define SpiritSpiInit SdkEvalSpiInit -#define SpiritSpiWriteRegisters(cRegAddress, cNbBytes, pcBuffer) SdkEvalSpiWriteRegisters(cRegAddress, cNbBytes, pcBuffer) -#define SpiritSpiReadRegisters(cRegAddress, cNbBytes, pcBuffer) SdkEvalSpiReadRegisters(cRegAddress, cNbBytes, pcBuffer) -#define SpiritSpiCommandStrobes(cCommandCode) SdkEvalSpiCommandStrobes(cCommandCode) -#define SpiritSpiWriteLinearFifo(cNbBytes, pcBuffer) SdkEvalSpiWriteFifo(cNbBytes, pcBuffer) -#define SpiritSpiReadLinearFifo(cNbBytes, pcBuffer) SdkEvalSpiReadFifo(cNbBytes, pcBuffer) - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Aes.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Aes.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,205 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Aes.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT AES Engine. - * - * @details - * - * In order to encrypt data, the user must manage the AES_END IRQ. - * The data have to be splitted in blocks of 16 bytes and written - * into the <i>AES DATA IN registers</i>. Then, after the key is written - * into the <i>AES KEY registers</i>, a command of <i>Execute encryption</i> - * has to be sent. - * - * <b>Example:</b> - * @code - * - * SpiritAesWriteDataIn(data_buff , N_BYTES); - * SpiritAesExecuteEncryption(); - * - * while(!aes_end_flag); // the flag is set by the ISR routine which manages the AES_END irq - * aes_end_flag=RESET; - * - * SpiritAesReadDataOut(enc_data_buff , N_BYTES); - * - * @endcode - * - * In order to decrypt data, the user must manage the AES_END IRQ and have a decryption key. - * There are two operative modes to make the data decryption: - * <ul> - * <li> Derive the decryption key from the encryption key and decrypt data directly - * using the <i>SpiritAesDeriveDecKeyExecuteDec()</i> function - * - * <b>Example:</b> - * @code - * - * SpiritAesWriteDataIn(enc_data_buff , N_BYTES); - * SpiritAesDeriveDecKeyExecuteDec(); - * - * while(!aes_end_flag); // the flag is set by the ISR routine which manages the AES_END irq - * aes_end_flag=RESET; - * - * SpiritAesReadDataOut(data_buff , N_BYTES); - * - * @endcode - * </li> - * - * <li> Derive the decryption key from the encryption key using the <i>SpiritAesDeriveDecKeyFromEnc()</i> - * function, store it into the <i>AES KEY registers</i> and then decrypt data using the - * <i>SpiritAesExecuteDecryption()</i> function - * - * <b>Example:</b> - * @code - * - * SpiritAesWriteDataIn(key_enc , 16); - * SpiritAesDeriveDecKeyFromEnc(); - * - * while(!aes_end_flag); // the flag is set by the ISR routine which manages the AES_END irq - * aes_end_flag=RESET; - * - * SpiritAesReadDataOut(key_dec , 16); - * - * SpiritAesWriteKey(key_dec); - * SpiritAesWriteDataIn(enc_data_buff , 16); - * SpiritAesExecuteDecryption(); - * - * while(!aes_end_flag); // the flag is set by the ISR routine which manages the AES_END irq - * aes_end_flag=RESET; - * - * SpiritAesReadDataOut(data_buff , N_BYTES); - * - * @endcode - * </li> - * </ul> - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_AES_H -#define __SPIRIT_AES_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Aes AES - * @brief Configuration and management of SPIRIT AES Engine. - * @details See the file <i>@ref SPIRIT_Aes.h</i> for more details. - * @{ - */ - -/** - * @defgroup Aes_Exported_Types AES Exported Types - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Exported_Constants AES Exported Constants - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Aes_Exported_Macros AES Exported Macros - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Aes_Exported_Functions AES Exported Functions - * @{ - */ - -void SpiritAesMode(SpiritFunctionalState xNewState); -void SpiritAesWriteDataIn(uint8_t* pcBufferDataIn, uint8_t cDataLength); -void SpiritAesReadDataOut(uint8_t* pcBufferDataOut, uint8_t cDataLength); -void SpiritAesWriteKey(uint8_t* pcKey); -void SpiritAesReadKey(uint8_t* pcKey); -void SpiritAesDeriveDecKeyFromEnc(void); -void SpiritAesExecuteEncryption(void); -void SpiritAesExecuteDecryption(void); -void SpiritAesDeriveDecKeyExecuteDec(void); - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Calibration.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Calibration.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,226 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Calibration.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT VCO-RCO calibration. - * - * @details - * - * This module allows the user to set some parameters which deal - * with the oscillators calibration. - * The state machine of Spirit contemplates some optional calibrating operations - * in the transition between the READY and the LOCK state. - * The user is allowed to enable or disable the automatic RCO/VCO calibration - * by calling the functions <i>@ref SpiritCalibrationVco()</i> and <i>@ref SpiritCalibrationRco()</i>. - * The following example shows how to do an initial calibration of VCO. - * - * <b>Example:</b> - * @code - * uint8_t calData; - * - * SpiritCalibrationVco(S_ENABLE); - * SpiritCmdStrobeLockTx(); - * - * while(g_xStatus.MC_STATE != MC_STATE_LOCK){ - * SpiritRefreshStatus(); - * } - * - * calData = SpiritCalibrationGetVcoCalDataTx(); - * SpiritCalibrationSetVcoCalDataTx(calData); - * - * SpiritCmdStrobeReady(); - * SpiritCalibrationVco(S_DISABLE); - * - * @endcode - * - * Similar operations can be done for the RCO calibrator. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_CALIBRATION_H -#define __SPIRIT_CALIBRATION_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Calibration Calibration - * @brief Configuration and management of SPIRIT VCO-RCO calibration. - * @details See the file <i>@ref SPIRIT_Calibration.h</i> for more details. - * @{ - */ - -/** - * @defgroup Calibration_Exported_Types Calibration Exported Types - * @{ - */ - - -/** - * @brief VCO / RCO calibration window. - */ -typedef enum -{ - - CALIB_TIME_7_33_US_24MHZ = 0x00, /*!< calibration window of 7.33 us with XTAL=24MHz */ - CALIB_TIME_14_67_US_24MHZ, /*!< calibration window of 14.67 us with XTAL=24MHz */ - CALIB_TIME_29_33_US_24MHZ, /*!< calibration window of 29.33 us with XTAL=24MHz */ - CALIB_TIME_58_67_US_24MHZ, /*!< calibration window of 58.67 us with XTAL=24MHz */ - - CALIB_TIME_6_77_US_26MHZ = 0x00, /*!< calibration window of 6.77 us with XTAL=26MHz */ - CALIB_TIME_13_54_US_26MHZ, /*!< calibration window of 13.54 us with XTAL=26MHz */ - CALIB_TIME_27_08_US_26MHZ, /*!< calibration window of 27.08 us with XTAL=26MHz */ - CALIB_TIME_54_15_US_26MHZ /*!< calibration window of 54.15 us with XTAL=26MHz */ - -} VcoWin; - - -#define IS_VCO_WIN(REF) (REF == CALIB_TIME_7_33_US_24MHZ ||\ - REF == CALIB_TIME_14_67_US_24MHZ ||\ - REF == CALIB_TIME_29_33_US_24MHZ ||\ - REF == CALIB_TIME_58_67_US_24MHZ ||\ - REF == CALIB_TIME_6_77_US_26MHZ ||\ - REF == CALIB_TIME_13_54_US_26MHZ ||\ - REF == CALIB_TIME_27_08_US_26MHZ ||\ - REF == CALIB_TIME_54_15_US_26MHZ \ - ) - -/** - * @brief VCO_H / VCO_L selection. - */ -typedef enum -{ - - VCO_L = 0x00, /*!< VCO lower */ - VCO_H, /*!< VCO higher */ -} VcoSel; - - -#define IS_VCO_SEL(REF) (REF == VCO_L ||\ - REF == VCO_H \ - ) - - -/** - * @} - */ - - -/** - * @defgroup Calibration_Exported_Constants Calibration Exported Constants - * @{ - */ - -/** - * @} - */ - - - -/** @defgroup VCO_Calibration VCO Calibration - * @{ - */ - -/** - * @} - */ - - - - -/** - * @defgroup Calibration_Exported_Macros Calibration Exported Macros - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Calibration_Exported_Functions Calibration Exported Functions - * @{ - */ - -void SpiritCalibrationRco(SpiritFunctionalState xNewState); -void SpiritCalibrationVco(SpiritFunctionalState xNewState); -void SpiritCalibrationSetRcoCalWords(uint8_t cRwt, uint8_t cRfb); -void SpiritCalibrationGetRcoCalWords(uint8_t* pcRwt, uint8_t* pcRfb); -uint8_t SpiritCalibrationGetVcoCalData(void); -void SpiritCalibrationSetVcoCalDataTx(uint8_t cVcoCalData); -uint8_t SpiritCalibrationGetVcoCalDataTx(void); -void SpiritCalibrationSetVcoCalDataRx(uint8_t cVcoCalData); -uint8_t SpiritCalibrationGetVcoCalDataRx(void); -void SpiritCalibrationSetVcoWindow(VcoWin xRefWord); -VcoWin SpiritCalibrationGetVcoWindow(void); -VcoSel SpiritCalibrationGetVcoSelecttion(void); -void SpiritCalibrationSelectVco(VcoSel xVco); - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Commands.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Commands.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,336 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Commands.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Management of SPIRIT Commands. - * - * @details - * - * In this module can be found all the API used to strobe commands to - * Spirit. - * Every command strobe is an SPI transaction with a specific command code. - * - * <b>Example:</b> - * @code - * ... - * - * SpiritCmdStrobeRx(); - * - * ... - * @endcode - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_COMMANDS_H -#define __SPIRIT_COMMANDS_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Commands Commands - * @brief Management of SPIRIT Commands. - * @details See the file <i>@ref SPIRIT_Commands.h</i> for more details. - * @{ - */ - -/** - * @defgroup Commands_Exported_Types Commands Exported Types - * @{ - */ - -/** - * @brief SPIRIT Commands codes enumeration - */ -typedef enum -{ - CMD_TX = COMMAND_TX, /*!< Start to transmit; valid only from READY */ - CMD_RX = COMMAND_RX, /*!< Start to receive; valid only from READY */ - CMD_READY = COMMAND_READY, /*!< Go to READY; valid only from STANDBY or SLEEP or LOCK */ - CMD_STANDBY = COMMAND_STANDBY, /*!< Go to STANDBY; valid only from READY */ - CMD_SLEEP = COMMAND_SLEEP, /*!< Go to SLEEP; valid only from READY */ - CMD_LOCKRX = COMMAND_LOCKRX, /*!< Go to LOCK state by using the RX configuration of the synth; valid only from READY */ - CMD_LOCKTX = COMMAND_LOCKTX, /*!< Go to LOCK state by using the TX configuration of the synth; valid only from READY */ - CMD_SABORT = COMMAND_SABORT, /*!< Force exit form TX or RX states and go to READY state; valid only from TX or RX */ - CMD_LDC_RELOAD = COMMAND_LDC_RELOAD, /*!< LDC Mode: Reload the LDC timer with the value stored in the LDC_PRESCALER / COUNTER registers; valid from all states */ - CMD_SEQUENCE_UPDATE = COMMAND_SEQUENCE_UPDATE, /*!< Autoretransmission: Reload the Packet sequence counter with the value stored in the PROTOCOL[2] register valid from all states */ - CMD_AES_ENC = COMMAND_AES_ENC, /*!< Commands: Start the encryption routine; valid from all states; valid from all states */ - CMD_AES_KEY = COMMAND_AES_KEY, /*!< Commands: Start the procedure to compute the key for the decryption; valid from all states */ - CMD_AES_DEC = COMMAND_AES_DEC, /*!< Commands: Start the decryption routine using the current key; valid from all states */ - CMD_AES_KEY_DEC = COMMAND_AES_KEY_DEC, /*!< Commands: Compute the key and start the decryption; valid from all states */ - CMD_SRES = COMMAND_SRES, /*!< Reset of all digital part, except SPI registers */ - CMD_FLUSHRXFIFO = COMMAND_FLUSHRXFIFO, /*!< Clean the RX FIFO; valid from all states */ - CMD_FLUSHTXFIFO = COMMAND_FLUSHTXFIFO, /*!< Clean the TX FIFO; valid from all states */ -} SpiritCmd; - -#define IS_SPIRIT_CMD(CMD) (CMD == CMD_TX || \ - CMD == CMD_RX || \ - CMD == CMD_READY || \ - CMD == CMD_STANDBY || \ - CMD == CMD_SLEEP || \ - CMD == CMD_LOCKRX || \ - CMD == CMD_LOCKTX || \ - CMD == CMD_SABORT || \ - CMD == CMD_LDC_RELOAD || \ - CMD == CMD_SEQUENCE_UPDATE || \ - CMD == CMD_AES_ENC || \ - CMD == CMD_AES_KEY || \ - CMD == CMD_AES_DEC || \ - CMD == CMD_AES_KEY_DEC || \ - CMD == CMD_SRES || \ - CMD == CMD_FLUSHRXFIFO || \ - CMD == CMD_FLUSHTXFIFO \ - ) - -/** - * @} - */ - - -/** - * @defgroup Commands_Exported_Constants Commands Exported Constants - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Commands_Exported_Macros Commands Exported Macros - * @{ - */ - -/** - * @brief Sends the TX command to SPIRIT. Start to transmit. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeTx() {SpiritManagementWaCmdStrobeTx(); \ - SpiritCmdStrobeCommand(CMD_TX);} - - -/** - * @brief Sends the RX command to SPIRIT. Start to receive. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeRx() {SpiritManagementWaCmdStrobeRx(); \ - SpiritCmdStrobeCommand(CMD_RX); \ - } - - -/** - * @brief Sends the Ready state command to SPIRIT. Go to READY. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeReady() SpiritCmdStrobeCommand(CMD_READY) - - - -/** - * @brief Sends the Standby command to SPIRIT. Go to STANDBY. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeStandby() SpiritCmdStrobeCommand(CMD_STANDBY) - - - -/** - * @brief Sends the Sleep command to SPIRIT. Go to SLEEP. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeSleep() SpiritCmdStrobeCommand(CMD_SLEEP) - - - -/** - * @brief Sends the LOCK_RX command to SPIRIT. Go to the LOCK state by using the RX configuration of the synthesizer. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeLockRx() SpiritCmdStrobeCommand(CMD_LOCKRX) - - - -/** - * @brief Sends the LOCK_TX command to SPIRIT. Go to the LOCK state by using the TX configuration of the synthesizer. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeLockTx() SpiritCmdStrobeCommand(CMD_LOCKTX) - - - -/** - * @brief Sends the SABORT command to SPIRIT. Exit from TX or RX states and go to READY state. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeSabort() SpiritCmdStrobeCommand(CMD_SABORT) - - -/** - * @brief Sends the LDC_RELOAD command to SPIRIT. Reload the LDC timer with the value stored in the LDC_PRESCALER / COUNTER registers. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeLdcReload() SpiritCmdStrobeCommand(CMD_LDC_RELOAD) - - - -/** - * @brief Sends the SEQUENCE_UPDATE command to SPIRIT. Reload the Packet sequence counter with the value stored in the PROTOCOL[2] register. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeSequenceUpdate() SpiritCmdStrobeCommand(CMD_SEQUENCE_UPDATE) - - - -/** - * @brief Sends the AES_ENC command to SPIRIT. Starts the encryption routine. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeAesEnc() SpiritCmdStrobeCommand(CMD_AES_ENC) - - - -/** - * @brief Sends the AES_KEY command to SPIRIT. Starts the procedure to compute the key for the decryption. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeAesKey() SpiritCmdStrobeCommand(CMD_AES_KEY) - - - -/** - * @brief Sends the AES_DEC command to SPIRIT. Starts the decryption using the current key. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeAesDec() SpiritCmdStrobeCommand(CMD_AES_DEC) - - - -/** - * @brief Sends the KEY_DEC command to SPIRIT. Computes the key derivation and start the decryption. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeAesKeyDec() SpiritCmdStrobeCommand(CMD_AES_KEY_DEC) - -/** - * @brief Sends the SRES command to SPIRIT. Partial reset: all digital circuit will be reset (exception for SPI only). - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeSres() SpiritCmdStrobeCommand(CMD_SRES) - - -/** - * @brief Sends the FLUSHRXFIFO command to SPIRIT. Clean the RX FIFO. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeFlushRxFifo() SpiritCmdStrobeCommand(CMD_FLUSHRXFIFO) - - - -/** - * @brief Sends the FLUSHTXFIFO command to SPIRIT. Clean the TX FIFO. - * @param None. - * @retval None. - */ -#define SpiritCmdStrobeFlushTxFifo() SpiritCmdStrobeCommand(CMD_FLUSHTXFIFO) - - - -/** - * @} - */ - - -/** - * @defgroup Commands_Exported_Functions Commands Exported Functions - * @{ - */ -void SpiritCmdStrobeCommand(SpiritCmd xCommandCode); - - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Config.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Config.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Config.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Spirit Configuration and useful defines - * - * @details - * - * This file is used to include all or a part of the Spirit - * libraries into the application program which will be used. - * Moreover some important parameters are defined here and the - * user is allowed to edit them. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_CONFIG_H -#define __SPIRIT_CONFIG_H - - - /* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Regs.h" -#include "SPIRIT_Aes.h" -#include "SPIRIT_Calibration.h" -#include "SPIRIT_Commands.h" -#include "SPIRIT_Csma.h" -#include "SPIRIT_DirectRF.h" -#include "SPIRIT_General.h" -#include "SPIRIT_Gpio.h" -#include "SPIRIT_Irq.h" -#include "SPIRIT_Timer.h" -#include "SPIRIT_LinearFifo.h" -#include "SPIRIT_PktBasic.h" -#include "SPIRIT_PktMbus.h" -#include "SPIRIT_PktStack.h" - -#include "SPIRIT_Qi.h" -#include "SPIRIT_Radio.h" -#include "MCU_Interface.h" -#include "SPIRIT_Types.h" -#include "SPIRIT_Management.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** @addtogroup SPIRIT_Libraries SPIRIT Libraries - * @brief This firmware implements libraries which allow the user - * to manage the features of Spirit without knowing the hardware details. - * @details The <i>SPIRIT_Libraries</i> modules are totally platform independent. The library provides one - * module for each device feature. Each module refers to some functions whose prototypes are located in the - * header file <i>@ref MCU_Interface.h</i>. The user who want to use these libraries on a particular - * platform has to implement these functions respecting them signatures. - * @{ - */ - -/** @defgroup SPIRIT_Configuration Configuration - * @brief Spirit Configuration and useful defines. - * @details See the file <i>@ref SPIRIT_Config.h</i> for more details. - * @{ - */ - - -/** @defgroup Configuration_Exported_Types Configuration Exported Types - * @{ - */ - -/** - * @} - */ - - -/** @defgroup Configuration_Exported_Constants Configuration Exported Constants - * @{ - */ -#define DOUBLE_XTAL_THR 30000000 - -/** - * @} - */ - - -/** @defgroup Configuration_Exported_Macros Configuration Exported Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup Configuration_Exported_Functions Configuration Exported Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Csma.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Csma.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Csma.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT CSMA. - * @details - * - * The Spirit CSMA feature, when configured and enabled, is transparent - * for the user. It means the user has only to call the <i>@ref SpiritCsmaInit()</i> - * function on a filled structure and then enable the CSMA policy using the <i>@ref SpiritCsma()</i> - * function. - * - * <b>Example:</b> - * @code - * - * CsmaInit csmaInit={ - * S_DISABLE, // persistent mode - * TBIT_TIME_64, // Tbit time - * TCCA_TIME_3, // Tcca time - * 5, // max number of backoffs - * 0xFA21, // BU counter seed - * 32 // CU prescaler - * }; - * - * ... - * - * SpiritCsmaInit(&csmaInit); - * SpiritCsma(S_ENABLE); - * - * - * @endcode - * - * @note The CS status depends of the RSSI threshold set. Please see the Spirit_Qi - * module for details. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_CSMA_H -#define __SPIRIT_CSMA_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Types.h" -#include "SPIRIT_Regs.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Csma CSMA - * @brief Configuration and management of SPIRIT CSMA. - * @details See the file <i>@ref SPIRIT_Csma.h</i> for more details. - * @{ - */ - -/** - * @defgroup Csma_Exported_Types CSMA Exported Types - * @{ - */ - - -/** - * @brief Multiplier for Tcca time enumeration (Tcca = Multiplier*Tbit). - */ -typedef enum -{ - TBIT_TIME_64 = CSMA_CCA_PERIOD_64TBIT, /*!< CSMA/CA: Sets CCA period to 64*TBIT */ - TBIT_TIME_128 = CSMA_CCA_PERIOD_128TBIT, /*!< CSMA/CA: Sets CCA period to 128*TBIT */ - TBIT_TIME_256 = CSMA_CCA_PERIOD_256TBIT, /*!< CSMA/CA: Sets CCA period to 256*TBIT */ - TBIT_TIME_512 = CSMA_CCA_PERIOD_512TBIT, /*!< CSMA/CA: Sets CCA period to 512*TBIT */ -}CcaPeriod; - -#define IS_CCA_PERIOD(PERIOD) (PERIOD == TBIT_TIME_64 || \ - PERIOD == TBIT_TIME_128 || \ - PERIOD == TBIT_TIME_256 || \ - PERIOD == TBIT_TIME_512) - - -/** - * @brief Multiplier of Tcca time enumeration to obtain Tlisten (Tlisten = [1...15]*Tcca). - */ -typedef enum -{ - TCCA_TIME_0 = 0x00, /*!< CSMA/CA: Sets CCA length to 0 */ - TCCA_TIME_1 = 0x10, /*!< CSMA/CA: Sets CCA length to 1*TLISTEN */ - TCCA_TIME_2 = 0x20, /*!< CSMA/CA: Sets CCA length to 2*TLISTEN */ - TCCA_TIME_3 = 0x30, /*!< CSMA/CA: Sets CCA length to 3*TLISTEN */ - TCCA_TIME_4 = 0x40, /*!< CSMA/CA: Sets CCA length to 4*TLISTEN */ - TCCA_TIME_5 = 0x50, /*!< CSMA/CA: Sets CCA length to 5*TLISTEN */ - TCCA_TIME_6 = 0x60, /*!< CSMA/CA: Sets CCA length to 6*TLISTEN */ - TCCA_TIME_7 = 0x70, /*!< CSMA/CA: Sets CCA length to 7*TLISTEN */ - TCCA_TIME_8 = 0x80, /*!< CSMA/CA: Sets CCA length to 8*TLISTEN */ - TCCA_TIME_9 = 0x90, /*!< CSMA/CA: Sets CCA length to 9*TLISTEN */ - TCCA_TIME_10 = 0xA0, /*!< CSMA/CA: Sets CCA length to 10*TLISTEN */ - TCCA_TIME_11 = 0xB0, /*!< CSMA/CA: Sets CCA length to 11*TLISTEN */ - TCCA_TIME_12 = 0xC0, /*!< CSMA/CA: Sets CCA length to 12*TLISTEN */ - TCCA_TIME_13 = 0xD0, /*!< CSMA/CA: Sets CCA length to 13*TLISTEN */ - TCCA_TIME_14 = 0xE0, /*!< CSMA/CA: Sets CCA length to 14*TLISTEN */ - TCCA_TIME_15 = 0xF0, /*!< CSMA/CA: Sets CCA length to 15*TLISTEN */ -}CsmaLength; - -#define IS_CSMA_LENGTH(LENGTH) (LENGTH == TCCA_TIME_0 || \ - LENGTH == TCCA_TIME_1 || \ - LENGTH == TCCA_TIME_2 || \ - LENGTH == TCCA_TIME_3 || \ - LENGTH == TCCA_TIME_4 || \ - LENGTH == TCCA_TIME_5 || \ - LENGTH == TCCA_TIME_6 || \ - LENGTH == TCCA_TIME_7 || \ - LENGTH == TCCA_TIME_8 || \ - LENGTH == TCCA_TIME_9 || \ - LENGTH == TCCA_TIME_10 || \ - LENGTH == TCCA_TIME_11 || \ - LENGTH == TCCA_TIME_12 || \ - LENGTH == TCCA_TIME_13 || \ - LENGTH == TCCA_TIME_14 || \ - LENGTH == TCCA_TIME_15) - - -/** - * @brief SPIRIT CSMA Init structure definition - */ -typedef struct -{ - SpiritFunctionalState xCsmaPersistentMode; /*!< Specifies if the CSMA persistent mode has to be on or off. - This parameter can be S_ENABLE or S_DISABLE */ - CcaPeriod xMultiplierTbit; /*!< Specifies the Tbit multiplier to obtain the Tcca. - This parameter can be a value of @ref CcaPeriod */ - CsmaLength xCcaLength; /*!< Specifies the Tcca multiplier to determinate the Tlisten. - This parameter can be a value of @ref CsmaLength. */ - uint8_t cMaxNb; /*!< Specifies the max number of backoff cycles. Not used in persistent mode. - This parameter is an uint8_t. */ - uint16_t nBuCounterSeed; /*!< Specifies the BU counter seed. Not used in persistent mode. - This parameter can be a value of 16 bits. */ - uint8_t cBuPrescaler; /*!< Specifies the BU prescaler. Not used in persistent mode. - This parameter can be a value of 6 bits. */ -}CsmaInit; - - -/** - *@} - */ - - -/** - * @defgroup Csma_Exported_Constants CSMA Exported Constants - * @{ - */ - -/** - * @defgroup Csma_Parameters CSMA Parameters - * @{ - */ - -#define IS_BU_COUNTER_SEED(SEED) (SEED!=0) -#define IS_BU_PRESCALER(PRESCALER) (PRESCALER<64) -#define IS_CMAX_NB(NB) (NB<8) - -/** - *@} - */ - -/** - *@} - */ - - -/** - * @defgroup Csma_Exported_Macros CSMA Exported Macros - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup Csma_Exported_Functions CSMA Exported Functions - * @{ - */ - -void SpiritCsmaInit(CsmaInit* pxCsmaInit); -void SpiritCsmaGetInfo(CsmaInit* pxCsmaInit); -void SpiritCsma(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritCsmaGetCsma(void); -void SpiritCsmaPersistentMode(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritCsmaGetPersistentMode(void); -void SpiritCsmaSeedReloadMode(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritCsmaGetSeedReloadMode(void); -void SpiritCsmaSetBuCounterSeed(uint16_t nBuCounterSeed); -uint16_t SpiritCsmaGetBuCounterSeed(void); -void SpiritCsmaSetBuPrescaler(uint8_t cBuPrescaler); -uint8_t SpiritCsmaGetBuPrescaler(void); -void SpiritCsmaSetCcaPeriod(CcaPeriod xMultiplierTbit); -CcaPeriod SpiritCsmaGetCcaPeriod(void); -void SpiritCsmaSetCcaLength(CsmaLength xCcaLength); -uint8_t SpiritCsmaGetCcaLength(void); -void SpiritCsmaSetMaxNumberBackoff(uint8_t cMaxNb); -uint8_t SpiritCsmaGetMaxNumberBackoff(void); - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_DirectRF.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_DirectRF.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_DirectRF.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT direct transmission / receive modes. - * @details - * - * This module contains functions to manage the direct Tx/Rx mode. - * The user can choose the way to send data to Spirit through the - * enumerative types <i>@ref DirectTx</i>/<i>@ref DirectRx</i>. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT1_DIRECT_RF_H -#define __SPIRIT1_DIRECT_RF_H - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_DirectRf Direct RF - * @brief Configuration and management of SPIRIT direct transmission / receive modes. - * @details See the file <i>@ref SPIRIT_DirectRF.h</i> for more details. - * @{ - */ - -/** - * @defgroup DirectRf_Exported_Types Direct RF Exported Types - * @{ - */ - -/** - * @brief Direct transmission mode enumeration for SPIRIT. - */ -typedef enum -{ - NORMAL_TX_MODE = 0x00, /*!< Normal mode, no direct transmission is used */ - DIRECT_TX_FIFO_MODE = 0x04, /*!< Source is FIFO: payload bits are continuously read from the TX FIFO */ - DIRECT_TX_GPIO_MODE = 0x08, /*!< Source is GPIO: payload bits are continuously read from one of the GPIO ports and transmitted without any processing */ - PN9_TX_MODE = 0x0C /*!< A pseudorandom binary sequence is generated internally */ -}DirectTx; - -#define IS_DIRECT_TX(MODE) (((MODE) == NORMAL_TX_MODE) || \ - ((MODE) == DIRECT_TX_FIFO_MODE) || \ - ((MODE) == DIRECT_TX_GPIO_MODE) || \ - ((MODE) == PN9_TX_MODE)) - -/** - * @brief Direct receive mode enumeration for SPIRIT. - */ -typedef enum -{ - NORMAL_RX_MODE = 0x00, /*!< Normal mode, no direct reception is used */ - DIRECT_RX_FIFO_MODE = 0x10, /*!< Destination is FIFO: payload bits are continuously written to the RX FIFO and not subjected to any processing*/ - DIRECT_RX_GPIO_MODE = 0x20 /*!< Destination is GPIO: payload bits are continuously written to one of the GPIO ports and not subjected to any processing*/ -}DirectRx; - -#define IS_DIRECT_RX(MODE) (((MODE) == NORMAL_RX_MODE) || \ - ((MODE) == DIRECT_RX_FIFO_MODE) || \ - ((MODE) == DIRECT_RX_GPIO_MODE)) - - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Exported_Constants Direct RF Exported Constants - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Exported_Macros Direct RF Exported Macros - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Exported_Functions Direct RF Exported Functions - * @{ - */ - -void SpiritDirectRfSetRxMode(DirectRx xDirectRx); -DirectRx SpiritDirectRfGetRxMode(void); -void SpiritDirectRfSetTxMode(DirectTx xDirectTx); -DirectTx SpiritDirectRfGetTxMode(void); - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_General.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_General.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_General.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT General functionalities. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_GENERAL_H -#define __SPIRIT_GENERAL_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_General General - * @brief Configuration and management of SPIRIT General functionalities. - * @details See the file <i>@ref SPIRIT_General.h</i> for more details. - * @{ - */ - -/** - * @defgroup General_Exported_Types General Exported Types - * @{ - */ - - -/** - * @brief SPIRIT ModeExtRef enumeration - */ - -typedef enum -{ - MODE_EXT_XO = 0, - MODE_EXT_XIN = !MODE_EXT_XO -} ModeExtRef; - -#define IS_MODE_EXT(MODE) (MODE == MODE_EXT_XO || \ - MODE == MODE_EXT_XIN) - - -/** - * @brief SPIRIT BatteryLevel enumeration - */ - -typedef enum -{ - BLD_LVL_2_7_V = 0, - BLD_LVL_2_5_V = 1, - BLD_LVL_2_3_V = 2, - BLD_LVL_2_1_V = 3 -} BatteryLevel; - -#define IS_BLD_LVL(MODE) (MODE == BLD_LVL_2_7_V || \ - MODE == BLD_LVL_2_5_V || \ - MODE == BLD_LVL_2_3_V || \ - MODE == BLD_LVL_2_1_V) - - -/** - * @brief SPIRIT GmConf enumeration - */ - -typedef enum -{ - GM_SU_13_2 = 0, - GM_SU_18_2, - GM_SU_21_5, - GM_SU_25_6, - GM_SU_28_8, - GM_SU_33_9, - GM_SU_38_5, - GM_SU_43_0 -} GmConf; - -#define IS_GM_CONF(MODE) (MODE == GM_SU_13_2 || \ - MODE == GM_SU_18_2 || \ - MODE == GM_SU_21_5 || \ - MODE == GM_SU_25_6 || \ - MODE == GM_SU_28_8 || \ - MODE == GM_SU_33_9 || \ - MODE == GM_SU_38_5 || \ - MODE == GM_SU_43_0) - - -/** - * @brief SPIRIT packet type enumeration - */ - -typedef enum -{ - PKT_BASIC = 0x00, - PKT_MBUS = 0x02, - PKT_STACK - -} PacketType; - -#define IS_PKT_TYPE(TYPE) (TYPE == PKT_BASIC || \ - TYPE == PKT_MBUS || \ - TYPE == PKT_STACK || \ - ) - - -/** - * @brief SPIRIT version type enumeration - */ - -typedef enum -{ - SPIRIT_VERSION_2_1 = 0x01, /* Deprecated */ - SPIRIT_VERSION_3_0, /* The only version of SPIRIT1 */ -} SpiritVersion; - - -/** - * @} - */ - - -/** - * @defgroup General_Exported_Constants General Exported Constants - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup General_Exported_Macros General Exported Macros - * @{ - */ -#define SpiritGeneralLibraryVersion() "Spirit1_Libraries_v.3.2.0" - - -/** - * @} - */ - - -/** - * @defgroup General_Exported_Functions General Exported Functions - * @{ - */ - - -void SpiritGeneralBatteryLevel(SpiritFunctionalState xNewState); -void SpiritGeneralSetBatteryLevel(BatteryLevel xBatteryLevel); -BatteryLevel SpiritGeneralGetBatteryLevel(void); -void SpiritGeneralBrownOut(SpiritFunctionalState xNewState); -void SpiritGeneralHighPwr(SpiritFunctionalState xNewState); -void SpiritGeneralSetExtRef(ModeExtRef xExtMode); -ModeExtRef SpiritGeneralGetExtRef(void); -void SpiritGeneralSetXoGm(GmConf xGm); -GmConf SpiritGeneralGetXoGm(void); -PacketType SpiritGeneralGetPktType(void); -uint16_t SpiritGeneralGetDevicePartNumber(void); -uint8_t SpiritGeneralGetSpiritVersion(void); - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Gpio.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Gpio.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,405 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Gpio.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief This file provides all the low level API to manage SPIRIT GPIO. - * - * @details - * - * This module can be used to configure the Spirit GPIO pins to perform - * specific functions. - * The structure <i>@ref gpioIRQ</i> can be used to specify these features for - * one of the four Spirit Gpio pin. - * The following example shows how to configure a pin (GPIO 3) to be used as an IRQ source - * for a microcontroller using the <i>@ref SpiritGpioInit()</i> function. - * - * <b>Example:</b> - * @code - * - * SGpioInit gpioIRQ={ - * SPIRIT_GPIO_3, - * SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, - * SPIRIT_GPIO_DIG_OUT_IRQ - * }; - * - * ... - * - * SpiritGpioInit(&gpioIRQ); - * - * @endcode - * - * @note Please read the functions documentation for the other GPIO features. - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_GPIO_H -#define __SPIRIT_GPIO_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** @defgroup SPIRIT_Gpio GPIO - * @brief Configuration and management of SPIRIT GPIO. - * @details See the file <i>@ref SPIRIT_Gpio.h</i> for more details. - * @{ - */ - - - -/** @defgroup Gpio_Exported_Types GPIO Exported Types - * @{ - */ - -/** - * @brief SPIRIT GPIO pin enumeration. - */ -typedef enum -{ - SPIRIT_GPIO_0 = GPIO0_CONF_BASE, /*!< GPIO_0 selected */ - SPIRIT_GPIO_1 = GPIO1_CONF_BASE, /*!< GPIO_1 selected */ - SPIRIT_GPIO_2 = GPIO2_CONF_BASE, /*!< GPIO_2 selected */ - SPIRIT_GPIO_3 = GPIO3_CONF_BASE /*!< GPIO_3 selected */ -}SpiritGpioPin; - - -#define IS_SPIRIT_GPIO(PIN) ((PIN == SPIRIT_GPIO_0) || \ - (PIN == SPIRIT_GPIO_1) || \ - (PIN == SPIRIT_GPIO_2) || \ - (PIN == SPIRIT_GPIO_3)) - - -/** - * @brief SPIRIT GPIO mode enumeration. - */ -typedef enum -{ - SPIRIT_GPIO_MODE_DIGITAL_INPUT = 0x01, /*!< Digital Input on GPIO */ - SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP = 0x02, /*!< Digital Output on GPIO (low current) */ - SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP = 0x03 /*!< Digital Output on GPIO (high current) */ -}SpiritGpioMode; - -#define IS_SPIRIT_GPIO_MODE(MODE) ((MODE == SPIRIT_GPIO_MODE_DIGITAL_INPUT) || \ - (MODE == SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP) || \ - (MODE == SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP)) - - - -/** - * @brief SPIRIT I/O selection enumeration. - */ -typedef enum -{ - SPIRIT_GPIO_DIG_OUT_IRQ = 0x00, /*!< nIRQ (Interrupt Request, active low) , default configuration after POR */ - SPIRIT_GPIO_DIG_OUT_POR_INV = 0x08, /*!< POR inverted (active low) */ - SPIRIT_GPIO_DIG_OUT_WUT_EXP = 0x10, /*!< Wake-Up Timer expiration: "1" when WUT has expired */ - SPIRIT_GPIO_DIG_OUT_LBD = 0x18, /*!< Low battery detection: "1" when battery is below threshold setting */ - SPIRIT_GPIO_DIG_OUT_TX_DATA = 0x20, /*!< TX data internal clock output (TX data are sampled on the rising edge of it) */ - SPIRIT_GPIO_DIG_OUT_TX_STATE = 0x28, /*!< TX state indication: "1" when Spirit1 is passing in the TX state */ - SPIRIT_GPIO_DIG_OUT_TX_FIFO_ALMOST_EMPTY = 0x30, /*!< TX FIFO Almost Empty Flag */ - SPIRIT_GPIO_DIG_OUT_TX_FIFO_ALMOST_FULL = 0x38, /*!< TX FIFO Almost Full Flag */ - SPIRIT_GPIO_DIG_OUT_RX_DATA = 0x40, /*!< RX data output */ - SPIRIT_GPIO_DIG_OUT_RX_CLOCK = 0x48, /*!< RX clock output (recovered from received data) */ - SPIRIT_GPIO_DIG_OUT_RX_STATE = 0x50, /*!< RX state indication: "1" when Spirit1 is passing in the RX state */ - SPIRIT_GPIO_DIG_OUT_RX_FIFO_ALMOST_FULL = 0x58, /*!< RX FIFO Almost Full Flag */ - SPIRIT_GPIO_DIG_OUT_RX_FIFO_ALMOST_EMPTY = 0x60, /*!< RX FIFO Almost Empty Flag */ - SPIRIT_GPIO_DIG_OUT_ANTENNA_SWITCH = 0x68, /*!< Antenna switch used for antenna diversity */ - SPIRIT_GPIO_DIG_OUT_VALID_PREAMBLE = 0x70, /*!< Valid Preamble Detected Flag */ - SPIRIT_GPIO_DIG_OUT_SYNC_DETECTED = 0x78, /*!< Sync WordSync Word Detected Flag */ - SPIRIT_GPIO_DIG_OUT_RSSI_THRESHOLD = 0x80, /*!< RSSI above threshold */ - SPIRIT_GPIO_DIG_OUT_MCU_CLOCK = 0x88, /*!< MCU Clock */ - SPIRIT_GPIO_DIG_OUT_TX_RX_MODE = 0x90, /*!< TX or RX mode indicator (to enable an external range extender) */ - SPIRIT_GPIO_DIG_OUT_VDD = 0x98, /*!< VDD (to emulate an additional GPIO of the MCU, programmable by SPI) */ - SPIRIT_GPIO_DIG_OUT_GND = 0xA0, /*!< GND (to emulate an additional GPIO of the MCU, programmable by SPI) */ - SPIRIT_GPIO_DIG_OUT_SMPS_EXT = 0xA8, /*!< External SMPS enable signal (active high) */ - SPIRIT_GPIO_DIG_OUT_SLEEP_OR_STANDBY = 0xB0, - SPIRIT_GPIO_DIG_OUT_READY = 0xB8, - SPIRIT_GPIO_DIG_OUT_LOCK = 0xC0, - SPIRIT_GPIO_DIG_OUT_WAIT_FOR_LOCK_SIG = 0xC8, - SPIRIT_GPIO_DIG_OUT_WAIT_FOR_TIMER_FOR_LOCK = 0xD0, - SPIRIT_GPIO_DIG_OUT_WAIT_FOR_READY2_SIG = 0xD8, - SPIRIT_GPIO_DIG_OUT_WAIT_FOR_TIMER_FOR_PM_SET = 0xE0, - SPIRIT_GPIO_DIG_OUT_WAIT_VCO_CALIBRATION = 0xE8, - SPIRIT_GPIO_DIG_OUT_ENABLE_SYNTH_FULL_CIRCUIT = 0xF0, - SPIRIT_GPIO_DIG_OUT_WAIT_FOR_RCCAL_OK_SIG = 0xFF, - - SPIRIT_GPIO_DIG_IN_TX_COMMAND = 0x00, - SPIRIT_GPIO_DIG_IN_RX_COMMAND = 0x08, - SPIRIT_GPIO_DIG_IN_TX_DATA_INPUT_FOR_DIRECTRF = 0x10, - SPIRIT_GPIO_DIG_IN_DATA_WAKEUP = 0x18, - SPIRIT_GPIO_DIG_IN_EXT_CLOCK_AT_34_7KHZ = 0x20 - -}SpiritGpioIO; - -#define IS_SPIRIT_GPIO_IO(IO_SEL) ((IO_SEL == SPIRIT_GPIO_DIG_OUT_IRQ) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_POR_INV) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WUT_EXP) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_LBD) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_TX_DATA) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_TX_STATE) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_TX_FIFO_ALMOST_EMPTY) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_TX_FIFO_ALMOST_FULL) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RX_DATA) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RX_CLOCK) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RX_STATE) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RX_FIFO_ALMOST_FULL) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RX_FIFO_ALMOST_EMPTY) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_ANTENNA_SWITCH) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_VALID_PREAMBLE) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_SYNC_DETECTED) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_RSSI_THRESHOLD) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_MCU_CLOCK) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_TX_RX_MODE) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_VDD) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_GND) || \ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_SMPS_EXT) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_SLEEP_OR_STANDBY) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_READY) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_LOCK) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_FOR_LOCK_SIG) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_FOR_TIMER_FOR_LOCK) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_FOR_READY2_SIG) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_FOR_TIMER_FOR_PM_SET) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_VCO_CALIBRATION) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_ENABLE_SYNTH_FULL_CIRCUIT) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_OUT_WAIT_FOR_RCCAL_OK_SIG) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_IN_TX_COMMAND) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_IN_RX_COMMAND) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_IN_TX_DATA_INPUT_FOR_DIRECTRF) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_IN_DATA_WAKEUP) ||\ - (IO_SEL == SPIRIT_GPIO_DIG_IN_EXT_CLOCK_AT_34_7KHZ)) - -/** - * @brief SPIRIT OutputLevel enumeration. - */ - -typedef enum -{ - LOW = 0, - HIGH = !LOW -}OutputLevel; - -#define IS_SPIRIT_GPIO_LEVEL(LEVEL) ((LEVEL == LOW) || \ - (LEVEL == HIGH)) - - -/** - * @brief SPIRIT GPIO Init structure definition. - */ -typedef struct -{ - SpiritGpioPin xSpiritGpioPin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref SpiritGpioPin */ - - SpiritGpioMode xSpiritGpioMode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref SpiritGpioMode */ - - SpiritGpioIO xSpiritGpioIO; /*!< Specifies the I/O selection for the selected pins. - This parameter can be a value of @ref SpiritGpioIO */ - -}SGpioInit; - - - -/** - * @brief SPIRIT clock output XO prescaler enumeration. - */ - -typedef enum -{ - XO_RATIO_1 = 0x00, /*!< XO Clock signal available on the GPIO divided by 1 */ - XO_RATIO_2_3 = 0x02, /*!< XO Clock signal available on the GPIO divided by 2/3 */ - XO_RATIO_1_2 = 0x04, /*!< XO Clock signal available on the GPIO divided by 1/2 */ - XO_RATIO_1_3 = 0x06, /*!< XO Clock signal available on the GPIO divided by 1/3 */ - XO_RATIO_1_4 = 0x08, /*!< XO Clock signal available on the GPIO divided by 1/4 */ - XO_RATIO_1_6 = 0x0A, /*!< XO Clock signal available on the GPIO divided by 1/6 */ - XO_RATIO_1_8 = 0x0C, /*!< XO Clock signal available on the GPIO divided by 1/8 */ - XO_RATIO_1_12 = 0x0E, /*!< XO Clock signal available on the GPIO divided by 1/12 */ - XO_RATIO_1_16 = 0x10, /*!< XO Clock signal available on the GPIO divided by 1/16 */ - XO_RATIO_1_24 = 0x12, /*!< XO Clock signal available on the GPIO divided by 1/24 */ - XO_RATIO_1_36 = 0x14, /*!< XO Clock signal available on the GPIO divided by 1/36 */ - XO_RATIO_1_48 = 0x16, /*!< XO Clock signal available on the GPIO divided by 1/48 */ - XO_RATIO_1_64 = 0x18, /*!< XO Clock signal available on the GPIO divided by 1/64 */ - XO_RATIO_1_96 = 0x1A, /*!< XO Clock signal available on the GPIO divided by 1/96 */ - XO_RATIO_1_128 = 0x1C, /*!< XO Clock signal available on the GPIO divided by 1/128 */ - XO_RATIO_1_192 = 0x1E /*!< XO Clock signal available on the GPIO divided by 1/196 */ -}ClockOutputXOPrescaler; - -#define IS_SPIRIT_CLOCK_OUTPUT_XO(RATIO) ((RATIO == XO_RATIO_1) || \ - (RATIO == XO_RATIO_2_3) || \ - (RATIO == XO_RATIO_1_2) || \ - (RATIO == XO_RATIO_1_3) || \ - (RATIO == XO_RATIO_1_4) || \ - (RATIO == XO_RATIO_1_6) || \ - (RATIO == XO_RATIO_1_8) || \ - (RATIO == XO_RATIO_1_12) || \ - (RATIO == XO_RATIO_1_16) || \ - (RATIO == XO_RATIO_1_24) || \ - (RATIO == XO_RATIO_1_36) || \ - (RATIO == XO_RATIO_1_48) || \ - (RATIO == XO_RATIO_1_64) || \ - (RATIO == XO_RATIO_1_96) || \ - (RATIO == XO_RATIO_1_128) || \ - (RATIO == XO_RATIO_1_192)) - -/** - * @brief SPIRIT Clock Output RCO prescaler enumeration. - */ - -typedef enum -{ - RCO_RATIO_1 = 0x00, /*!< RCO Clock signal available on the GPIO divided by 1 */ - RCO_RATIO_1_128 = 0x01 /*!< RCO Clock signal available on the GPIO divided by 1/128 */ -}ClockOutputRCOPrescaler; - -#define IS_SPIRIT_CLOCK_OUTPUT_RCO(RATIO) ((RATIO == RCO_RATIO_1) || \ - (RATIO == RCO_RATIO_1_128)) - -/** - * @brief SPIRIT ExtraClockCycles enumeration. - */ - -typedef enum -{ -EXTRA_CLOCK_CYCLES_0 = 0x00, /*!< 0 extra clock cycles provided to the MCU before switching to STANDBY state */ -EXTRA_CLOCK_CYCLES_64 = 0x20, /*!< 64 extra clock cycles provided to the MCU before switching to STANDBY state */ -EXTRA_CLOCK_CYCLES_256 = 0x40, /*!< 256 extra clock cycles provided to the MCU before switching to STANDBY state */ -EXTRA_CLOCK_CYCLES_512 = 0x60 /*!< 512 extra clock cycles provided to the MCU before switching to STANDBY state */ -}ExtraClockCycles; - -#define IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(CYCLES) ((CYCLES == EXTRA_CLOCK_CYCLES_0) || \ - (CYCLES == EXTRA_CLOCK_CYCLES_64) || \ - (CYCLES == EXTRA_CLOCK_CYCLES_256) || \ - (CYCLES == EXTRA_CLOCK_CYCLES_512)) - - -/** - * @brief SPIRIT Clock Output initialization structure definition. - */ -typedef struct -{ - ClockOutputXOPrescaler xClockOutputXOPrescaler; /*!< Specifies the XO Ratio as clock output. - This parameter can be any value of @ref ClockOutputXOPrescaler */ - - ClockOutputRCOPrescaler xClockOutputRCOPrescaler; /*!< Specifies the RCO Ratio as clock output. - This parameter can be a value of @ref ClockOutputRCOPrescaler */ - - ExtraClockCycles xExtraClockCycles; /*!< Specifies the Extra Clock Cycles provided before entering in Standby State. - This parameter can be a value of @ref ExtraClockCycles */ - -}ClockOutputInit; - - - -/** - * @} - */ - - - -/** @defgroup Gpio_Exported_Constants GPIO Exported Constants - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Exported_Macros GPIO Exported Macros - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Exported_Functions GPIO Exported Functions - * @{ - */ - -void SpiritGpioInit(SGpioInit* pxGpioInitStruct); -void SpiritGpioTemperatureSensor(SpiritFunctionalState xNewState); -void SpiritGpioSetLevel(SpiritGpioPin xGpioX, OutputLevel xLevel); -OutputLevel SpiritGpioGetLevel(SpiritGpioPin xGpioX); -void SpiritGpioClockOutput(SpiritFunctionalState xNewState); -void SpiritGpioClockOutputInit(ClockOutputInit* pxClockOutputInitStruct); -void SpiritGpioSetXOPrescaler(ClockOutputXOPrescaler xXOPrescaler); -ClockOutputXOPrescaler SpiritGpioGetXOPrescaler(void); -void SpiritGpioSetRCOPrescaler(ClockOutputRCOPrescaler xRCOPrescaler); -ClockOutputRCOPrescaler SpiritGpioGetRCOPrescaler(void); -void SpiritGpioSetExtraClockCycles(ExtraClockCycles xExtraCycles); -ExtraClockCycles SpiritGpioGetExtraClockCycles(void); - - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Irq.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Irq.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Irq.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT IRQs. - * - * @details - * - * On the Spirit side specific IRQs can be enabled by setting a specific bitmask. - * The Spirit libraries allow the user to do this in two different ways: - * <ul> - * - * <li>The first enables the IRQs one by one, i.e. using an SPI transaction for each - * IRQ to enable. - * - * <b>Example:</b> - * @code - * - * SpiritIrqDeInit(NULL); // this call is used to reset the IRQ mask registers - * SpiritIrq(RX_DATA_READY , S_ENABLE); - * SpiritIrq(VALID_SYNC , S_ENABLE); - * SpiritIrq(RX_TIMEOUT , S_ENABLE); - * - * @endcode - * - * </li> - * - * <li>The second strategy is to set the IRQ bitfields structure. So, during the initialization the user - * has to fill the @ref SpiritIrqs structure setting to one the single field related to the IRQ he - * wants to enable, and to zero the single field related to all the IRQs he wants to disable. - * - * <b>Example:</b> - * @code - * - * SpiritIrqs irqMask; - * - * ... - * - * SpiritIrqDeInit(&irqMask); // this call is used to reset the IRQ mask registers - * // and to set to 0x00000000 the irq mask in order to disable - * // all IRQs (disabled by default on startup) - * irqMask.IRQ_RX_DATA_READY = 1; - * irqMask.IRQ_VALID_SYNC = 1; - * irqMask.IRQ_RX_TIMEOUT = 1; - * - * ... - * @endcode - * </li> - * </ul> - * - * The most applications will require a Spirit IRQ notification on an microcontroller EXTI line. - * Then, the user can check which IRQ has been raised using two different ways. - * - * On the ISR of the EXTI line phisically linked to the Spirit pin configured for IRQ: - * - * <ul> - * <li> Check <b>only one</b> Spirit IRQ (because the Spirit IRQ status register automatically blanks itself - * after an SPI reading) into the ISR. - * - * <b>Example:</b> - * @code - * - * if(SpiritIrqCheckFlag(RX_DATA_READY)) - * { - * // do something... - * } - * - * @endcode - * </li> - * - * <li> Check more than one Spirit IRQ status by storing the entire IRQ status registers into a bitfields <i>@ref SpiritIrqs</i> structure - * and then check the interested bits. - * - * <b>Example:</b> - * @code - * - * SpiritIrqGetStatus(&irqStatus); - * - * if(irqStatus.IRQ_RX_DATA_READY) - * { - * // do something... - * } - * if(irqStatus.IRQ_VALID_SYNC) - * { - * // do something... - * } - * if(irqStatus.RX_TIMEOUT) - * { - * // do something... - * } - * - * @endcode - * </li> - * </ul> - * - - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT1_IRQ_H -#define __SPIRIT1_IRQ_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Irq IRQ - * @brief Configuration and management of SPIRIT IRQs. - * @details See the file <i>@ref SPIRIT_Irq.h</i> for more details. - * @{ - */ - -/** - * @defgroup Irq_Exported_Types IRQ Exported Types - * @{ - */ - - -/** - * @brief IRQ bitfield structure for SPIRIT. This structure is used to read or write the single IRQ bit. - * During the initialization the user has to fill this structure setting to one the single field related - * to the IRQ he wants to enable, and to zero the single field related to all the IRQs he wants to disable. - * The same structure can be used to retrieve all the IRQ events from the IRQ registers IRQ_STATUS[3:0], - * and read if one or more specific IRQ raised. - * @note The fields order in the structure depends on used endianness (little or big - * endian). The actual definition is valid ONLY for LITTLE ENDIAN mode. Be sure to - * change opportunely the fields order when use a different endianness. - */ -typedef struct -{ - SpiritFlagStatus IRQ_SYNTH_LOCK_TIMEOUT:1; /*!< IRQ: only for debug; LOCK state timeout */ - SpiritFlagStatus IRQ_SYNTH_LOCK_STARTUP:1; /*!< IRQ: only for debug; see CALIBR_START_COUNTER */ - SpiritFlagStatus IRQ_SYNTH_CAL_TIMEOUT:1; /*!< IRQ: only for debug; SYNTH calibration timeout */ - SpiritFlagStatus IRQ_TX_START_TIME:1; /*!< IRQ: only for debug; TX circuitry startup time; see TX_START_COUNTER */ - SpiritFlagStatus IRQ_RX_START_TIME:1; /*!< IRQ: only for debug; RX circuitry startup time; see TX_START_COUNTER */ - SpiritFlagStatus IRQ_RX_TIMEOUT:1; /*!< IRQ: RX operation timeout */ - SpiritFlagStatus IRQ_AES_END:1; /*!< IRQ: AES End of operation */ - SpiritFlagStatus reserved:1; /*!< Reserved bit */ - - SpiritFlagStatus IRQ_READY:1; /*!< IRQ: READY state */ - SpiritFlagStatus IRQ_STANDBY_DELAYED:1; /*!< IRQ: STANDBY state after MCU_CK_CONF_CLOCK_TAIL_X clock cycles */ - SpiritFlagStatus IRQ_LOW_BATT_LVL:1; /*!< IRQ: Battery level below threshold*/ - SpiritFlagStatus IRQ_POR:1; /*!< IRQ: Power On Reset */ - SpiritFlagStatus IRQ_BOR:1; /*!< IRQ: Brown out event (both accurate and inaccurate)*/ - SpiritFlagStatus IRQ_LOCK:1; /*!< IRQ: LOCK state */ - SpiritFlagStatus IRQ_PM_COUNT_EXPIRED:1; /*!< IRQ: only for debug; Power Management startup timer expiration (see reg PM_START_COUNTER, 0xB5) */ - SpiritFlagStatus IRQ_XO_COUNT_EXPIRED:1; /*!< IRQ: only for debug; Crystal oscillator settling time counter expired */ - - SpiritFlagStatus IRQ_TX_FIFO_ALMOST_EMPTY:1; /*!< IRQ: TX FIFO almost empty */ - SpiritFlagStatus IRQ_RX_FIFO_ALMOST_FULL:1; /*!< IRQ: RX FIFO almost full */ - SpiritFlagStatus IRQ_RX_FIFO_ALMOST_EMPTY:1; /*!< IRQ: RX FIFO almost empty */ - SpiritFlagStatus IRQ_MAX_BO_CCA_REACH:1; /*!< IRQ: Max number of back-off during CCA */ - SpiritFlagStatus IRQ_VALID_PREAMBLE:1; /*!< IRQ: Valid preamble detected */ - SpiritFlagStatus IRQ_VALID_SYNC:1; /*!< IRQ: Sync word detected */ - SpiritFlagStatus IRQ_RSSI_ABOVE_TH:1; /*!< IRQ: RSSI above threshold */ - SpiritFlagStatus IRQ_WKUP_TOUT_LDC:1; /*!< IRQ: Wake-up timeout in LDC mode */ - - SpiritFlagStatus IRQ_RX_DATA_READY:1; /*!< IRQ: RX data ready */ - SpiritFlagStatus IRQ_RX_DATA_DISC:1; /*!< IRQ: RX data discarded (upon filtering) */ - SpiritFlagStatus IRQ_TX_DATA_SENT:1; /*!< IRQ: TX data sent */ - SpiritFlagStatus IRQ_MAX_RE_TX_REACH:1; /*!< IRQ: Max re-TX reached */ - SpiritFlagStatus IRQ_CRC_ERROR:1; /*!< IRQ: CRC error */ - SpiritFlagStatus IRQ_TX_FIFO_ERROR:1; /*!< IRQ: TX FIFO underflow/overflow error */ - SpiritFlagStatus IRQ_RX_FIFO_ERROR:1; /*!< IRQ: RX FIFO underflow/overflow error */ - SpiritFlagStatus IRQ_TX_FIFO_ALMOST_FULL:1; /*!< IRQ: TX FIFO almost full */ -} SpiritIrqs; - -// betzw: uint32_t masks -#define IRQ_TX_FIFO_ALMOST_EMPTY_MASK (0x00010000) /* (1<<16) */ -#define IRQ_RX_FIFO_ALMOST_FULL_MASK (0x00020000) /* (1<<17) */ -#define IRQ_VALID_SYNC_MASK (0x00200000) /* (1<<21) */ -#define IRQ_RX_DATA_READY_MASK (0x01000000) /* (1<<24) */ -#define IRQ_RX_DATA_DISC_MASK (0x02000000) /* (1<<25) */ -#define IRQ_TX_DATA_SENT_MASK (0x04000000) /* (1<<26) */ -#define IRQ_TX_FIFO_ERROR_MASK (0x20000000) /* (1<<29) */ -#define IRQ_RX_FIFO_ERROR_MASK (0x40000000) /* (1<<30) */ - -/** - * @brief IRQ list enumeration for SPIRIT. This enumeration type can be used to address a - * specific IRQ. - */ -typedef enum -{ - RX_DATA_READY = 0x00000001, /*!< IRQ: RX data ready */ - RX_DATA_DISC = 0x00000002, /*!< IRQ: RX data discarded (upon filtering) */ - TX_DATA_SENT = 0x00000004, /*!< IRQ: TX data sent */ - MAX_RE_TX_REACH = 0x00000008, /*!< IRQ: Max re-TX reached */ - CRC_ERROR = 0x00000010, /*!< IRQ: CRC error */ - TX_FIFO_ERROR = 0x00000020, /*!< IRQ: TX FIFO underflow/overflow error */ - RX_FIFO_ERROR = 0x00000040, /*!< IRQ: RX FIFO underflow/overflow error */ - TX_FIFO_ALMOST_FULL = 0x00000080, /*!< IRQ: TX FIFO almost full */ - TX_FIFO_ALMOST_EMPTY = 0x00000100, /*!< IRQ: TX FIFO almost empty */ - RX_FIFO_ALMOST_FULL = 0x00000200, /*!< IRQ: RX FIFO almost full */ - RX_FIFO_ALMOST_EMPTY = 0x00000400, /*!< IRQ: RX FIFO almost empty */ - MAX_BO_CCA_REACH = 0x00000800, /*!< IRQ: Max number of back-off during CCA */ - VALID_PREAMBLE = 0x00001000, /*!< IRQ: Valid preamble detected */ - VALID_SYNC = 0x00002000, /*!< IRQ: Sync word detected */ - RSSI_ABOVE_TH = 0x00004000, /*!< IRQ: RSSI above threshold */ - WKUP_TOUT_LDC = 0x00008000, /*!< IRQ: Wake-up timeout in LDC mode */ - READY = 0x00010000, /*!< IRQ: READY state */ - STANDBY_DELAYED = 0x00020000, /*!< IRQ: STANDBY state after MCU_CK_CONF_CLOCK_TAIL_X clock cycles */ - LOW_BATT_LVL = 0x00040000, /*!< IRQ: Battery level below threshold*/ - POR = 0x00080000, /*!< IRQ: Power On Reset */ - BOR = 0x00100000, /*!< IRQ: Brown out event (both accurate and inaccurate)*/ - LOCK = 0x00200000, /*!< IRQ: LOCK state */ - PM_COUNT_EXPIRED = 0x00400000, /*!< IRQ: only for debug; Power Management startup timer expiration (see reg PM_START_COUNTER, 0xB5) */ - XO_COUNT_EXPIRED = 0x00800000, /*!< IRQ: only for debug; Crystal oscillator settling time counter expired */ - SYNTH_LOCK_TIMEOUT = 0x01000000, /*!< IRQ: only for debug; LOCK state timeout */ - SYNTH_LOCK_STARTUP = 0x02000000, /*!< IRQ: only for debug; see CALIBR_START_COUNTER */ - SYNTH_CAL_TIMEOUT = 0x04000000, /*!< IRQ: only for debug; SYNTH calibration timeout */ - TX_START_TIME = 0x08000000, /*!< IRQ: only for debug; TX circuitry startup time; see TX_START_COUNTER */ - RX_START_TIME = 0x10000000, /*!< IRQ: only for debug; RX circuitry startup time; see TX_START_COUNTER */ - RX_TIMEOUT = 0x20000000, /*!< IRQ: RX operation timeout */ - AES_END = 0x40000000, /*!< IRQ: AES End of operation */ - ALL_IRQ = 0x7FFFFFFF /*!< All the above mentioned IRQs */ - -} IrqList; - -#define IS_SPIRIT_IRQ_LIST(VALUE) ((VALUE == RX_DATA_READY) || \ - (VALUE == RX_DATA_DISC) || \ - (VALUE == TX_DATA_SENT) || \ - (VALUE == MAX_RE_TX_REACH) || \ - (VALUE == CRC_ERROR) || \ - (VALUE == TX_FIFO_ERROR) || \ - (VALUE == RX_FIFO_ERROR) || \ - (VALUE == TX_FIFO_ALMOST_FULL) || \ - (VALUE == TX_FIFO_ALMOST_EMPTY) || \ - (VALUE == RX_FIFO_ALMOST_FULL) || \ - (VALUE == RX_FIFO_ALMOST_EMPTY) || \ - (VALUE == MAX_BO_CCA_REACH) || \ - (VALUE == VALID_PREAMBLE) || \ - (VALUE == VALID_SYNC) || \ - (VALUE == RSSI_ABOVE_TH) || \ - (VALUE == WKUP_TOUT_LDC) || \ - (VALUE == READY) || \ - (VALUE == STANDBY_DELAYED) || \ - (VALUE == LOW_BATT_LVL) || \ - (VALUE == POR) || \ - (VALUE == BOR) || \ - (VALUE == LOCK) || \ - (VALUE == PM_COUNT_EXPIRED) || \ - (VALUE == XO_COUNT_EXPIRED) || \ - (VALUE == SYNTH_LOCK_TIMEOUT) || \ - (VALUE == SYNTH_LOCK_STARTUP) || \ - (VALUE == SYNTH_CAL_TIMEOUT) || \ - (VALUE == TX_START_TIME) || \ - (VALUE == RX_START_TIME) || \ - (VALUE == RX_TIMEOUT) || \ - (VALUE == AES_END) || \ - (VALUE == ALL_IRQ )) - - -/** - * @} - */ - - -/** - * @defgroup Irq_Exported_Constants IRQ Exported Constants - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Irq_Exported_Macros IRQ Exported Macros - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup Irq_Exported_Functions IRQ Exported Functions - * @{ - */ - -void SpiritIrqDeInit(SpiritIrqs* pxIrqInit); -void SpiritIrqInit(SpiritIrqs* pxIrqInit); -void SpiritIrq(IrqList xIrq, SpiritFunctionalState xNewState); -void SpiritIrqGetMask(SpiritIrqs* pxIrqMask); -void SpiritIrqGetStatus(SpiritIrqs* pxIrqStatus); -void SpiritIrqClearStatus(void); -SpiritBool SpiritIrqCheckFlag(IrqList xFlag); - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_LinearFifo.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_LinearFifo.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_LinearFifo.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT Fifo. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_LINEAR_FIFO_H -#define __SPIRIT_LINEAR_FIFO_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_LinearFifo Linear FIFO - * @brief Configuration and management of SPIRIT FIFO. - * @details See the file <i>@ref SPIRIT_LinearFifo.h</i> for more details. - * @{ - */ - -/** - * @defgroup LinearFifo_Exported_Types Linear FIFO Exported Types - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup LinearFifo_Exported_Constants Linear FIFO Exported Constants - * @{ - */ -#define IS_FIFO_THR(VAL) (VAL<=96) - -/** - * @} - */ - - -/** - * @defgroup LinearFifo_Exported_Macros Linear FIFO Exported Macros - * @{ - */ - - -/** - * @} - */ - - -/** - * @defgroup LinearFifo_Exported_Functions Linear FIFO Exported Functions - * @{ - */ - -uint8_t SpiritLinearFifoReadNumElementsRxFifo(void); -uint8_t SpiritLinearFifoReadNumElementsTxFifo(void); -void SpiritLinearFifoSetAlmostFullThresholdRx(uint8_t cThrRxFifo); -uint8_t SpiritLinearFifoGetAlmostFullThresholdRx(void); -void SpiritLinearFifoSetAlmostEmptyThresholdRx(uint8_t cThrRxFifo); -uint8_t SpiritLinearFifoGetAlmostEmptyThresholdRx(void); -void SpiritLinearFifoSetAlmostFullThresholdTx(uint8_t cThrTxFifo); -uint8_t SpiritLinearFifoGetAlmostFullThresholdTx(void); -void SpiritLinearFifoSetAlmostEmptyThresholdTx(uint8_t cThrTxFifo); -uint8_t SpiritLinearFifoGetAlmostEmptyThresholdTx(void); - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Management.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Management.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Management.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief The management layer for SPIRIT1 library. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef SPIRIT_MANAGEMENT_H_ -#define SPIRIT_MANAGEMENT_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Config.h" - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_MANAGEMENT Management - * @brief Workarounds for Spirit1. - * @details See the file <i>@ref SPIRIT_Management.h</i> for more details. - * @{ - */ - - -/** - * @addgroup SPIRIT_MANAGEMENT_FUNCTIONS - * @{ - */ - - - - -uint8_t SpiritManagementWaVcoCalibration(void); -void SpiritManagementWaCmdStrobeTx(void); -void SpiritManagementWaCmdStrobeRx(void); -void SpiritManagementWaTRxFcMem(uint32_t nDesiredFreq); -void SpiritManagementWaExtraCurrent(void); - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -#ifdef __cplusplus -} -#endif - - -#endif - - - /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/ -
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktBasic.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktBasic.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,696 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktBasic.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT Basic packets. - * - * @details - * - * This module can be used to manage the configuration of Spirit Basic - * packets. - * The user can obtain a packet configuration filling the structure - * <i>@ref PktBasicInit</i>, defining in it some general parameters - * for the Spirit Basic packet format. - * Another structure the user can fill is <i>@ref PktBasicAddressesInit</i> - * to define the addresses which will be used during the communication. - * Moreover, functions to set the payload length and the destination address - * are provided. - * - * <b>Example:</b> - * @code - * - * PktBasicInit basicInit={ - * PKT_PREAMBLE_LENGTH_08BYTES, // preamble length in bytes - * PKT_SYNC_LENGTH_4BYTES, // sync word length in bytes - * 0x1A2635A8, // sync word - * PKT_LENGTH_VAR, // variable or fixed payload length - * 7, // length field width in bits (used only for variable length) - * PKT_NO_CRC, // CRC mode - * PKT_CONTROL_LENGTH_0BYTES, // control field length - * S_ENABLE, // address field - * S_DISABLE, // FEC - * S_ENABLE // whitening - * }; - * - * PktBasicAddressesInit addressInit={ - * S_ENABLE, // enable/disable filtering on my address - * 0x34, // my address (address of the current node) - * S_DISABLE, // enable/disable filtering on multicast address - * 0xEE, // multicast address - * S_DISABLE, // enable/disable filtering on broadcast address - * 0xFF // broadcast address - * }; - * - * ... - * - * SpiritPktBasicInit(&basicInit); - * SpiritPktBasicAddressesInit(&addressInit); - * - * ... - * - * SpiritPktBasicSetPayloadLength(20); - * SpiritPktBasicSetDestinationAddress(0x44); - * - * ... - * - * @endcode - * - * The module provides some other functions that can be used to modify - * or read only some configuration parameters. - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_PKT_BASIC_H -#define __SPIRIT_PKT_BASIC_H - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" -#include "SPIRIT_PktCommon.h" - -#ifdef __cplusplus - extern "C" { -#endif - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_PktBasic Pkt Basic - * @brief Configuration and management of SPIRIT Basic packets. - * @details See the file <i>@ref SPIRIT_PktBasic.h</i> for more details. - * @{ - */ - -/** - * @defgroup PktBasic_Exported_Types Pkt Basic Exported Types - * @{ - */ - - -/** - * @brief Preamble length in bytes enumeration. - */ -typedef PktPreambleLength BasicPreambleLength; - -#define IS_BASIC_PREAMBLE_LENGTH IS_PKT_PREAMBLE_LENGTH - -/** - * @brief Sync length in bytes enumeration. - */ -typedef PktSyncLength BasicSyncLength; - -#define IS_BASIC_SYNC_LENGTH IS_PKT_SYNC_LENGTH - - - -/** - * @brief CRC length in bytes enumeration. - */ -typedef PktCrcMode BasicCrcMode; - -#define IS_BASIC_CRC_MODE IS_PKT_CRC_MODE - - -/** - * @brief Fixed or variable payload length enumeration. - */ -typedef PktFixVarLength BasicFixVarLength; - -#define IS_BASIC_FIX_VAR_LENGTH IS_PKT_FIX_VAR_LENGTH - -/** - * @brief Control length in bytes enumeration. - */ -typedef PktControlLength BasicControlLength; - -#define IS_BASIC_CONTROL_LENGTH IS_PKT_CONTROL_LENGTH - -/** - * @brief Sync words enumeration. - */ -typedef PktSyncX BasicSyncX; - -#define IS_BASIC_SYNCx IS_PKT_SYNCx - - -/** - * @brief SPIRIT Basic Packet Init structure definition. This structure allows users to set the main options - * for the Basic packet. - */ -typedef struct -{ - - BasicPreambleLength xPreambleLength; /*!< Specifies the preamble length. - This parameter can be any value of @ref BasicPreambleLength */ - BasicSyncLength xSyncLength; /*!< Specifies the sync word length. The 32bit word passed (lSyncWords) will be stored in the SYNCx registers from the MSb - until the number of bytes in xSyncLength has been stored. - This parameter can be any value of @ref BasicSyncLength */ - uint32_t lSyncWords; /*!< Specifies the sync words. - This parameter is a uint32_t word with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4| */ - BasicFixVarLength xFixVarLength; /*!< Specifies if a fixed length of packet has to be used. - This parameter can be any value of @ref BasicFixVarLength */ - uint8_t cPktLengthWidth; /*!< Specifies the size of the length of packet in bits. This field is useful only if - the field xFixVarLength is set to BASIC_LENGTH_VAR. For Basic packets the length width - is log2( max payload length + control length (0 to 4) + address length (0 or 1)). - This parameter is an uint8_t */ - BasicCrcMode xCrcMode; /*!< Specifies the CRC word length of packet. - This parameter can be any value of @ref BasicCrcMode */ - BasicControlLength xControlLength; /*!< Specifies the length of a control field to be sent. - This parameter can be any value of @ref BasicControlLength */ - SpiritFunctionalState xAddressField; /*!< Specifies if the destination address has to be sent. - This parameter can be S_ENABLE or S_DISABLE */ - SpiritFunctionalState xFec; /*!< Specifies if FEC has to be enabled. - This parameter can be S_ENABLE or S_DISABLE */ - SpiritFunctionalState xDataWhitening; /*!< Specifies if data whitening has to be enabled. - This parameter can be S_ENABLE or S_DISABLE */ -}PktBasicInit; - - -/** - * @brief SPIRIT Basic Packet address structure definition. This structure allows users to specify - * the node/multicast/broadcast addresses and the correspondent filtering options. - */ -typedef struct -{ - - SpiritFunctionalState xFilterOnMyAddress; /*!< If set RX packet is accepted if its destination address matches with cMyAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cMyAddress; /*!< Specifies the TX packet source address (address of this node). - This parameter is an uint8_t */ - SpiritFunctionalState xFilterOnMulticastAddress; /*!< If set RX packet is accepted if its destination address matches with cMulticastAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cMulticastAddress; /*!< Specifies the Multicast group address for this node. - This parameter is an uint8_t */ - SpiritFunctionalState xFilterOnBroadcastAddress; /*!< If set RX packet is accepted if its destination address matches with cBroadcastAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cBroadcastAddress; /*!< Specifies the Broadcast address for this node. - This parameter is an uint8_t */ -}PktBasicAddressesInit; - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Exported_Constants Pkt Basic Exported Constants - * @{ - */ - -#define IS_BASIC_LENGTH_WIDTH_BITS IS_PKT_LENGTH_WIDTH_BITS - - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Exported_Macros Pkt Basic Exported Macros - * @{ - */ - -/** - * @brief Macro used to compute per lower part of the packet length - * for Spirit Basic packets, to write in the PCKTLEN0 register. - * @param nLength Length of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define BASIC_BUILD_PCKTLEN0(nLength) BUILD_PCKTLEN0(nLength) - - -/** - * @brief Macro used to compute per upper part of the packet length - * for Spirit Basic packets, to write the PCKTLEN1 register. - * @param nLengthLength of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define BASIC_BUILD_PCKTLEN1(nLength) BUILD_PCKTLEN1(nLength) - -/** - * @brief Sets the CONTROL field length for SPIRIT Basic packets. - * @param xControlLength length of CONTROL field in bytes. - * This parameter can be any value of @ref PktControlLength. - * @retval None. - */ -#define SpiritPktBasicSetControlLength(xControlLength) SpiritPktCommonSetControlLength(xControlLength) - - -/** - * @brief Returns the CONTROL field length for SPIRIT Basic packets. - * @param None. - * @retval uint8_t Control field length. - */ -#define SpiritPktBasicGetControlLength() SpiritPktCommonGetControlLength() - - -/** - * @brief Sets the PREAMBLE field length for SPIRIT Basic packets. - * @param xPreambleLength length of PREAMBLE field in bytes. - * This parameter can be any value of @ref BasicPreambleLength. - * @retval None. - */ -#define SpiritPktBasicSetPreambleLength(xPreambleLength) SpiritPktCommonSetPreambleLength((PktPreambleLength)xPreambleLength) - - -/** - * @brief Returns the PREAMBLE field length mode for SPIRIT Basic packets. - * @param None. - * @retval uint8_t Preamble field length in bytes. - */ -#define SpiritPktBasicGetPreambleLength() SpiritPktCommonGetPreambleLength() - - -/** - * @brief Sets the SYNC field length for SPIRIT Basic packets. - * @param xSyncLength length of SYNC field in bytes. - * This parameter can be any value of @ref BasicSyncLength. - * @retval None. - */ -#define SpiritPktBasicSetSyncLength(xSyncLength) SpiritPktCommonSetSyncLength((PktSyncLength)xSyncLength) - - -/** - * @brief Returns the SYNC field length for SPIRIT Basic packets. - * @param None. - * @retval uint8_t SYNC field length in bytes. - */ -#define SpiritPktBasicGetSyncLength() SpiritPktCommonGetSyncLength() - - -/** - * @brief Sets fixed or variable payload length mode for SPIRIT packets. - * @param xFixVarLength variable or fixed length. - * BASIC_FIXED_LENGTH_VAR -> variable (the length is extracted from the received packet). - * BASIC_FIXED_LENGTH_FIX -> fix (the length is set by PCKTLEN0 and PCKTLEN1). - * @retval None. - */ -#define SpiritPktBasicSetFixVarLength(xFixVarLength) SpiritPktCommonSetFixVarLength((PktFixVarLength)xFixVarLength) - - -/** - * @brief Enables or Disables the CRC filtering. - * @param xNewState new state for CRC_CHECK. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicFilterOnCrc(xNewState) SpiritPktCommonFilterOnCrc(xNewState) - - -/** - * @brief Returns the CRC filtering bit. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktBasicGetFilterOnCrc() SpiritPktCommonGetFilterOnCrc() - - -/** - * @brief Sets the CRC mode for SPIRIT Basic packets. - * @param xCrcMode CRC mode. - * This parameter can be any value of @ref BasicCrcMode. - * @retval None. - */ -#define SpiritPktBasicSetCrcMode(xCrcMode) SpiritPktCommonSetCrcMode((PktCrcMode)xCrcMode) - - -/** - * @brief Returns the CRC mode for SPIRIT Basic packets. - * @param None. - * @retval BasicCrcMode Crc mode. - */ -#define SpiritPktBasicGetCrcMode() (BasicCrcMode)SpiritPktCommonGetCrcMode() - - -/** - * @brief Enables or Disables WHITENING for SPIRIT packets. - * @param xNewState new state for WHITENING mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicWhitening(xNewState) SpiritPktCommonWhitening(xNewState) - - -/** - * @brief Enables or Disables FEC for SPIRIT Basic packets. - * @param xNewState new state for FEC mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicFec(xNewState) SpiritPktCommonFec(xNewState) - - -/** - * @brief Sets a specific SYNC word for SPIRIT Basic packets. - * @param xSyncX SYNC word number to be set. - * This parameter can be any value of @ref BasicSyncX. - * @param cSyncWord SYNC word. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktBasicSetSyncxWord(xSyncX, cSyncWord) SpiritPktCommonSetSyncxWord((PktSyncX)xSyncX, cSyncWord) - - -/** - * @brief Returns a specific SYNC words for SPIRIT Basic packets. - * @param xSyncX SYNC word number to be get. - * This parameter can be any value of @ref BasicSyncX. - * @retval uint8_t Sync word x. - */ -#define SpiritPktBasicGetSyncxWord(xSyncX) SpiritPktCommonGetSyncxWord(xSyncX) - - -/** - * @brief Sets multiple SYNC words for SPIRIT Basic packets. - * @param lSyncWords SYNC words to be set with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - * This parameter is a uint32_t. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a @ref BasicSyncLength. - * @retval None. - */ -#define SpiritPktBasicSetSyncWords(lSyncWords, xSyncLength) SpiritPktCommonSetSyncWords(lSyncWords, (PktSyncLength)xSyncLength) - - -/** - * @brief Returns multiple SYNC words for SPIRIT Basic packets. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a pointer to @ref BasicSyncLength. - * @retval uint32_t Sync words. The format of the read 32 bit word is 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - */ -#define SpiritPktBasicGetSyncWords(xSyncLength) SpiritPktCommonGetSyncWords((PktSyncLength)xSyncLength) - - -/** - * @brief Returns the SPIRIT variable length width (in number of bits). - * @param None. - * @retval Variable length width in bits. - */ -#define SpiritPktBasicGetVarLengthWidth() SpiritPktCommonGetVarLengthWidth() - - -/** - * @brief Sets the destination address for the Tx packet. - * @param cAddress destination address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktBasicSetDestinationAddress(cAddress) SpiritPktCommonSetDestinationAddress(cAddress) - - -/** - * @brief Returns the settled destination address. - * @param None. - * @retval uint8_t Transmitted destination address. - */ -#define SpiritPktBasicGetTransmittedDestAddress() SpiritPktCommonGetTransmittedDestAddress() - - -/** - * @brief Sets the node address. When the filtering on my address is on, if the destination address extracted from the received packet is equal to the content of the - * my address, then the packet is accepted (this is the address of the node). - * @param cAddress Address of the present node. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktBasicSetMyAddress(cAddress) SpiritPktCommonSetMyAddress(cAddress) - - -/** - * @brief Returns the address of the present node. - * @param None. - * @retval uint8_t My address (address of this node). - */ -#define SpiritPktBasicGetMyAddress() SpiritPktCommonGetMyAddress() - - -/** - * @brief Sets the broadcast address. When the broadcast filtering is on, if the destination address extracted from the received packet is equal to the content of the - * BROADCAST_ADDR register, then the packet is accepted. - * @param cAddress Broadcast address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktBasicSetBroadcastAddress(cAddress) SpiritPktCommonSetBroadcastAddress(cAddress) - - -/** - * @brief Returns the broadcast address. - * @param None. - * @retval uint8_t Broadcast address. - */ -#define SpiritPktBasicGetBroadcastAddress() SpiritPktCommonGetBroadcastAddress() - - -/** - * @brief Sets the multicast address. When the multicast filtering is on, if the destination address extracted from the received packet is equal to the content of the - * MULTICAST_ADDR register, then the packet is accepted. - * @param cAddress Multicast address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktBasicSetMulticastAddress(cAddress) SpiritPktCommonSetMulticastAddress(cAddress) - - -/** - * @brief Returns the multicast address. - * @param None. - * @retval uint8_t Multicast address. - */ -#define SpiritPktBasicGetMulticastAddress() SpiritPktCommonGetMulticastAddress() - - -/** - * @brief Sets the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param lMask Control mask. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktBasicSetCtrlMask(lMask) SpiritPktCommonSetCtrlMask(lMask) - - -/** - * @brief Returns the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param None. - * @retval uint32_t Control mask. - */ -#define SpiritPktBasicGetCtrlMask() SpiritPktCommonGetCtrlMask() - - -/** - * @brief Sets the control field reference. If the bits enabled by the - * CONTROL_MASK match the ones of the control fields extracted from the received packet - * then the packet is accepted. - * @param lReference Control reference. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktBasicSetCtrlReference(lReference) SpiritPktCommonSetCtrlReference(lReference) - - -/** - * @brief Returns the control field reference. - * @param None. - * @retval uint32_t Control reference. - */ -#define SpiritPktBasicGetCtrlReference() SpiritPktCommonGetCtrlReference() - - -/** - * @brief Sets the TX control field. - * @param lField Tx control field. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktBasicSetTransmittedCtrlField(lField) SpiritPktCommonSetTransmittedCtrlField(lField) - - -/** - * @brief Returns the TX control field. - * @param None. - * @retval uint32_t Control field of the transmitted packet. - */ -#define SpiritPktBasicGetTransmittedCtrlField() SpiritPktCommonGetTransmittedCtrlField() - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with My address. - * @param xNewState new state for DEST_VS_SOURCE_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicFilterOnMyAddress(xNewState) SpiritPktCommonFilterOnMyAddress(xNewState) - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with multicast address. - * @param xNewState new state for DEST_VS_MULTICAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicFilterOnMulticastAddress(xNewState) SpiritPktCommonFilterOnMulticastAddress(xNewState) - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with broadcast address. - * @param xNewState new state for DEST_VS_BROADCAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktBasicFilterOnBroadcastAddress(xNewState) SpiritPktCommonFilterOnBroadcastAddress(xNewState) - - -/** - * @brief Returns the enable bit of the my address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktBasicGetFilterOnMyAddress() SpiritPktCommonGetFilterOnMyAddress(); - - -/** - * @brief Returns the enable bit of the multicast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktBasicGetFilterOnMulticastAddress() SpiritPktCommonGetFilterOnMulticastAddress(); - - -/** - * @brief Returns the enable bit of the broadcast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktBasicGetFilterOnBroadcastAddress() SpiritPktCommonGetFilterOnBroadcastAddress(); - - -/** - * @brief Returns the destination address of the received packet. - * @param None. - * @retval uint8_t Destination address of the received packet. - */ -#define SpiritPktBasicGetReceivedDestAddress() SpiritPktCommonGetReceivedDestAddress() - - -/** - * @brief Returns the control field of the received packet. - * @param None. - * @retval uint32_t Received control field. - */ -#define SpiritPktBasicGetReceivedCtrlField() SpiritPktCommonGetReceivedCtrlField() - - -/** - * @brief Returns the CRC field of the received packet. - * @param cCrcFieldVect array in which the CRC field has to be stored. - * This parameter is an uint8_t array of 3 elements. - * @retval None. - */ -#define SpiritPktBasicGetReceivedCrcField(cCrcFieldVect) SpiritPktCommonGetReceivedCrcField(cCrcFieldVect) - - -/** - * @brief If enabled RX packet is accepted only if the masked control field matches the - * masked control field reference (CONTROL_MASK & CONTROL_FIELD_REF == CONTROL_MASK & RX_CONTROL_FIELD). - * @param xNewState new state for Control filtering enable bit. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - * @note This filtering control is enabled by default but the control mask is by default set to 0. - * As a matter of fact the user has to enable the control filtering bit after the packet initialization - * because the PktInit routine disables it. - */ -#define SpiritPktBasicFilterOnControlField(xNewState) SpiritPktCommonFilterOnControlField(xNewState) - - -/** - * @brief Returns the enable bit of the control field filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktBasicGetFilterOnControlField() SpiritPktCommonGetFilterOnControlField(); - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Exported_Functions Pkt Basic Exported Functions - * @{ - */ - -void SpiritPktBasicInit(PktBasicInit* pxPktBasicInit); -void SpiritPktBasicGetInfo(PktBasicInit* pxPktBasicInit); -void SpiritPktBasicAddressesInit(PktBasicAddressesInit* pxPktBasicAddresses); -void SpiritPktBasicGetAddressesInfo(PktBasicAddressesInit* pxPktBasicAddresses); -void SpiritPktBasicSetFormat(void); -void SpiritPktBasicAddressField(SpiritFunctionalState xAddressField); -SpiritFunctionalState SpiritPktBasicGetAddressField(void); -void SpiritPktBasicSetPayloadLength(uint16_t nPayloadLength); -uint16_t SpiritPktBasicGetPayloadLength(void); -uint16_t SpiritPktBasicGetReceivedPktLength(void); -void SpiritPktBasicSetVarLengthWidth(uint16_t nMaxPayloadLength,SpiritFunctionalState xAddressField, BasicControlLength xControlLength); - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktCommon.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktCommon.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktCommon.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of the common features of SPIRIT packets. - * - * @details - * - * This module provides all the common functions and definitions used by the - * packets modules. - * Here are also defined all the generic enumeration types that are redefined - * in the specific packets modules, but every enumeration value is referred - * to this module. So the user who wants to configure the preamble of a Basic, - * or a STack packet has to use the enumeration values defined here. - * - * <b>Example:</b> - * @code - * - * ... - * - * SpiritPktBasicSetPreambleLength(PKT_PREAMBLE_LENGTH_18BYTES); - * - * ... - * - * @endcode - * - * @note Is recommended for the user to not use these API directly - * importing this module in his application. - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_PKT_COMMON_H -#define __SPIRIT_PKT_COMMON_H - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_PktCommon Pkt Common - * @brief Configuration and management of the common features of SPIRIT packets. - * @details See the file <i>@ref SPIRIT_PktCommon.h</i> for more details. - * @{ - */ - -/** - * @defgroup PktCommon_Exported_Types Pkt Common Exported Types - * @{ - */ - - -/** - * @brief Preamble length in bytes enumeration. - */ -typedef enum -{ - PKT_PREAMBLE_LENGTH_01BYTE = 0x00, /*!< Preamble length 1 byte*/ - PKT_PREAMBLE_LENGTH_02BYTES = 0x08, /*!< Preamble length 2 bytes */ - PKT_PREAMBLE_LENGTH_03BYTES = 0x10, /*!< Preamble length 3 bytes */ - PKT_PREAMBLE_LENGTH_04BYTES = 0x18, /*!< Preamble length 4 bytes */ - PKT_PREAMBLE_LENGTH_05BYTES = 0x20, /*!< Preamble length 5 bytes */ - PKT_PREAMBLE_LENGTH_06BYTES = 0x28, /*!< Preamble length 6 bytes */ - PKT_PREAMBLE_LENGTH_07BYTES = 0x30, /*!< Preamble length 7 bytes */ - PKT_PREAMBLE_LENGTH_08BYTES = 0x38, /*!< Preamble length 8 bytes */ - PKT_PREAMBLE_LENGTH_09BYTES = 0x40, /*!< Preamble length 9 bytes */ - PKT_PREAMBLE_LENGTH_10BYTES = 0x48, /*!< Preamble length 10 bytes */ - PKT_PREAMBLE_LENGTH_11BYTES = 0x50, /*!< Preamble length 11 bytes */ - PKT_PREAMBLE_LENGTH_12BYTES = 0x58, /*!< Preamble length 12 bytes */ - PKT_PREAMBLE_LENGTH_13BYTES = 0x60, /*!< Preamble length 13 bytes */ - PKT_PREAMBLE_LENGTH_14BYTES = 0x68, /*!< Preamble length 14 bytes */ - PKT_PREAMBLE_LENGTH_15BYTES = 0x70, /*!< Preamble length 15 bytes */ - PKT_PREAMBLE_LENGTH_16BYTES = 0x78, /*!< Preamble length 16 bytes */ - PKT_PREAMBLE_LENGTH_17BYTES = 0x80, /*!< Preamble length 17 bytes */ - PKT_PREAMBLE_LENGTH_18BYTES = 0x88, /*!< Preamble length 18 bytes */ - PKT_PREAMBLE_LENGTH_19BYTES = 0x90, /*!< Preamble length 19 bytes */ - PKT_PREAMBLE_LENGTH_20BYTES = 0x98, /*!< Preamble length 20 bytes */ - PKT_PREAMBLE_LENGTH_21BYTES = 0xA0, /*!< Preamble length 21 bytes */ - PKT_PREAMBLE_LENGTH_22BYTES = 0xA8, /*!< Preamble length 22 bytes */ - PKT_PREAMBLE_LENGTH_23BYTES = 0xB0, /*!< Preamble length 23 bytes */ - PKT_PREAMBLE_LENGTH_24BYTES = 0xB8, /*!< Preamble length 24 bytes */ - PKT_PREAMBLE_LENGTH_25BYTES = 0xC0, /*!< Preamble length 25 bytes */ - PKT_PREAMBLE_LENGTH_26BYTES = 0xC8, /*!< Preamble length 26 bytes */ - PKT_PREAMBLE_LENGTH_27BYTES = 0xD0, /*!< Preamble length 27 bytes */ - PKT_PREAMBLE_LENGTH_28BYTES = 0xD8, /*!< Preamble length 28 bytes */ - PKT_PREAMBLE_LENGTH_29BYTES = 0xE0, /*!< Preamble length 29 bytes */ - PKT_PREAMBLE_LENGTH_30BYTES = 0xE8, /*!< Preamble length 30 bytes */ - PKT_PREAMBLE_LENGTH_31BYTES = 0xF0, /*!< Preamble length 31 bytes */ - PKT_PREAMBLE_LENGTH_32BYTES = 0xF8 /*!< Preamble length 32 bytes */ - -}PktPreambleLength; - -#define IS_PKT_PREAMBLE_LENGTH(LENGTH) ((LENGTH == PKT_PREAMBLE_LENGTH_01BYTE) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_02BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_03BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_04BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_05BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_06BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_07BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_08BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_09BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_10BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_11BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_12BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_13BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_14BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_15BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_16BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_17BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_18BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_19BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_20BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_21BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_22BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_23BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_24BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_25BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_26BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_27BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_28BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_29BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_30BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_31BYTES) || \ - (LENGTH == PKT_PREAMBLE_LENGTH_32BYTES)) - - - -/** - * @brief Sync length in bytes enumeration. - */ -typedef enum -{ - PKT_SYNC_LENGTH_1BYTE = 0x00, /*!< Sync length 1 byte*/ - PKT_SYNC_LENGTH_2BYTES = 0x02, /*!< Sync length 2 bytes*/ - PKT_SYNC_LENGTH_3BYTES = 0x04, /*!< Sync length 3 bytes */ - PKT_SYNC_LENGTH_4BYTES = 0x06 , /*!< Sync length 4 bytes */ - -}PktSyncLength; - -#define IS_PKT_SYNC_LENGTH(LENGTH) ((LENGTH == PKT_SYNC_LENGTH_1BYTE) || \ - (LENGTH == PKT_SYNC_LENGTH_2BYTES)|| \ - (LENGTH == PKT_SYNC_LENGTH_3BYTES)|| \ - (LENGTH == PKT_SYNC_LENGTH_4BYTES)) - - - -/** - * @brief CRC length in bytes enumeration. - */ -typedef enum -{ - PKT_NO_CRC = 0x00, /*!< No CRC */ - PKT_CRC_MODE_8BITS = 0x20, /*!< CRC length 8 bits - poly: 0x07 */ - PKT_CRC_MODE_16BITS_1 = 0x40, /*!< CRC length 16 bits - poly: 0x8005 */ - PKT_CRC_MODE_16BITS_2 = 0x60, /*!< CRC length 16 bits - poly: 0x1021 */ - PKT_CRC_MODE_24BITS = 0x80, /*!< CRC length 24 bits - poly: 0x864CFB */ - -}PktCrcMode; - -#define IS_PKT_CRC_MODE(MODE) ((MODE == PKT_NO_CRC) || \ - (MODE == PKT_CRC_MODE_8BITS) || \ - (MODE == PKT_CRC_MODE_16BITS_1) || \ - (MODE == PKT_CRC_MODE_16BITS_2) || \ - (MODE == PKT_CRC_MODE_24BITS)) - - - -/** - * @brief Fixed or variable payload length enumeration. - */ -typedef enum -{ - PKT_LENGTH_FIX = 0x00, /*!< Fixed payload length */ - PKT_LENGTH_VAR = 0x01 /*!< Variable payload length */ - -}PktFixVarLength; - -#define IS_PKT_FIX_VAR_LENGTH(LENGTH) ((LENGTH == PKT_LENGTH_FIX) || \ - (LENGTH == PKT_LENGTH_VAR)) - - -/** - * @brief Control length in bytes enumeration for SPIRIT packets. - */ -typedef enum -{ - PKT_CONTROL_LENGTH_0BYTES = 0x00, /*!< Control length 0 byte*/ - PKT_CONTROL_LENGTH_1BYTE, /*!< Control length 1 byte*/ - PKT_CONTROL_LENGTH_2BYTES, /*!< Control length 2 bytes*/ - PKT_CONTROL_LENGTH_3BYTES, /*!< Control length 3 bytes*/ - PKT_CONTROL_LENGTH_4BYTES /*!< Control length 4 bytes*/ - -}PktControlLength; - -#define IS_PKT_CONTROL_LENGTH(LENGTH) ((LENGTH == PKT_CONTROL_LENGTH_0BYTES) || \ - (LENGTH == PKT_CONTROL_LENGTH_1BYTE) || \ - (LENGTH == PKT_CONTROL_LENGTH_2BYTES) || \ - (LENGTH == PKT_CONTROL_LENGTH_3BYTES) || \ - (LENGTH == PKT_CONTROL_LENGTH_4BYTES)) - -/** - * @brief Sync words enumeration for SPIRIT packets. - */ -typedef enum -{ - PKT_SYNC_WORD_1=0x01, /*!< Index of the 1st sync word*/ - PKT_SYNC_WORD_2, /*!< Index of the 2nd sync word*/ - PKT_SYNC_WORD_3, /*!< Index of the 3rd sync word*/ - PKT_SYNC_WORD_4 /*!< Index of the 4th sync word*/ - -}PktSyncX; - -#define IS_PKT_SYNCx(WORD) ((WORD == PKT_SYNC_WORD_1) || \ - (WORD == PKT_SYNC_WORD_2) || \ - (WORD == PKT_SYNC_WORD_3) || \ - (WORD == PKT_SYNC_WORD_4)) - - - -/** - * @brief Max retransmissions number enumeration for SPIRIT packets. - */ -typedef enum -{ - PKT_DISABLE_RETX = 0x00, /*!< No retrasmissions*/ - PKT_N_RETX_1 = 0x10, /*!< Max retrasmissions 1*/ - PKT_N_RETX_2 = 0x20, /*!< Max retrasmissions 2*/ - PKT_N_RETX_3 = 0x30, /*!< Max retrasmissions 3*/ - PKT_N_RETX_4 = 0x40, /*!< Max retrasmissions 4*/ - PKT_N_RETX_5 = 0x50, /*!< Max retrasmissions 5*/ - PKT_N_RETX_6 = 0x60, /*!< Max retrasmissions 6*/ - PKT_N_RETX_7 = 0x70, /*!< Max retrasmissions 7*/ - PKT_N_RETX_8 = 0x80, /*!< Max retrasmissions 8*/ - PKT_N_RETX_9 = 0x90, /*!< Max retrasmissions 9*/ - PKT_N_RETX_10 = 0xA0, /*!< Max retrasmissions 10*/ - PKT_N_RETX_11 = 0xB0, /*!< Max retrasmissions 11*/ - PKT_N_RETX_12 = 0xC0, /*!< Max retrasmissions 12*/ - PKT_N_RETX_13 = 0xD0, /*!< Max retrasmissions 13*/ - PKT_N_RETX_14 = 0xE0, /*!< Max retrasmissions 14*/ - PKT_N_RETX_15 = 0xF0 /*!< Max retrasmissions 15*/ - -}PktNMaxReTx; - -#define IS_PKT_NMAX_RETX(N_RETX) ((N_RETX == PKT_DISABLE_RETX) || \ - (N_RETX == PKT_N_RETX_1) || \ - (N_RETX == PKT_N_RETX_2) || \ - (N_RETX == PKT_N_RETX_3) || \ - (N_RETX == PKT_N_RETX_4) || \ - (N_RETX == PKT_N_RETX_5) || \ - (N_RETX == PKT_N_RETX_6) || \ - (N_RETX == PKT_N_RETX_7) || \ - (N_RETX == PKT_N_RETX_8) || \ - (N_RETX == PKT_N_RETX_9) || \ - (N_RETX == PKT_N_RETX_10) || \ - (N_RETX == PKT_N_RETX_11) || \ - (N_RETX == PKT_N_RETX_12) || \ - (N_RETX == PKT_N_RETX_13) || \ - (N_RETX == PKT_N_RETX_14) || \ - (N_RETX == PKT_N_RETX_15)) - - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Exported_Constants Pkt Common Exported Constants - * @{ - */ - -#define IS_PKT_LENGTH_WIDTH_BITS(BITS) (BITS<=16) -#define IS_PKT_SEQ_NUMBER_RELOAD(SEQN) (SEQN<=3) - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Exported_Macros Pkt Common Exported Macros - * @{ - */ - - -/** - * @brief Macro used to compute the lower part of the packet length, to write in the PCKTLEN0 register - * @param nLength Length of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define BUILD_PCKTLEN0(nLength) ((nLength) & 0xFF) - - -/** - * @brief Macro used to compute the upper part of the packet length, to write the PCKTLEN1 register - * @param nLength Length of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define BUILD_PCKTLEN1(nLength) ((nLength) >> 8) - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Exported_Functions Pkt Common Exported Functions - * @{ - */ - -void SpiritPktCommonSetControlLength(PktControlLength xControlLength); -uint8_t SpiritPktCommonGetControlLength(void); -void SpiritPktCommonSetPreambleLength(PktPreambleLength xPreambleLength); -uint8_t SpiritPktCommonGetPreambleLength(void); -void SpiritPktCommonSetSyncLength(PktSyncLength xSyncLength); -uint8_t SpiritPktCommonGetSyncLength(void); -void SpiritPktCommonSetFixVarLength(PktFixVarLength xFixVarLength); -void SpiritPktCommonFilterOnCrc(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritPktCommonGetFilterOnCrc(void); -void SpiritPktCommonSetCrcMode(PktCrcMode xCrcLength); -PktCrcMode SpiritPktCommonGetCrcMode(void); -void SpiritPktCommonWhitening(SpiritFunctionalState xNewState); -void SpiritPktCommonFec(SpiritFunctionalState xNewState); -void SpiritPktCommonSetSyncxWord(PktSyncX xSyncX, uint8_t cSyncWord); -uint8_t SpiritPktCommonGetSyncxWord(PktSyncX xSyncX); -void SpiritPktCommonSetSyncWords(uint32_t lSyncWords, PktSyncLength xSyncLength); -uint32_t SpiritPktCommonGetSyncWords(PktSyncLength xSyncLength); -uint8_t SpiritPktCommonGetVarLengthWidth(void); -void SpiritPktCommonSetDestinationAddress(uint8_t cAddress); -uint8_t SpiritPktCommonGetTransmittedDestAddress(void); -void SpiritPktCommonSetMyAddress(uint8_t cAddress); -uint8_t SpiritPktCommonGetMyAddress(void); -void SpiritPktCommonSetBroadcastAddress(uint8_t cAddress); -uint8_t SpiritPktCommonGetBroadcastAddress(void); -SpiritFunctionalState SpiritPktCommonGetTxAckRequest(void); -void SpiritPktCommonSetMulticastAddress(uint8_t cAddress); -uint8_t SpiritPktCommonGetMulticastAddress(void); -void SpiritPktCommonSetCtrlMask(uint32_t lMask); -uint32_t SpiritPktCommonGetCtrlMask(void); -void SpiritPktCommonSetCtrlReference(uint32_t lReference); -uint32_t SpiritPktCommonGetCtrlReference(void); -void SpiritPktCommonSetTransmittedCtrlField(uint32_t lField); -uint32_t SpiritPktCommonGetTransmittedCtrlField(void); -void SpiritPktCommonFilterOnMyAddress(SpiritFunctionalState xNewState); -void SpiritPktCommonFilterOnMulticastAddress(SpiritFunctionalState xNewState); -void SpiritPktCommonFilterOnBroadcastAddress(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritPktCommonGetFilterOnMyAddress(void); -SpiritFunctionalState SpiritPktCommonGetFilterOnMulticastAddress(void); -SpiritFunctionalState SpiritPktCommonGetFilterOnBroadcastAddress(void); -uint8_t SpiritPktCommonGetReceivedDestAddress(void); -uint32_t SpiritPktCommonGetReceivedCtrlField(void); -void SpiritPktCommonGetReceivedCrcField(uint8_t* cCrcFieldVect); -void SpiritPktCommonAutoAck(SpiritFunctionalState xAutoAck,SpiritFunctionalState xPiggybacking); -void SpiritPktCommonRequireAck(SpiritFunctionalState xRequireAck); -void SpiritPktCommonSetTransmittedSeqNumberReload(uint8_t cSeqNumberReload); -void SpiritPktCommonSetNMaxReTx(PktNMaxReTx xNMaxReTx); -uint8_t SpiritPktCommonGetNMaxReTx(void); -uint8_t SpiritPktCommonGetReceivedDestAddress(void); -uint8_t SpiritPktCommonGetReceivedSourceAddress(void); -uint8_t SpiritPktCommonGetReceivedSeqNumber(void); -uint8_t SpiritPktCommonGetReceivedNackRx(void); -uint8_t SpiritPktCommonGetTransmittedSeqNumber(void); -uint8_t SpiritPktCommonGetNReTx(void); -void SpiritPktCommonFilterOnControlField(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritPktCommonGetFilterOnControlField(void); - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktMbus.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktMbus.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktMbus.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT MBUS packets. - * - * @details - * - * This module can be used to manage the configuration of Spirit MBUS - * packets. - * The user can obtain a packet configuration filling the structure - * <i>@ref PktMbusInit</i>, defining in it some general parameters - * for the Spirit MBUS packet format. - * Since the MBUS protocol is a standard, the configuration of a MBUS - * packet is very simple to do. - * - * <b>Example:</b> - * @code - * - * PktMbusInit mbusInit={ - * MBUS_SUBMODE_S1_S2_LONG_HEADER, // MBUS submode selection - * 36, // added "01" chips on preamble - * 16 // postamble length in "01" chips - * }; - * - * ... - * - * SpiritPktMbusInit(&mbusInit); - * - * ... - * - * @endcode - * - * The module provides some other functions that can be used to modify - * or read only some configuration parameters. - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_PACKET_MBUS_H -#define __SPIRIT_PACKET_MBUS_H - - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" -#include "SPIRIT_PktCommon.h" - -#ifdef __cplusplus - extern "C" { -#endif - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_PktMbus Pkt MBUS - * @brief Configuration and management of SPIRIT MBUS packets. - * @details See the file <i>@ref SPIRIT_PktMbus.h</i> for more details. - * @{ - */ - -/** - * @defgroup PktMbus_Exported_Types Pkt MBUS Exported Types - * @{ - */ - - - -/** - * @brief MBUS submode enumeration. - */ - -typedef enum -{ - MBUS_SUBMODE_S1_S2_LONG_HEADER = MBUS_CTRL_MBUS_SUBMODE_S1_S2L, /*!< MBUS submode S1, S2 (long header) - Header length = mbus_prmbl_ctrl + 279 (in "01" bit pairs) , Sync word = 0x7696 (length 18 bits) */ - MBUS_SUBMODE_S1_M_S2_T2_OTHER_TO_METER = MBUS_CTRL_MBUS_SUBMODE_S2_S1M_T2_OTHER, /*!< MBUS submode S1-m, S2, T2 (other to meter) - Header length = mbus_prmbl_ctrl + 15 (in "01" bit pairs) , Sync word = 0x7696 (length 18 bits)*/ - MBUS_SUBMODE_T1_T2_METER_TO_OTHER = MBUS_CTRL_MBUS_SUBMODE_T1_T2_METER, /*!< MBUS submode T1, T2 (meter to other) - Header length = mbus_prmbl_ctrl + 19 (in "01" bit pairs) , Sync word = 0x3D (length 10 bits)*/ - MBUS_SUBMODE_R2_SHORT_HEADER = MBUS_CTRL_MBUS_SUBMODE_R2, /*!< MBUS submode R2, short header - Header length = mbus_prmbl_ctrl + 39 (in "01" bit pairs) , Sync word = 0x7696 (length 18 bits)*/ - -}MbusSubmode; - -#define IS_MBUS_SUBMODE(MODE) (((MODE) == MBUS_SUBMODE_S1_S2_LONG_HEADER) || \ - ((MODE) == MBUS_SUBMODE_S1_M_S2_T2_OTHER_TO_METER) || \ - ((MODE) == MBUS_SUBMODE_T1_T2_METER_TO_OTHER) || \ - ((MODE) == MBUS_SUBMODE_R2_SHORT_HEADER)) - - -/** - * @brief SPIRIT MBUS Packet Init structure definition - */ -typedef struct -{ - MbusSubmode xMbusSubmode; /*!< Specifies the SUBMODE to be configured. - This parameter can be a value of @ref MbusSubmode */ - - uint8_t cPreambleLength; /*!< Specifies the PREAMBLE length. - This parameter can be any value between 0 and 255 chip sequence '01' */ - - uint8_t cPostambleLength; /*!< Specifies the POSTAMBLE length. - This parameter can be any value between 0 and 255 chip sequence '01' */ - -}PktMbusInit; - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Exported_Constants Pkt MBUS Exported Constants - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Exported_Macros Pkt MBUS Exported Macros - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Exported_Functions Pkt MBUS Exported Functions - * @{ - */ -void SpiritPktMbusInit(PktMbusInit* pxPktMbusInit); -void SpiritPktMbusGetInfo(PktMbusInit* pxPktMbusInit); -void SpiritPktMbusSetFormat(void); -void SpiritPktMbusSetPreamble(uint8_t cPreamble); -uint8_t SpiritPktMbusGetPreamble(void); -void SpiritPktMbusSetPostamble(uint8_t cPostamble); -uint8_t SpiritPktMbusGetPostamble(void); -void SpiritPktMbusSetSubmode(MbusSubmode xMbusSubmode); -MbusSubmode SpiritPktMbusGetSubmode(void); -void SpiritPktMbusSetPayloadLength(uint16_t nPayloadLength); -uint16_t SpiritPktMbusGetPayloadLength(void); - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktStack.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_PktStack.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,849 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktStack.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT STack packets. - * - * @details - * - * This module can be used to manage the configuration of Spirit STack - * packets, and it is quite similar to the Basic packets one since the - * STack packets can be considered an extension of Basic. - * The user can obtain a packet configuration filling the structure - * <i>@ref PktStackInit</i>, defining in it some general parameters - * for the Spirit STack packet format. - * Another structure the user can fill is <i>@ref PktStackAddressesInit</i> - * to define the addresses which will be used during the communication. - * The structure <i>@ref PktStackLlpInit</i> is provided in order to configure - * the link layer protocol features like autoack, autoretransmission - * or piggybacking. - * Moreover, functions to set the payload length and the destination address - * are provided. - * - * <b>Example:</b> - * @code - * - * PktStackInit stackInit={ - * PKT_PREAMBLE_LENGTH_08BYTES, // preamble length in bytes - * PKT_SYNC_LENGTH_4BYTES, // sync word length in bytes - * 0x1A2635A8, // sync word - * PKT_LENGTH_VAR, // variable or fixed payload length - * 7, // length field width in bits (used only for variable length) - * PKT_NO_CRC, // CRC mode - * PKT_CONTROL_LENGTH_0BYTES, // control field length - * S_DISABLE, // FEC - * S_ENABLE // whitening - * }; - * - * PktStackAddressesInit addressInit={ - * S_ENABLE, // enable/disable filtering on my address - * 0x34, // my address (address of the current node) - * S_DISABLE, // enable/disable filtering on multicast address - * 0xEE, // multicast address - * S_DISABLE, // enable/disable filtering on broadcast address - * 0xFF // broadcast address - * }; - * - * PktStackLlpInit stackLLPInit ={ - * S_DISABLE, // enable/disable the autoack feature - * S_DISABLE, // enable/disable the piggybacking feature - * PKT_DISABLE_RETX // set the max number of retransmissions or disable them - * }; - * ... - * - * SpiritPktStackInit(&stackInit); - * SpiritPktStackAddressesInit(&addressInit); - * SpiritPktStackLlpInit(&stackLLPInit); - * - * ... - * - * SpiritPktStackSetPayloadLength(20); - * SpiritPktStackSetDestinationAddress(0x44); - * - * ... - * - * @endcode - * - * The module provides some other functions that can be used to modify - * or read only some configuration parameters. - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_PKT_STACK_H -#define __SPIRIT_PKT_STACK_H - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" -#include "SPIRIT_PktCommon.h" - -#ifdef __cplusplus - extern "C" { -#endif - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_PktStack Pkt STack - * @brief Configuration and management of SPIRIT STack packets. - * @details See the file <i>@ref SPIRIT_PktStack.h</i> for more details. - * @{ - */ - -/** - * @defgroup PktStack_Exported_Types Pkt STack Exported Types - * @{ - */ - -/** - * @brief Preamble length in bytes enumeration. - */ -typedef PktPreambleLength StackPreambleLength; - -#define IS_STACK_PREAMBLE_LENGTH IS_PKT_PREAMBLE_LENGTH - -/** - * @brief Sync length in bytes enumeration. - */ -typedef PktSyncLength StackSyncLength; - -#define IS_STACK_SYNC_LENGTH IS_PKT_SYNC_LENGTH - - - -/** - * @brief CRC length in bytes enumeration. - */ -typedef PktCrcMode StackCrcMode; - -#define IS_STACK_CRC_MODE IS_PKT_CRC_MODE - - -/** - * @brief Fixed or variable payload length enumeration. - */ -typedef PktFixVarLength StackFixVarLength; - -#define IS_STACK_FIX_VAR_LENGTH IS_PKT_FIX_VAR_LENGTH - -/** - * @brief Control length in bytes enumeration for SPIRIT. - */ -typedef PktControlLength StackControlLength; - -#define IS_STACK_CONTROL_LENGTH IS_PKT_CONTROL_LENGTH - -/** - * @brief Sync words enumeration for SPIRIT. - */ -typedef PktSyncX StackSyncX; - -#define IS_STACK_SYNCx IS_PKT_SYNCx - -/** - * @brief Max retransmission number enumeration for SPIRIT. - */ -typedef PktNMaxReTx StackNMaxReTx; - -#define IS_STACK_NMAX_RETX IS_PKT_NMAX_RETX - - -/** - * @brief SPIRIT STack Packet Init structure definition. This structure allows users to set the main options - * for the STack packet. - */ -typedef struct -{ - - StackPreambleLength xPreambleLength; /*!< Specifies the preamble length of packet. - This parameter can be any value of @ref StackPreambleLength */ - StackSyncLength xSyncLength; /*!< Specifies the sync word length of packet. - This parameter can be any value of @ref StackSyncLength */ - uint32_t lSyncWords; /*!< Specifies the sync words. - This parameter is a uint32_t word with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4| */ - StackFixVarLength xFixVarLength; /*!< Specifies if a fixed length of packet has to be used. - This parameter can be any value of @ref StackFixVarLength */ - uint8_t cPktLengthWidth; /*!< Specifies the size of the length of packet in bits. This field is useful only if - the field xFixVarLength is set to STACK_LENGTH_VAR. For STack packets the length width - is log2( max payload length + control length (0 to 4) + address length (always 2)). - This parameter is an uint8_t */ - StackCrcMode xCrcMode; /*!< Specifies the CRC word length of packet. - This parameter can be any value of @ref StackCrcMode */ - StackControlLength xControlLength; /*!< Specifies the length of a control field to be sent. - This parameter can be any value of @ref StackControlLength */ - SpiritFunctionalState xFec; /*!< Specifies if FEC has to be enabled. - This parameter can be any value of @ref SpiritFunctionalState */ - SpiritFunctionalState xDataWhitening; /*!< Specifies if data whitening has to be enabled. - This parameter can be any value of @ref SpiritFunctionalState */ - -}PktStackInit; - - -/** - * @brief SPIRIT STack packet address structure definition. This structure allows users to specify - * the node/multicast/broadcast addresses and the correspondent filtering options. - */ -typedef struct -{ - - SpiritFunctionalState xFilterOnMyAddress; /*!< If set RX packet is accepted if its destination address matches with cMyAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cMyAddress; /*!< Specifies the TX packet source address (address of this node). - This parameter is an uint8_t */ - SpiritFunctionalState xFilterOnMulticastAddress; /*!< If set RX packet is accepted if its destination address matches with cMulticastAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cMulticastAddress; /*!< Specifies the Multicast group address for this node. - This parameter is an uint8_t */ - SpiritFunctionalState xFilterOnBroadcastAddress; /*!< If set RX packet is accepted if its destination address matches with cBroadcastAddress. - This parameter can be S_ENABLE or S_DISABLE */ - uint8_t cBroadcastAddress; /*!< Specifies the Broadcast address for this node. - This parameter is an uint8_t */ -}PktStackAddressesInit; - - -/** - * @brief SPIRIT STack packet LLP structure definition. This structure allows users to configure - * all the LLP options for STack packets. - */ -typedef struct -{ - - SpiritFunctionalState xAutoAck; /*!< Specifies if the auto ACK feature is used or not. - This parameter can be a value of @ref SpiritFunctionalState */ - SpiritFunctionalState xPiggybacking; /*!< Specifies if the piggybacking feature is used or not. - This parameter can be a value of @ref SpiritFunctionalState */ - StackNMaxReTx xNMaxRetx; /*!< Specifies the number of MAX-Retransmissions. - This parameter can be a value of @ref StackNMaxReTx */ -}PktStackLlpInit; - - - -/** - *@} - */ - - -/** - * @defgroup PktStack_Exported_Constants Pkt STack Exported Constants - * @{ - */ - -#define IS_STACK_LENGTH_WIDTH_BITS IS_PKT_LENGTH_WIDTH_BITS - -/** - *@} - */ - - -/** - * @defgroup PktStack_Exported_Macros Pkt STack Exported Macros - * @{ - */ - -/** - * @brief Macro used to compute the lower part of the packet length - * for Spirit STack packets, to write in the PCKTLEN0 register. - * @param nLength length of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define STACK_BUILD_PCKTLEN0(nLength) BUILD_PCKTLEN0(nLength) - - -/** - * @brief Macro used to compute the upper part of the packet length - * for Spirit STack packets, to write the PCKTLEN1 register. - * @param nLength length of the packet payload. - * This parameter is an uint16_t. - * @retval None. - */ -#define STACK_BUILD_PCKTLEN1(nLength) BUILD_PCKTLEN1(nLength) - - -/** - * @brief Sets the CONTROL length for SPIRIT STack packets. - * @param xControlLength length of CONTROL field in bytes. - * This parameter can be any value of @ref StackControlLength. - * @retval None. - */ -#define SpiritPktStackSetControlLength(xControlLength) SpiritPktCommonSetControlLength(xControlLength) - - -/** - * @brief Returns the CONTROL length for SPIRIT STack packets. - * @param None. - * @retval Control length. - */ -#define SpiritPktStackGetControlLength() SpiritPktCommonGetControlLength() - - -/** - * @brief Sets the PREAMBLE Length mode for SPIRIT STack packets. - * @param xPreambleLength length of PREAMBLE field in bytes. - * This parameter can be any value of @ref StackPreambleLength. - * @retval None. - */ -#define SpiritPktStackSetPreambleLength(xPreambleLength) SpiritPktCommonSetPreambleLength((PktPreambleLength)xPreambleLength) - - -/** - * @brief Returns the PREAMBLE Length mode for SPIRIT STack packets. - * @param None. - * @retval uint8_t Preamble length in bytes. - */ -#define SpiritPktStackGetPreambleLength() SpiritPktCommonGetPreambleLength() - - -/** - * @brief Sets the SYNC Length for SPIRIT STack packets. - * @param xSyncLength length of SYNC field in bytes. - * This parameter can be any value of @ref StackSyncLength. - * @retval None. - */ -#define SpiritPktStackSetSyncLength(xSyncLength) SpiritPktCommonSetSyncLength((PktSyncLength)xSyncLength) - - -/** - * @brief Returns the SYNC Length for SPIRIT STack packets. - * @param None. - * @retval uint8_t Sync length in bytes. - */ -#define SpiritPktStackGetSyncLength() SpiritPktCommonGetSyncLength() - - -/** - * @brief Sets fixed or variable payload length mode for SPIRIT STack packets. - * @param xFixVarLength variable or fixed length. - * PKT_FIXED_LENGTH_VAR -> variable (the length is extracted from the received packet). - * PKT_FIXED_LENGTH_FIX -> fix (the length is set by PCKTLEN0 and PCKTLEN1). - * @retval None. - */ -#define SpiritPktStackSetFixVarLength(xFixVarLength) SpiritPktCommonSetFixVarLength((PktFixVarLength)xFixVarLength) - - -/** - * @brief Enables or Disables the CRC filtering. - * @param xNewState new state for CRC_CHECK. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackFilterOnCrc(xNewState) SpiritPktCommonFilterOnCrc(xNewState) - - -/** - * @brief Returns the CRC filtering bit. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktStackGetFilterOnCrc() SpiritPktCommonGetFilterOnCrc() - - -/** - * @brief Sets the CRC mode for SPIRIT STack packets. - * @param xCrcMode CRC mode. - * This parameter can be any value of @ref StackCrcMode. - * @retval None. - */ -#define SpiritPktStackSetCrcMode(xCrcMode) SpiritPktCommonSetCrcMode((PktCrcMode)xCrcMode) - - -/** - * @brief Returns the CRC mode for SPIRIT packets. - * @param None. - * @retval StackCrcMode Crc mode. - */ -#define SpiritPktStackGetCrcMode() (StackCrcMode)SpiritPktCommonGetCrcMode() - - -/** - * @brief Enables or Disables WHITENING for SPIRIT STack packets. - * @param xNewState new state for WHITENING mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackWhitening(xNewState) SpiritPktCommonWhitening(xNewState) - - -/** - * @brief Enables or Disables FEC for SPIRIT STack packets. - * @param xNewState new state for FEC mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackFec(xNewState) SpiritPktCommonFec(xNewState) - - -/** - * @brief Sets a specific SYNC word for SPIRIT STack packets. - * @param xSyncX SYNC word number to be set. - * This parameter can be any value of @ref StackSyncX. - * @param cSyncWord SYNC word. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetSyncxWord(xSyncX, cSyncWord) SpiritPktCommonSetSyncxWord((PktSyncX)xSyncX,cSyncWord) - - -/** - * @brief Returns a specific SYNC word for SPIRIT STack packets. - * @param xSyncX SYNC word number to be get. - * This parameter can be any value of @ref StackSyncX. - * @retval uint8_t Sync word x. - */ -#define SpiritPktStackGetSyncxWord(xSyncX) SpiritPktCommonGetSyncxWord(xSyncX) - - -/** - * @brief Sets multiple SYNC words for SPIRIT STack packets. - * @param lSyncWords SYNC words to be set with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - * This parameter is a uint32_t. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a @ref StackSyncLength. - * @retval None. - */ -#define SpiritPktStackSetSyncWords(lSyncWords, xSyncLength) SpiritPktCommonSetSyncWords(lSyncWords,(PktSyncLength)xSyncLength) - - -/** - * @brief Returns multiple SYNC words for SPIRIT packets. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a pointer to @ref StackSyncLength. - * @retval uint32_t Sync words. The format of the read 32 bit word is 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - */ -#define SpiritPktStackGetSyncWords(xSyncLength) SpiritPktCommonGetSyncWords((PktSyncLength)xSyncLength) - - -/** - * @brief Returns the SPIRIT variable length width (in number of bits). - * @param None. - * @retval uint8_t Variable length width in bits. - */ -#define SpiritPktStackGetVarLengthWidth() SpiritPktCommonGetVarLengthWidth() - - -/** - * @brief Sets the destination address for the Tx packet. - * @param cAddress destination address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetDestinationAddress(cAddress) SpiritPktCommonSetDestinationAddress(cAddress) - - -/** - * @brief Sets the Rx packet reference source address. The source address extracted from the received packet is masked - * with the source reference mask and then compared to the masked reference value. - * @param cAddress Reference source address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetSourceReferenceAddress(cAddress) SpiritPktCommonSetDestinationAddress(cAddress) - - -/** - * @brief Returns the Rx packet reference source address. The source address extracted from the received packet is masked - * with the source reference mask and then compared to the masked reference value. - * @param cAddress Reference source address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackGetSourceReferenceAddress() SpiritPktCommonGetTransmittedDestAddress() - - -/** - * @brief Returns the settled destination address. - * @param None. - * @retval uint8_t Transmitted destination address. - */ -#define SpiritPktStackGetTransmittedDestAddress() SpiritPktCommonGetTransmittedDestAddress() - - -/** - * @brief Sets the node address. When the filtering on my address is on, if the destination address extracted from the received packet is equal to the content of the - * my address, then the packet is accepted (this is the address of the node). - * @param cAddress Address of the present node. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetMyAddress(cAddress) SpiritPktCommonSetMyAddress(cAddress) - - -/** - * @brief Returns the address of the present node. - * @param None. - * @retval uint8_t My address (address of this node). - */ -#define SpiritPktStackGetMyAddress() SpiritPktCommonGetMyAddress() - - -/** - * @brief Sets the broadcast address. When the broadcast filtering is on, if the destination address extracted from the received packet is equal to the content of the - * BROADCAST_ADDR register, then the packet is accepted. - * @param cAddress Broadcast address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetBroadcastAddress(cAddress) SpiritPktCommonSetBroadcastAddress(cAddress) - - -/** - * @brief Returns the broadcast address. - * @param None. - * @retval uint8_t Broadcast address. - */ -#define SpiritPktStackGetBroadcastAddress() SpiritPktCommonGetBroadcastAddress() - - -/** - * @brief Sets the multicast address. When the multicast filtering is on, if the destination address extracted from the received packet is equal to the content of the - * MULTICAST_ADDR register, then the packet is accepted. - * @param cAddress Multicast address. - * This parameter is an uint8_t. - * @retval None. - */ -#define SpiritPktStackSetMulticastAddress(cAddress) SpiritPktCommonSetMulticastAddress(cAddress) - - -/** - * @brief Returns the multicast address. - * @param None. - * @retval uint8_t Multicast address. - */ -#define SpiritPktStackGetMulticastAddress() SpiritPktCommonGetMulticastAddress() - - -/** - * @brief Sets the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param lMask Control mask. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktStackSetCtrlMask(lMask) SpiritPktCommonSetCtrlMask(lMask) - - -/** - * @brief Returns the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param None. - * @retval uint32_t Control mask. - */ -#define SpiritPktStackGetCtrlMask() SpiritPktCommonGetCtrlMask() - - -/** - * @brief Sets the control field reference. If the bits enabled by the - * CONTROL_MASK match the ones of the control fields extracted from the received packet - * then the packet is accepted. - * @param lReference Control reference. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktStackSetCtrlReference(lReference) SpiritPktCommonSetCtrlReference(lReference) - - -/** - * @brief Returns the control field reference. - * @param None. - * @retval uint32_t Control reference. - */ -#define SpiritPktStackGetCtrlReference() SpiritPktCommonGetCtrlReference() - - -/** - * @brief Sets the TX control field. - * @param lField TX CONTROL FIELD. - * This parameter is an uint32_t. - * @retval None. - */ -#define SpiritPktStackSetTransmittedCtrlField(lField) SpiritPktCommonSetTransmittedCtrlField(lField) - - -/** - * @brief Returns the TX control field. - * @param None. - * @retval uint32_t Control field of the transmitted packet. - */ -#define SpiritPktStackGetTransmittedCtrlField() SpiritPktCommonGetTransmittedCtrlField() - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with TX_SOURCE_ADDRESS. - * @param xNewState new state for DEST_VS_SOURCE_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackFilterOnMyAddress(xNewState) SpiritPktCommonFilterOnMyAddress(xNewState) - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with MULTICAST_ADDRESS. - * @param xNewState new state for DEST_VS_MULTICAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackFilterOnMulticastAddress(xNewState) SpiritPktCommonFilterOnMulticastAddress(xNewState) - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with BROADCAST_ADDRESS. - * @param xNewState new state for DEST_VS_BROADCAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackFilterOnBroadcastAddress(xNewState) SpiritPktCommonFilterOnBroadcastAddress(xNewState) - - -/** - * @brief Returns the enable bit of the my address filtering. - * @param None. - * @retval SpiritFunctionalStateThis parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktStackGetFilterOnMyAddress() SpiritPktCommonGetFilterOnMyAddress(); - - -/** - * @brief Returns the enable bit of the multicast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktStackGetFilterOnMulticastAddress() SpiritPktCommonGetFilterOnMulticastAddress(); - - -/** - * @brief Returns the enable bit of the broadcast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktStackGetFilterOnBroadcastAddress() SpiritPktCommonGetFilterOnBroadcastAddress(); - - -/** - * @brief Returns the control field of the received packet. - * @param None. - * @retval uint32_t Received control field. - */ -#define SpiritPktStackGetReceivedCtrlField() SpiritPktCommonGetReceivedCtrlField() - - -/** - * @brief Returns the CRC field of the received packet. - * @param cCrcFieldVect array in which the CRC field has to be stored. - * This parameter is an uint8_t array of 3 elements. - * @retval None. - */ -#define SpiritPktStackGetReceivedCrcField(cCrcFieldVect) SpiritPktCommonGetReceivedCrcField(cCrcFieldVect) - -/** - * @brief Sets the AUTO ACKNOLEDGEMENT mechanism on the receiver. When the feature is enabled and - * a data packet has been correctly received, then an acknowledgement packet is sent back to the originator of the received - * packet. If the PIGGYBACKING bit is also set, payload data will be read from the FIFO; otherwise an empty packet is sent - * only containing the source and destination addresses and the sequence number of the packet being acknowledged. - * @param xAutoAck new state for autoack. - * This parameter can be: S_ENABLE or S_DISABLE. - * @param xPiggybacking new state for autoack. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackAutoAck(xAutoAck, xPiggybacking) SpiritPktCommonAutoAck(xAutoAck, xPiggybacking) - - -/** - * @brief Sets the AUTO ACKNOLEDGEMENT mechanism on the transmitter. On the transmitter side, the NACK_TX field can be used to require or not an acknowledgment for each individual packet: if - * NACK_TX is set to "1" then acknowledgment will not be required; if NACK_TX is set to "0" then acknowledgment will be - * required. - * @param xNewState new state for TX_AUTOACK. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackRequireAck(xNewState) SpiritPktCommonRequireAck(xNewState) - - -/** - * @brief Sets the TX sequence number to be used to start counting. - * @param cSeqNumberReload new value for Tx seq number reload. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -#define SpiritPktStackSetTransmittedSeqNumberReload(cSeqNumberReload) SpiritPktCommonSetTransmittedSeqNumberReload(cSeqNumberReload) - - -/** - * @brief Sets the max number of automatic retransmission. - * @param xNMaxReTx max number of retransmission. - * This parameter can be any value of @ref PktNMaxReTx. - * @retval None. - */ -#define SpiritPktStackSetNMaxReTx(xNMaxReTx) SpiritPktCommonSetNMaxReTx((PktNMaxReTx)xNMaxReTx) - - -/** - * @brief Returns the max number of automatic retransmission. - * @param None. - * @retval uint8_t Max number of retransmissions. - */ -#define SpiritPktStackGetNMaxReTx() SpiritPktCommonGetNMaxReTx() - - -/** - * @brief Returns the TX ACK request. - * @param None. - * @retval SpiritFunctionalState. - */ -#define SpiritPktStackGetGetTxAckRequest() SpiritPktCommonGetTxAckRequest() - -/** - * @brief Returns the destination address of the received packet. - * @param None. - * @retval uint8_t Destination address of the received packet. - */ -#define SpiritPktStackGetReceivedDestAddress() SpiritPktCommonGetReceivedDestAddress() - - -/** - * @brief Returns the source address of the received packet. - * @param None. - * @retval uint8_t Source address of the received packet. - */ -#define SpiritPktStackGetReceivedSourceAddress() SpiritPktCommonGetReceivedSourceAddress() - - -/** - * @brief Returns the sequence number of the received packet. - * @param None. - * @retval uint8_t Received Sequence number. - */ -#define SpiritPktStackGetReceivedSeqNumber() SpiritPktCommonGetReceivedSeqNumber() - - -/** - * @brief Returns the Nack bit of the received packet - * @param None. - * @retval uint8_t Value of the NAck bit. - */ -#define SpiritPktStackGetReceivedNackRx() SpiritPktCommonGetReceivedNackRx() - - -/** - * @brief Returns the sequence number of the transmitted packet. - * @param None. - * @retval uint8_t Sequence number of the transmitted packet. - */ -#define SpiritPktStackGetTransmittedSeqNumber() SpiritPktCommonGetTransmittedSeqNumber() - - -/** - * @brief Returns the number of retransmission done on the transmitted packet. - * @param None. - * @retval uint8_t Number of retransmissions done until now. - */ -#define SpiritPktStackGetNReTx() SpiritPktCommonGetNReTx() - - -/** - * @brief If enabled RX packet is accepted only if the masked control field matches the - * masked control field reference (CONTROL_MASK & CONTROL_FIELD_REF == CONTROL_MASK & RX_CONTROL_FIELD). - * @param xNewState new state for Control filtering enable bit. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - * @note This filtering control is enabled by default but the control mask is by default set to 0. - * As a matter of fact the user has to enable the control filtering bit after the packet initialization - * because the PktInit routine disables it. - */ -#define SpiritPktStackFilterOnControlField(xNewState) SpiritPktCommonFilterOnControlField(xNewState) - - -/** - * @brief Returns the enable bit of the control field filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -#define SpiritPktStackGetFilterOnControlField() SpiritPktCommonGetFilterOnControlField(); - - -/** - *@} - */ - - -/** - * @defgroup PktStack_Exported_Functions Pkt STack Exported Functions - * @{ - */ - -void SpiritPktStackInit(PktStackInit* pxPktStackInit); -void SpiritPktStackGetInfo(PktStackInit* pxPktStackInit); -void SpiritPktStackAddressesInit(PktStackAddressesInit* pxPktStackAddresses); -void SpiritPktStackGetAddressesInfo(PktStackAddressesInit* pxPktStackAddresses); -void SpiritPktStackLlpInit(PktStackLlpInit* pxPktStackLlpInit); -void SpiritPktStackLlpGetInfo(PktStackLlpInit* pxPktStackLlpInit); -void SpiritPktStackSetFormat(void); -void SpiritPktStackSetPayloadLength(uint16_t nPayloadLength); -uint16_t SpiritPktStackGetPayloadLength(void); -void SpiritPktStackSetVarLengthWidth(uint16_t nMaxPayloadLength, StackControlLength xControlLength); -void SpiritPktStackSetRxSourceMask(uint8_t cMask); -uint8_t SpiritPktStackGetRxSourceMask(void); -uint16_t SpiritPktStackGetReceivedPktLength(void); -void SpiritPktStackFilterOnSourceAddress(SpiritFunctionalState xNewState); -void SpiritPktStackSetAddressLength(void); - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Qi.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Qi.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,300 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Qi.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT QI. - * @details - * - * This module can be used to configure and read some quality indicators - * used by Spirit. - * API to set thresholds and to read values in raw mode or in dBm are - * provided. - * - * <b>Example:</b> - * @code - * - * float rssiValuedBm; - * uint8_t pqiValue, sqiValue; - * - * SpiritQiPqiCheck(S_ENABLE); - * SpiritQiSqiCheck(S_ENABLE); - * - * ... - * - * rssiValueDbm = SpiritQiGetRssidBm(); - * pqiValue = SpiritQiGetPqi(); - * sqiValue = SpiritQiGetSqi(); - * - * ... - * - * @endcode - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_QI_H -#define __SPIRIT_QI_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Qi QI - * @brief Configuration and management of SPIRIT QI. - * @details See the file <i>@ref SPIRIT_Qi.h</i> for more details. - * @{ - */ - -/** - * @defgroup Qi_Exported_Types QI Exported Types - * @{ - */ - - -/** - * @brief PQI threshold value enumeration. - */ -typedef enum -{ - PQI_TH_0=0x00, - PQI_TH_1=0x04, - PQI_TH_2=0x08, - PQI_TH_3=0x0C, - PQI_TH_4=0x10, - PQI_TH_5=0x14, - PQI_TH_6=0x18, - PQI_TH_7=0x1C, - PQI_TH_8=0x20, - PQI_TH_9=0x24, - PQI_TH_10=0x28, - PQI_TH_11=0x2C, - PQI_TH_12=0x30, - PQI_TH_13=0x34, - PQI_TH_14=0x38, - PQI_TH_15=0x3C - -} PqiThreshold; - -#define IS_PQI_THR(VALUE) (VALUE==PQI_TH_0 ||\ - VALUE==PQI_TH_1 ||\ - VALUE==PQI_TH_2 ||\ - VALUE==PQI_TH_3 ||\ - VALUE==PQI_TH_4 ||\ - VALUE==PQI_TH_5 ||\ - VALUE==PQI_TH_6 ||\ - VALUE==PQI_TH_7 ||\ - VALUE==PQI_TH_8 ||\ - VALUE==PQI_TH_9 ||\ - VALUE==PQI_TH_10 ||\ - VALUE==PQI_TH_11 ||\ - VALUE==PQI_TH_12 ||\ - VALUE==PQI_TH_13 ||\ - VALUE==PQI_TH_14 ||\ - VALUE==PQI_TH_15) - -/** - * @brief SQI threshold value enumeration. - */ -typedef enum -{ - SQI_TH_0=0x00, - SQI_TH_1=0x40, - SQI_TH_2=0x80, - SQI_TH_3=0xC0 - -} SqiThreshold; - -#define IS_SQI_THR(VALUE) (VALUE==SQI_TH_0 ||\ - VALUE==SQI_TH_1 ||\ - VALUE==SQI_TH_2 ||\ - VALUE==SQI_TH_3) - - -/** - * @brief RSSI filter gain value enumeration. - */ -typedef enum -{ - RSSI_FG_0=0x00, - RSSI_FG_1=0x10, - RSSI_FG_2=0x20, - RSSI_FG_3=0x30, - RSSI_FG_4=0x40, - RSSI_FG_5=0x50, - RSSI_FG_6=0x60, - RSSI_FG_7=0x70, - RSSI_FG_8=0x80, - RSSI_FG_9=0x90, - RSSI_FG_10=0xA0, - RSSI_FG_11=0xB0, - RSSI_FG_12=0xC0, - RSSI_FG_13=0xD0, - RSSI_FG_14=0xE0, /*<! recommended value */ - RSSI_FG_15=0xF0 - -} RssiFilterGain; - -#define IS_RSSI_FILTER_GAIN(VALUE) (VALUE==RSSI_FG_0 ||\ - VALUE==RSSI_FG_1 ||\ - VALUE==RSSI_FG_2 ||\ - VALUE==RSSI_FG_3 ||\ - VALUE==RSSI_FG_4 ||\ - VALUE==RSSI_FG_5 ||\ - VALUE==RSSI_FG_6 ||\ - VALUE==RSSI_FG_7 ||\ - VALUE==RSSI_FG_8 ||\ - VALUE==RSSI_FG_9 ||\ - VALUE==RSSI_FG_10 ||\ - VALUE==RSSI_FG_11 ||\ - VALUE==RSSI_FG_12 ||\ - VALUE==RSSI_FG_13 ||\ - VALUE==RSSI_FG_14 ||\ - VALUE==RSSI_FG_15) - -/** - * @brief CS mode enumeration. - */ -typedef enum -{ - CS_MODE_STATIC_3DB=0x00, - CS_MODE_DYNAMIC_6DB=0x04, - CS_MODE_DYNAMIC_12DB=0x08, - CS_MODE_DYNAMIC_18DB=0x0C - -} CSMode; - -#define IS_CS_MODE(MODE) (MODE==CS_MODE_STATIC_3DB ||\ - MODE==CS_MODE_DYNAMIC_6DB ||\ - MODE==CS_MODE_DYNAMIC_12DB ||\ - MODE==CS_MODE_DYNAMIC_18DB) - -/** - *@} - */ - - -/** - * @defgroup Qi_Exported_Constants QI Exported Constants - * @{ - */ - -/* range for the RSSI Threshold in dBm */ -#define IS_RSSI_THR_DBM(VALUE) (VALUE>=-130 && VALUE<=-2) - -/** - *@} - */ - - -/** - * @defgroup Qi_Exported_Macros QI Exported Macros - * @{ - */ - -/** - * @brief Macro to obtain the RSSI value in dBm - * @param None. - * @retval RSSI in dBm. - * This parameter is a float. - */ -#define SpiritQiGetRssidBm() (-120.0+((float)(SpiritQiGetRssi()-20))/2) - -/** - *@} - */ - - -/** - * @defgroup Qi_Exported_Functions QI Exported Functions - * @{ - */ - -void SpiritQiPqiCheck(SpiritFunctionalState xNewState); -void SpiritQiSqiCheck(SpiritFunctionalState xNewState); -void SpiritQiSetPqiThreshold(PqiThreshold xPqiThr); -PqiThreshold SpiritQiGetPqiThreshold(void); -void SpiritQiSetSqiThreshold(SqiThreshold xSqiThr); -SqiThreshold SpiritQiGetSqiThreshold(void); -void SpiritQiSetRssiThreshold(uint8_t cRssiThr); -uint8_t SpiritQiGetRssiThreshold(void); -uint8_t SpiritQiComputeRssiThreshold(int cDbmValue); -void SpiritQiSetRssiThresholddBm(int nDbmValue); -uint8_t SpiritQiGetPqi(void); -uint8_t SpiritQiGetSqi(void); -uint8_t SpiritQiGetLqi(void); -SpiritFlagStatus SpiritQiGetCs(void); -uint8_t SpiritQiGetRssi(void); -void SpiritQiSetRssiFilterGain(RssiFilterGain xRssiFg); -RssiFilterGain SpiritQiGetRssiFilterGain(void); -void SpiritQiSetCsMode(CSMode xCsMode); -CSMode SpiritQiGetCsMode(void); -void SpiritQiCsTimeoutMask(SpiritFunctionalState xNewState); -void SpiritQiPqiTimeoutMask(SpiritFunctionalState xNewState); -void SpiritQiSqiTimeoutMask(SpiritFunctionalState xNewState); - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Radio.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Radio.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,636 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Radio.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief This file provides all the low level API to manage Analog and Digital - * radio part of SPIRIT. - * @details - * - * In order to configure the Radio main parameters, the user can - * fit <i>SRadioInit</i> structure the and call the <i>SpiritRadioInit()</i> - * function passing its pointer as an argument. - * - * <b>Example:</b> - * @code - * - * SRadioInit radioInit = { - * 0, // Xtal offset in ppm - * 433.4e6, // base frequency - * 20e3, // channel space - * 0, // channel number - * FSK, // modulation select - * 38400, // datarate - * 20e3, // frequency deviation - * 100.5e3 // channel filter bandwidth - * }; - * - * ... - * - * SpiritRadioInit(&radioInit); - * @endcode - * - * Another important parameter for the radio configuration is the - * transmission power. - * The user is allowed to configure it using the function <i>SpiritRadioSetPALeveldBm()</i> - * which sets the PA LEVEL specified by the first argument to the - * power expressed in dBm by the second parameter. - * - * <b>Example:</b> - * @code - * - * SpiritRadioSetPALeveldBm(0 , 10.0); - * - * @endcode - * - * - * @note The effective power that is set can be a little different from the - * passed argument in dBm because the function performs an approximation. - * - - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_RADIO_H -#define __SPIRIT_RADIO_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" -#include "SPIRIT_Config.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** @defgroup SPIRIT_Radio Radio - * @brief Configuration and management of SPIRIT RF Analog and Digital part. - * @details See the file <i>@ref SPIRIT_Radio.h</i> for more details. - * @{ - */ - - - -/** @defgroup Radio_Exported_Types Radio Exported Types - * @{ - */ - - -/** - * @brief SPIRIT XTAL frequency enumeration - */ -typedef enum -{ - XTAL_FLAG_24_MHz = 0x00, /*!< 24 MHz Xtal selected */ - XTAL_FLAG_26_MHz = 0x01 /*!< 26 MHz Xtal selected */ - -}XtalFlag; - - -#define IS_XTAL_FLAG(FLAG) (((FLAG) == XTAL_FLAG_24_MHz) || \ - ((FLAG) == XTAL_FLAG_26_MHz)) - -/** - * @brief SPIRIT Band enumeration - */ -typedef enum -{ - HIGH_BAND = 0x00, /*!< High_Band selected: from 779 MHz to 915 MHz */ - MIDDLE_BAND = 0x01, /*!< Middle Band selected: from 387 MHz to 470 MHz */ - LOW_BAND = 0x02, /*!< Low Band selected: from 300 MHz to 348 MHz */ - VERY_LOW_BAND = 0x03 /*!< Vary low Band selected: from 150 MHz to 174 MHz */ -}BandSelect; - - -#define IS_BAND_SELECTED(BAND) ((BAND == HIGH_BAND) || \ - (BAND == MIDDLE_BAND) || \ - (BAND == LOW_BAND) || \ - (BAND == VERY_LOW_BAND)) - -/** - * @brief SPIRIT Modulation enumeration - */ -typedef enum -{ - FSK = 0x00, /*!< 2-FSK modulation selected */ - GFSK_BT05 = 0x50, /*!< GFSK modulation selected with BT=0.5 */ - GFSK_BT1 = 0x10, /*!< GFSK modulation selected with BT=1 */ - ASK_OOK = 0x20, /*!< ASK or OOK modulation selected. ASK will use power ramping */ - MSK = 0x30 /*!< MSK modulation selected */ - -}ModulationSelect; - - -#define IS_MODULATION_SELECTED(MOD) (((MOD) == FSK) || \ - ((MOD) == GFSK_BT05) || \ - ((MOD) == GFSK_BT1) || \ - ((MOD) == ASK_OOK) || \ - ((MOD) == MSK)) - - -/** - * @brief SPIRIT PA additional load capacitors bank enumeration - */ -typedef enum -{ - LOAD_0_PF = PA_POWER0_CWC_0, /*!< No additional PA load capacitor */ - LOAD_1_2_PF = PA_POWER0_CWC_1_2P, /*!< 1.2pF additional PA load capacitor */ - LOAD_2_4_PF = PA_POWER0_CWC_2_4P, /*!< 2.4pF additional PA load capacitor */ - LOAD_3_6_PF = PA_POWER0_CWC_3_6P /*!< 3.6pF additional PA load capacitor */ - -}PALoadCapacitor; - -#define IS_PA_LOAD_CAP(CWC) (((CWC) == LOAD_0_PF) || \ - ((CWC) == LOAD_1_2_PF) || \ - ((CWC) == LOAD_2_4_PF) || \ - ((CWC) == LOAD_3_6_PF)) - - -/** - * @brief SPIRIT AFC Mode selection - */ -typedef enum -{ - AFC_SLICER_CORRECTION = AFC2_AFC_MODE_SLICER, /*!< AFC loop closed on slicer */ - AFC_2ND_IF_CORRECTION = AFC2_AFC_MODE_MIXER /*!< AFC loop closed on 2nd conversion stage */ - -}AFCMode; - -#define IS_AFC_MODE(MODE) ((MODE) == AFC_SLICER_CORRECTION || (MODE) == AFC_2ND_IF_CORRECTION) - - -/** - * @brief SPIRIT AGC Mode selection - */ -typedef enum -{ - AGC_LINEAR_MODE = AGCCTRL0_AGC_MODE_LINEAR, /*!< AGC works in linear mode */ - AGC_BINARY_MODE = AGCCTRL0_AGC_MODE_BINARY /*!< AGC works in binary mode */ - -}AGCMode; - -#define IS_AGC_MODE(MODE) ((MODE) == AGC_LINEAR_MODE || (MODE) == AGC_BINARY_MODE) - - -/** - * @brief SPIRIT Clock Recovery Mode selection - */ -typedef enum -{ - CLK_REC_PLL = FDEV0_CLOCK_REG_ALGO_SEL_PLL, /*!< PLL alogrithm for clock recovery */ - CLK_REC_DLL = FDEV0_CLOCK_REG_ALGO_SEL_DLL /*!< DLL alogrithm for clock recovery */ - -}ClkRecMode; - -#define IS_CLK_REC_MODE(MODE) ((MODE) == CLK_REC_PLL || (MODE) == CLK_REC_DLL) - - -/** - * @brief SPIRIT Postfilter length - */ -typedef enum -{ - PSTFLT_LENGTH_8 = 0x00, /*!< Postfilter length is 8 symbols */ - PSTFLT_LENGTH_16 = 0x10 /*!< Postfilter length is 16 symbols */ - -}PstFltLength; - -#define IS_PST_FLT_LENGTH(LENGTH) ((LENGTH) == PSTFLT_LENGTH_8 || (LENGTH) == PSTFLT_LENGTH_16) - - -/** - * @brief SPIRIT OOK Peak Decay - */ -typedef enum -{ - FAST_DECAY = 0x00, /*!< Peak decay control for OOK: fast decay */ - MEDIUM_FAST_DECAY = 0x01, /*!< Peak decay control for OOK: medium_fast decay */ - MEDIUM_SLOW_DECAY = 0x02, /*!< Peak decay control for OOK: medium_fast decay */ - SLOW_DECAY = 0x03 /*!< Peak decay control for OOK: slow decay */ - -}OokPeakDecay; - -#define IS_OOK_PEAK_DECAY(DECAY) (((DECAY) == FAST_DECAY) ||\ - ((DECAY) == MEDIUM_FAST_DECAY) ||\ - ((DECAY) == MEDIUM_SLOW_DECAY) ||\ - ((DECAY) == SLOW_DECAY)) - - -/** - * @brief SPIRIT Radio Init structure definition - */ -typedef struct -{ - int16_t nXtalOffsetPpm; /*!< Specifies the offset frequency (in ppm) - to compensate crystal inaccuracy expressed - as signed value.*/ - - uint32_t lFrequencyBase; /*!< Specifies the base carrier frequency (in Hz), - i.e. the carrier frequency of channel #0. - This parameter can be in one of the following ranges: - High_Band: from 779 MHz to 915 MHz - Middle Band: from 387 MHz to 470 MHz - Low Band: from 300 MHz to 348 MHz */ - uint32_t nChannelSpace; /*!< Specifies the channel spacing expressed in Hz. - The channel spacing is expressed as: - NxFREQUENCY_STEPS, where FREQUENCY STEPS - is F_Xo/2^15. - This parameter can be in the range: [0, F_Xo/2^15*255] Hz */ - uint8_t cChannelNumber; /*!< Specifies the channel number. This value - is multiplied by the channel spacing and - added to synthesizer base frequency to - generate the actual RF carrier frequency */ - ModulationSelect xModulationSelect; /*!< Specifies the modulation. This - parameter can be any value of - @ref ModulationSelect */ - uint32_t lDatarate; /*!< Specifies the datarate expressed in bps. - This parameter can be in the range between - 100 bps and 500 kbps */ - uint32_t lFreqDev; /*!< Specifies the frequency deviation expressed in Hz. - This parameter can be in the range: [F_Xo*8/2^18, F_Xo*7680/2^18] Hz */ - uint32_t lBandwidth; /*!< Specifies the channel filter bandwidth - expressed in Hz. This parameter can be - in the range between 1100 and 800100 Hz */ - -}SRadioInit; - -/** - * @} - */ - - - -/** @defgroup Radio_Exported_Constants Radio Exported Constants - * @{ - */ - -/** @defgroup Radio_Band - * @{ - */ - -#define FBASE_DIVIDER 262144 /*!< 2^18 factor dividing fxo in fbase formula */ - -#define HIGH_BAND_FACTOR 6 /*!< Band select factor for high band. Factor B in the equation 2 */ -#define MIDDLE_BAND_FACTOR 12 /*!< Band select factor for middle band. Factor B in the equation 2 */ -#define LOW_BAND_FACTOR 16 /*!< Band select factor for low band. Factor B in the equation 2 */ -#define VERY_LOW_BAND_FACTOR 32 /*!< Band select factor for very low band. Factor B in the equation 2 */ - -#define HIGH_BAND_LOWER_LIMIT 778000000 /*!< Lower limit of the high band: 779 MHz */ -#define HIGH_BAND_UPPER_LIMIT 957100000 /*!< Upper limit of the high band: 956 MHz */ -#define MIDDLE_BAND_LOWER_LIMIT 386000000 /*!< Lower limit of the middle band: 387 MHz */ -#define MIDDLE_BAND_UPPER_LIMIT 471100000 /*!< Upper limit of the middle band: 470 MHz */ -#define LOW_BAND_LOWER_LIMIT 299000000 /*!< Lower limit of the low band: 300 MHz */ -#define LOW_BAND_UPPER_LIMIT 349100000 /*!< Upper limit of the low band: 348 MHz */ -#define VERY_LOW_BAND_LOWER_LIMIT 149000000 /*!< Lower limit of the very low band: 150 MHz */ -#define VERY_LOW_BAND_UPPER_LIMIT 175100000 /*!< Upper limit of the very low band: 174 MHz */ - -#define IS_FREQUENCY_BAND_HIGH(FREQUENCY) ((FREQUENCY)>=HIGH_BAND_LOWER_LIMIT && \ - (FREQUENCY)<=HIGH_BAND_UPPER_LIMIT) - -#define IS_FREQUENCY_BAND_MIDDLE(FREQUENCY) ((FREQUENCY)>=MIDDLE_BAND_LOWER_LIMIT && \ - (FREQUENCY)<=MIDDLE_BAND_UPPER_LIMIT) - -#define IS_FREQUENCY_BAND_LOW(FREQUENCY) ((FREQUENCY)>=LOW_BAND_LOWER_LIMIT && \ - (FREQUENCY)<=LOW_BAND_UPPER_LIMIT) - -#define IS_FREQUENCY_BAND_VERY_LOW(FREQUENCY) ((FREQUENCY)>=VERY_LOW_BAND_LOWER_LIMIT && \ - (FREQUENCY)<=VERY_LOW_BAND_UPPER_LIMIT) - -#define IS_FREQUENCY_BAND(FREQUENCY) (IS_FREQUENCY_BAND_HIGH(FREQUENCY)|| \ - IS_FREQUENCY_BAND_MIDDLE(FREQUENCY)|| \ - IS_FREQUENCY_BAND_LOW(FREQUENCY)|| \ - IS_FREQUENCY_BAND_VERY_LOW(FREQUENCY)) - -/** - * @} - */ - - -/** @defgroup Radio_IF_Offset Radio IF Offset - * @{ - */ -#define IF_OFFSET_ANA(F_Xo) (lroundf(480140.0/(F_Xo)*12288-64.0)) /*!< It represents the IF_OFFSET_ANA in order - to have an intermediate frequency of 480 kHz */ -/** - * @} - */ - - -/** @defgroup Radio_FC_Offset Radio FC Offset - * @{ - */ -#define F_OFFSET_DIVIDER 262144 /*!< 2^18 factor dividing fxo in foffset formula */ -#define PPM_FACTOR 1000000 /*!< 10^6 factor to use with Xtal_offset_ppm */ - - -#define F_OFFSET_LOWER_LIMIT(F_Xo) ((-(int32_t)F_Xo)/F_OFFSET_DIVIDER*2048) -#define F_OFFSET_UPPER_LIMIT(F_Xo) ((int32_t)(F_Xo/F_OFFSET_DIVIDER*2047)) - -#define IS_FREQUENCY_OFFSET(OFFSET, F_Xo) (OFFSET>=F_OFFSET_LOWER_LIMIT(F_Xo) && OFFSET<=F_OFFSET_UPPER_LIMIT(F_Xo)) - - -/** - * @} - */ - - -/** @defgroup Radio_Channel_Space Radio Channel Space - * @{ - */ - - -#define CHSPACE_DIVIDER 32768 /*!< 2^15 factor dividing fxo in channel space formula */ - -#define IS_CHANNEL_SPACE(CHANNELSPACE, F_Xo) (CHANNELSPACE<=(F_Xo/32768*255)) - - - - - -/** - * @} - */ - - -/** @defgroup Radio_Datarate Radio Datarate - * @{ - */ -#define MINIMUM_DATARATE 100 /*!< Minimum datarate supported by SPIRIT1 100 bps */ -#define MAXIMUM_DATARATE 510000 /*!< Maximum datarate supported by SPIRIT1 500 kbps */ - -#define IS_DATARATE(DATARATE) (DATARATE>=MINIMUM_DATARATE && DATARATE<=MAXIMUM_DATARATE) - -/** - * @} - */ - - -/** @defgroup Radio_Frequency_Deviation Radio Frequency Deviation - * @{ - */ -#define F_DEV_MANTISSA_UPPER_LIMIT 7 /*!< Maximum value for the mantissa in frequency deviation formula */ -#define F_DEV_EXPONENT_UPPER_LIMIT 9 /*!< Maximum value for the exponent in frequency deviation formula */ - -#define F_DEV_LOWER_LIMIT(F_Xo) (F_Xo>>16) -#define F_DEV_UPPER_LIMIT(F_Xo) ((F_Xo*15)>>10) - -#define IS_F_DEV(FDEV,F_Xo) (FDEV>=F_DEV_LOWER_LIMIT(F_Xo) && FDEV<=F_DEV_UPPER_LIMIT(F_Xo)) - - -/** - * @} - */ - - -/** @defgroup Radio_Channel_Bandwidth Radio Channel Bandwidth - * @{ - */ -#define CH_BW_LOWER_LIMIT(F_Xo) 1100*(F_Xo/1000000)/26 /*!< Minimum value of the channel filter bandwidth */ -#define CH_BW_UPPER_LIMIT(F_Xo) 800100*(F_Xo/1000000)/26 /*!< Maximum value of the channel filter bandwidth */ - -#define IS_CH_BW(BW,F_Xo) ((BW)>=CH_BW_LOWER_LIMIT(F_Xo) && (BW)<=CH_BW_UPPER_LIMIT(F_Xo)) - -/** - * @} - */ - - -/** @defgroup Radio_Power_Amplifier Radio Power Amplifier - * @{ - */ - -#define IS_PA_MAX_INDEX(INDEX) ((INDEX)<=7) -#define IS_PAPOWER_DBM(PATABLE) ((PATABLE)>= (-31) && (PATABLE)<=(12)) -#define IS_PAPOWER(PATABLE) ((PATABLE)<=90) -#define IS_PA_STEP_WIDTH(WIDTH) ((WIDTH)>=1 && (WIDTH)<=4) - -/** - * @} - */ - - -/** @defgroup Radio_Automatic_Frequency_Correction Radio Automatic Frequency Correction - * @{ - */ - -#define IS_AFC_FAST_GAIN(GAIN) ((GAIN)<=15) -#define IS_AFC_SLOW_GAIN(GAIN) ((GAIN)<=15) -#define IS_AFC_PD_LEAKAGE(LEAKAGE) ((LEAKAGE)<=31) - -/** - * @} - */ - -/** @defgroup Radio_Automatic_Gain_Control Radio Automatic Gain Control - * @{ - */ - -#define AGC_MEASURE_TIME_UPPER_LIMIT_US(F_Xo) (393216.0/F_Xo) - -#define IS_AGC_MEASURE_TIME_US(TIME, F_Xo) (TIME<=AGC_MEASURE_TIME_UPPER_LIMIT_US(F_Xo)) - -#define IS_AGC_MEASURE_TIME(TIME) (TIME<=15) - -#define AGC_HOLD_TIME_UPPER_LIMIT_US(F_Xo) (756.0/F_Xo) - -#define IS_AGC_HOLD_TIME_US(TIME,F_Xo) (TIME<=AGC_HOLD_TIME_UPPER_LIMIT_US(F_Xo)) - - -#define IS_AGC_HOLD_TIME(TIME) (TIME<=63) - -#define IS_AGC_THRESHOLD(THRESHOLD) (THRESHOLD<=15) - -/** - * @} - */ - - -/** @defgroup Radio_Clock_Recovery Radio Clock Recovery - * @{ - */ - -#define IS_CLK_REC_P_GAIN(GAIN) ((GAIN)<=7) -#define IS_CLK_REC_I_GAIN(GAIN) ((GAIN)<=15) - -/** - * @} - */ - -/** - * @} - */ - - - -/** @defgroup Radio_Exported_Macros Radio Exported Macros - * @{ - */ - - -/** - * @} - */ - -/** @defgroup Radio_Exported_Functions Radio Exported Functions - * @{ - */ - -uint8_t SpiritRadioInit(SRadioInit* pxSRadioInitStruct); -void SpiritRadioGetInfo(SRadioInit* pxSRadioInitStruct); -void SpiritRadioSetXtalFlag(XtalFlag xXtal); -XtalFlag SpiritRadioGetXtalFlag(void); -uint8_t SpiritRadioSearchWCP(uint32_t lFc); -void SpiritRadioSetSynthWord(uint32_t lSynthWord); -uint32_t SpiritRadioGetSynthWord(void); -void SpiritRadioSetBand(BandSelect xBand); -BandSelect SpiritRadioGetBand(void); -void SpiritRadioSetChannel(uint8_t cChannel); -uint8_t SpiritRadioGetChannel(void); -void SpiritRadioSetChannelSpace(uint32_t lChannelSpace); -uint32_t SpiritRadioGetChannelSpace(void); -void SpiritRadioSetFrequencyOffsetPpm(int16_t nXtalPpm); -void SpiritRadioSetFrequencyOffset(int32_t lFOffset); -int32_t SpiritRadioGetFrequencyOffset(void); -void SpiritRadioVcoCalibrationWAFB(SpiritFunctionalState xNewstate); -uint8_t SpiritRadioSetFrequencyBase(uint32_t lFBase); -uint32_t SpiritRadioGetFrequencyBase(void); -uint32_t SpiritRadioGetCenterFrequency(void); -void SpiritRadioSearchDatarateME(uint32_t lDatarate, uint8_t* pcM, uint8_t* pcE); -void SpiritRadioSearchFreqDevME(uint32_t lFDev, uint8_t* pcM, uint8_t* pcE); -void SpiritRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t* pcM, uint8_t* pcE); -void SpiritRadioSetDatarate(uint32_t lDatarate); -uint32_t SpiritRadioGetDatarate(void); -void SpiritRadioSetFrequencyDev(uint32_t lFDev); -uint32_t SpiritRadioGetFrequencyDev(void); -void SpiritRadioSetChannelBW(uint32_t lBandwidth); -uint32_t SpiritRadioGetChannelBW(void); -void SpiritRadioSetModulation(ModulationSelect xModulation); -ModulationSelect SpiritRadioGetModulation(void); -void SpiritRadioCWTransmitMode(SpiritFunctionalState xNewState); -void SpiritRadioSetOokPeakDecay(OokPeakDecay xOokDecay); -OokPeakDecay SpiritRadioGetOokPeakDecay(void); -uint8_t SpiritRadioGetdBm2Reg(uint32_t lFBase, float fPowerdBm); -float SpiritRadioGetReg2dBm(uint32_t lFBase, uint8_t cPowerReg); -void SpiritRadioSetPATabledBm(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, float* pfPAtabledBm); -void SpiritRadioGetPATabledBm(uint8_t* pcPALevelMaxIndex, float* pfPAtabledBm); -void SpiritRadioSetPATable(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, uint8_t* pcPAtable); -void SpiritRadioGetPATable(uint8_t* pcPALevelMaxIndex, uint8_t* pcPAtable); -void SpiritRadioSetPALeveldBm(uint8_t cIndex, float fPowerdBm); -float SpiritRadioGetPALeveldBm(uint8_t cIndex); -void SpiritRadioSetPALevel(uint8_t cIndex, uint8_t cPower); -uint8_t SpiritRadioGetPALevel(uint8_t cIndex); -void SpiritRadioSetPACwc(PALoadCapacitor xCLoad); -PALoadCapacitor SpiritRadioGetPACwc(void); -void SpiritRadioSetPALevelMaxIndex(uint8_t cIndex); -uint8_t SpiritRadioGetPALevelMaxIndex(void); -void SpiritRadioSetPAStepWidth(uint8_t cWidth); -uint8_t SpiritRadioGetPAStepWidth(void); -void SpiritRadioPARamping(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritRadioGetPARamping(void); -void SpiritRadioAFC(SpiritFunctionalState xNewState); -void SpiritRadioAFCFreezeOnSync(SpiritFunctionalState xNewState); -void SpiritRadioSetAFCMode(AFCMode xMode); -AFCMode SpiritRadioGetAFCMode(void); -void SpiritRadioSetAFCPDLeakage(uint8_t cLeakage); -uint8_t SpiritRadioGetAFCPDLeakage(void); -void SpiritRadioSetAFCFastPeriod(uint8_t cLength); -uint8_t SpiritRadioGetAFCFastPeriod(void); -void SpiritRadioSetAFCFastGain(uint8_t cGain); -uint8_t SpiritRadioGetAFCFastGain(void); -void SpiritRadioSetAFCSlowGain(uint8_t cGain); -uint8_t SpiritRadioGetAFCSlowGain(void); -int8_t SpiritRadioGetAFCCorrectionReg(void); -int32_t SpiritRadioGetAFCCorrectionHz(void); -void SpiritRadioAGC(SpiritFunctionalState xNewState); -void SpiritRadioSetAGCMode(AGCMode xMode); -AGCMode SpiritRadioGetAGCMode(void); -void SpiritRadioAGCFreezeOnSteady(SpiritFunctionalState xNewState); -void SpiritRadioAGCFreezeOnSync(SpiritFunctionalState xNewState); -void SpiritRadioAGCStartMaxAttenuation(SpiritFunctionalState xNewState); -void SpiritRadioSetAGCMeasureTimeUs(uint16_t nTime); -uint16_t SpiritRadioGetAGCMeasureTimeUs(void); -void SpiritRadioSetAGCMeasureTime(uint8_t cTime); -uint8_t SpiritRadioGetAGCMeasureTime(void); -void SpiritRadioSetAGCHoldTimeUs(uint8_t cTime); -uint8_t SpiritRadioGetAGCHoldTimeUs(void); -void SpiritRadioSetAGCHoldTime(uint8_t cTime); -uint8_t SpiritRadioGetAGCHoldTime(void); -void SpiritRadioSetAGCHighThreshold(uint8_t cHighThreshold); -uint8_t SpiritRadioGetAGCHighThreshold(void); -void SpiritRadioSetAGCLowThreshold(uint8_t cLowThreshold); -uint8_t SpiritRadioGetAGCLowThreshold(void); -void SpiritRadioSetClkRecMode(ClkRecMode xMode); -ClkRecMode SpiritRadioGetClkRecMode(void); -void SpiritRadioSetClkRecPGain(uint8_t cPGain); -uint8_t SpiritRadioGetClkRecPGain(void); -void SpiritRadioSetClkRecIGain(uint8_t cIGain); -uint8_t SpiritRadioGetClkRecIGain(void); -void SpiritRadioSetClkRecPstFltLength(PstFltLength xLength); -PstFltLength SpiritRadioGetClkRecPstFltLength(void); -void SpiritRadioCsBlanking(SpiritFunctionalState xNewState); -void SpiritRadioPersistenRx(SpiritFunctionalState xNewState); -uint32_t SpiritRadioGetXtalFrequency(void); -void SpiritRadioSetXtalFrequency(uint32_t lXtalFrequency); -void SpiritRadioSetRefDiv(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritRadioGetRefDiv(void); -void SpiritRadioSetDigDiv(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritRadioGetDigDiv(void); -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Regs.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Regs.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3244 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Regs.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief This file contains all the SPIRIT registers address and masks. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT1_REGS_H -#define __SPIRIT1_REGS_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** - * @addtogroup SPIRIT_Registers SPIRIT Registers - * @brief Header file containing all the SPIRIT registers address and masks. - * @details See the file <i>@ref SPIRIT_Regs.h</i> for more details. - * @{ - */ - -/** @defgroup General_Configuration_Registers - * @{ - */ - -/** @defgroup ANA_FUNC_CONF_1_Register - * @{ - */ - -/** - * \brief ANA_FUNC_CONF register 1 - * \code - * Read Write - * Default value: 0x0C - * 7:5 NUM_EN_PIPES: Number of enabled pipes (starting from Data Pipe 0). - * 4:2 GM_CONF[2:0]: Sets the driver gm of the XO at start-up: - * GM_CONF2 | GM_CONF1 | GM_CONF0 | GM [mS] - * ------------------------------------------ - * 0 | 0 | 0 | 13.2 - * 0 | 0 | 1 | 18.2 - * 0 | 1 | 0 | 21.5 - * 0 | 1 | 1 | 25.6 - * 1 | 0 | 0 | 28.8 - * 1 | 0 | 1 | 33.9 - * 1 | 1 | 0 | 38.5 - * 1 | 1 | 1 | 43.0 - * 1:0 SET_BLD_LVL[1:0]: Sets the Battery Level Detector threshold: - * SET_BLD_LVL1 | SET_BLD_LVL0 | Threshold [V] - * ------------------------------------------ - * 0 | 0 | 2.7 - * 0 | 1 | 2.5 - * 1 | 0 | 2.3 - * 1 | 1 | 2.1 - * \endcode - */ - -#define ANA_FUNC_CONF1_BASE ((uint8_t)0x00) /*!< ANA_FUNC_CONF1 Address (R/W) */ - -#define ANA_FUNC_CONF1_NUM_PIPES_MASK ((uint8_t)0xE0) /*!< Mask for number of enabled pipes*/ - -#define ANA_FUNC_CONF1_GMCONF_MASK ((uint8_t)0x1C) /*!< Mask of the GmConf field of ANA_FUNC_CONF1 register (R/W) */ - -#define GM_13_2 ((uint8_t)0x00) /*!< Transconducatance Gm at start-up 13.2 mS */ -#define GM_18_2 ((uint8_t)0x04) /*!< Transconducatance Gm at start-up 18.2 mS */ -#define GM_21_5 ((uint8_t)0x08) /*!< Transconducatance Gm at start-up 21.5 mS */ -#define GM_25_6 ((uint8_t)0x0C) /*!< Transconducatance Gm at start-up 25.6 mS */ -#define GM_28_8 ((uint8_t)0x10) /*!< Transconducatance Gm at start-up 28.8 mS */ -#define GM_33_9 ((uint8_t)0x14) /*!< Transconducatance Gm at start-up 33.9 mS */ -#define GM_38_5 ((uint8_t)0x18) /*!< Transconducatance Gm at start-up 38.5 mS */ -#define GM_43_0 ((uint8_t)0x1C) /*!< Transconducatance Gm at start-up 43.0 mS */ - -#define ANA_FUNC_CONF1_SET_BLD_LVL_MASK ((uint8_t)0x03) /*!< Mask of the SET_BLD_LV field of ANA_FUNC_CONF1 register (R/W) */ - -#define BLD_LVL_2_7 ((uint8_t)0x00) /*!< Sets the Battery Level Detector threshold to 2.7V */ -#define BLD_LVL_2_5 ((uint8_t)0x01) /*!< Sets the Battery Level Detector threshold to 2.5V */ -#define BLD_LVL_2_3 ((uint8_t)0x02) /*!< Sets the Battery Level Detector threshold to 2.3V */ -#define BLD_LVL_2_1 ((uint8_t)0x03) /*!< Sets the Battery Level Detector threshold to 2.1V */ - -/** - * @} - */ - - -/** @defgroup ANA_FUNC_CONF_0_Register - * @{ - */ - -/** - * \brief ANA_FUNC_CONF register 0 - * \code - * Read Write - * Default value: 0xC0 - * 7 Reserved. - * 6 24_26_MHz_SELECT: 1 - 26 MHz configuration - * 0 - 24 MHz configuration - * 5 AES_ON: 1 - AES engine enabled - * 0 - AES engine disabled - * 4 EXT_REF: 1 - Reference signal from XIN pin - * 0 - Reference signal from XO circuit - * 3 HIGH_POWER_MODE: 1 - SET_SMPS_LEVEL word will be set to the value to - * PM_TEST register in RX state, while in TX state it - * will be fixed to 111 (which programs the SMPS output - * at max value 1.8V) - * 0 - SET_SMPS_LEVEL word will hold the value written in the - * PM_TEST register both in RX and TX state - * 2 BROWN_OUT: 1 - Brown_Out Detection enabled - * 0 - Brown_Out Detection disabled - * 1 BATTERY_LEVEL: 1 - Battery level detector enabled - * 0 - Battery level detector disabled - * 0 TS: 1 - Enable the "Temperature Sensor" function - * 0 - Disable the "Temperature Sensor" function - * \endcode - */ - - -#define ANA_FUNC_CONF0_BASE ((uint8_t)0x01) /*!< ANA_FUNC_CONF0 Address (R/W) */ - -#define SELECT_24_26_MHZ_MASK ((uint8_t)0x40) /*!< Configure the RCO if using 26 MHz or 24 MHz master clock/reference signal */ -#define AES_MASK ((uint8_t)0x20) /*!< AES engine on/off */ -#define EXT_REF_MASK ((uint8_t)0x10) /*!< Reference signal from XIN pin (oscillator external) or from XO circuit (oscillator internal)*/ -#define HIGH_POWER_MODE_MASK ((uint8_t)0x08) /*!< SET_SMPS_LEVEL word will be set to the value to PM_TEST register - in RX state, while in TX state it will be fixed to 111 - (which programs the SMPS output at max value, 1.8V) */ -#define BROWN_OUT_MASK ((uint8_t)0x04) /*!< Accurate Brown-Out detection on/off */ -#define BATTERY_LEVEL_MASK ((uint8_t)0x02) /*!< Battery level detector circuit on/off */ -#define TEMPERATURE_SENSOR_MASK ((uint8_t)0x01) /*!< The Temperature Sensor (available on GPIO0) on/off */ - -/** - * @} - */ - -/** @defgroup ANT_SELECT_CONF_Register - * @{ - */ - -/** - * \brief ANT_SELECT_CONF register - * \code - * Read Write - * Default value: 0x05 - * - * 7:5 Reserved. - * - * 4 CS_BLANKING: Blank received data if signal is below the CS threshold - * - * 3 AS_ENABLE: Enable antenna switching - * 1 - Enable - * 0 - Disable - * - * 2:0 AS_MEAS_TIME[2:0]: Measurement time according to the formula Tmeas = 24*2^(EchFlt)*2^AS_MEAS_TIME/fxo - * \endcode - */ -#define ANT_SELECT_CONF_BASE ((uint8_t)0x27) /*!< Antenna diversity (works only in static carrier sense mode) */ -#define ANT_SELECT_CS_BLANKING_MASK ((uint8_t)0x10) /*!< CS data blanking on/off */ -#define ANT_SELECT_CONF_AS_MASK ((uint8_t)0x08) /*!< Antenna diversity on/off */ - -/** - * @} - */ - -/** @defgroup DEVICE_INFO1_Register - * @{ - */ - -/** - * \brief DEVICE_INFO1[7:0] registers - * \code - * Default value: 0x01 - * Read - * - * 7:0 PARTNUM[7:0]: Device part number - * \endcode - */ -#define DEVICE_INFO1_PARTNUM ((uint8_t)(0xF0)) /*!< Device part number [7:0] */ - -/** - * @} - */ - -/** @defgroup DEVICE_INFO0_Register - * @{ - */ - -/** - * \brief DEVICE_INFO0[7:0] registers - * \code - * Read - * - * 7:0 VERSION[7:0]: Device version number - * \endcode - */ -#define DEVICE_INFO0_VERSION ((uint8_t)(0xF1)) /*!< Device version [7:0]; (0x55 in CUT1.0) */ - -/** - * @} - */ - - -/** - * @} - */ - - -/** @defgroup GPIO_Registers - * @{ - */ - -/** @defgroup GPIOx_CONF_Registers - * @{ - */ - -/** - * \brief GPIOx registers - * \code - * Read Write - * Default value: 0x03 - * 7:3 GPIO_SELECT[4:0]: Specify the I/O signal. - * GPIO_SELECT[4:0] | I/O | Signal - * ------------------------------------------------ - * 0 | Output | nIRQ - * 0 | Input | TX command - * 1 | Output | POR inverted - * 1 | Input | RX command - * 2 | Output | Wake-Up timer expiration - * 2 | Input | TX data for direct modulation - * 3 | Output | Low Battery Detection - * 3 | Input | Wake-up from external input - * 4 | Output | TX clock output - * 5 | Output | TX state - * 6 | Output | TX FIFO Almost Empty Flag - * 7 | Output | TX FIFO ALmost Full Flag - * 8 | Output | RX data output - * 9 | Output | RX clock output - * 10 | Output | RX state - * 11 | Output | RX FIFO Almost Full Flag - * 12 | Output | RX FIFO Almost Empty Flag - * 13 | Output | Antenna switch - * 14 | Output | Valid preamble detected - * 15 | Output | Sync word detected - * 16 | Output | RSSI above threshold - * 17 | Output | MCU clock - * 18 | Output | TX or RX mode indicator - * 19 | Output | VDD - * 20 | Output | GND - * 21 | Output | External SMPS enable signal - * 22-31 | Not Used | Not Used - * 2 Reserved - * 1:0 GpioMode[1:0]: Specify the mode: - * GPIO_MODE1 | GPIO_MODE0 | MODE - * ------------------------------------------------------------ - * 0 | 0 | Analog (valid only for GPIO_0) - * 0 | 1 | Digital Input - * 1 | 0 | Digital Output Low Power - * 1 | 1 | Digital Output High Power - * - * Note: The Analog mode is used only for temperature sensor indication. This is available only - * on GPIO_0 by setting the TS bit in the ANA_FUNC_CONF_0_Register. - * \endcode - */ - - -#define GPIO3_CONF_BASE ((uint8_t)0x02) /*!< GPIO_3 register address */ -#define GPIO2_CONF_BASE ((uint8_t)0x03) /*!< GPIO_3 register address */ -#define GPIO1_CONF_BASE ((uint8_t)0x04) /*!< GPIO_3 register address */ -#define GPIO0_CONF_BASE ((uint8_t)0x05) /*!< GPIO_3 register address */ - -#define CONF_GPIO_IN_TX_Command ((uint8_t)0x00) /*!< TX command direct from PIN (rising edge, width min=50ns) */ -#define CONF_GPIO_IN_RX_Command ((uint8_t)0x08) /*!< RX command direct from PIN (rising edge, width min=50ns)*/ -#define CONF_GPIO_IN_TX_Data ((uint8_t)0x10) /*!< TX data input for direct modulation */ -#define CONF_GPIO_IN_WKUP_Ext ((uint8_t)0x18) /*!< Wake up from external input */ - -#define CONF_GPIO_OUT_nIRQ ((uint8_t)0x00) /*!< nIRQ (Interrupt Request, active low) , default configuration after POR */ -#define CONF_GPIO_OUT_POR_Inv ((uint8_t)0x08) /*!< POR inverted (active low) */ -#define CONF_GPIO_OUT_WUT_Exp ((uint8_t)0x10) /*!< Wake-Up Timer expiration: 1 when WUT has expired */ -#define CONF_GPIO_OUT_LBD ((uint8_t)0x18) /*!< Low battery detection: 1 when battery is below threshold setting */ -#define CONF_GPIO_OUT_TX_Data ((uint8_t)0x20) /*!< TX data internal clock output (TX data are sampled on the rising edge of it) */ -#define CONF_GPIO_OUT_TX_State ((uint8_t)0x28) /*!< TX state indication: 1 when Spirit1 is transiting in the TX state */ -#define CONF_GPIO_OUT_TX_FIFO_Almost_Empty ((uint8_t)0x30) /*!< TX FIFO Almost Empty Flag */ -#define CONF_GPIO_OUT_TX_FIFO_Amost_Full ((uint8_t)0x38) /*!< TX FIFO Almost Full Flag */ -#define CONF_GPIO_OUT_RX_Data ((uint8_t)0x40) /*!< RX data output */ -#define CONF_GPIO_OUT_RX_Clock ((uint8_t)0x48) /*!< RX clock output (recovered from received data) */ -#define CONF_GPIO_OUT_RX_State ((uint8_t)0x50) /*!< RX state indication: 1 when Spirit1 is transiting in the RX state */ -#define CONF_GPIO_OUT_RX_FIFO_Almost_Full ((uint8_t)0x58) /*!< RX FIFO Almost Full Flag */ -#define CONF_GPIO_OUT_RX_FIFO_Almost_Empty ((uint8_t)0x60) /*!< RX FIFO Almost Empty Flag */ -#define CONF_GPIO_OUT_Antenna_Switch ((uint8_t)0x68) /*!< Antenna switch used for antenna diversity */ -#define CONF_GPIO_OUT_Valid_Preamble ((uint8_t)0x70) /*!< Valid Preamble Detected Flag */ -#define CONF_GPIO_OUT_Sync_Detected ((uint8_t)0x78) /*!< Sync WordSync Word Detected Flag */ -#define CONF_GPIO_OUT_RSSI_Threshold ((uint8_t)0x80) /*!< CCA Assessment Flag */ -#define CONF_GPIO_OUT_MCU_Clock ((uint8_t)0x88) /*!< MCU Clock */ -#define CONF_GPIO_OUT_TX_RX_Mode ((uint8_t)0x90) /*!< TX or RX mode indicator (to enable an external range extender) */ -#define CONF_GPIO_OUT_VDD ((uint8_t)0x98) /*!< VDD (to emulate an additional GPIO of the MCU, programmable by SPI) */ -#define CONF_GPIO_OUT_GND ((uint8_t)0xA0) /*!< GND (to emulate an additional GPIO of the MCU, programmable by SPI) */ -#define CONF_GPIO_OUT_SMPS_Ext ((uint8_t)0xA8) /*!< External SMPS enable signal (active high) */ - -#define CONF_GPIO_MODE_ANALOG ((uint8_t)0x00) /*!< Analog test BUS on GPIO; used only in test mode (except for temperature sensor) */ -#define CONF_GPIO_MODE_DIG_IN ((uint8_t)0x01) /*!< Digital Input on GPIO */ -#define CONF_GPIO_MODE_DIG_OUTL ((uint8_t)0x02) /*!< Digital Output on GPIO (low current) */ -#define CONF_GPIO_MODE_DIG_OUTH ((uint8_t)0x03) /*!< Digital Output on GPIO (high current) */ - -/** - * @} - */ - - -/** @defgroup MCU_CK_CONF_Register - * @{ - */ - -/** - * \brief MCU_CK_CONF register - * \code - * Read Write - * Default value: 0x00 - * 7 Reserved. - * 6:5 CLOCK_TAIL[1:0]: Specifies the number of extra cylces provided before entering in STANDBY state. - * CLOCK_TAIL1 | CLOCK_TAIL0 | Number of Extra Cycles - * ------------------------------------------------------------ - * 0 | 0 | 0 - * 0 | 1 | 64 - * 1 | 0 | 256 - * 1 | 1 | 512 - * 4:1 XO_RATIO[3:0]: Specifies the division ratio when XO oscillator is the clock source - * XO_RATIO[3:0] | Division Ratio - * ----------------------------------- - * 0 | 1 - * 1 | 2/3 - * 2 | 1/2 - * 3 | 1/3 - * 4 | 1/4 - * 5 | 1/6 - * 6 | 1/8 - * 7 | 1/12 - * 8 | 1/16 - * 9 | 1/24 - * 10 | 1/36 - * 11 | 1/48 - * 12 | 1/64 - * 13 | 1/96 - * 14 | 1/128 - * 15 | 1/256 - * 0 RCO_RATIO: Specifies the divsion ratio when RC oscillator is the clock source - * 0 - Division Ratio equal to 0 - * 1 - Division Ratio equal to 1/128 - * \endcode - */ - - -#define MCU_CK_CONF_BASE ((uint8_t)0x06) /*!< MCU Clock Config register address */ - -#define MCU_CK_ENABLE ((uint8_t)0x80) /*!< MCU clock enable bit */ - -#define MCU_CK_CONF_CLOCK_TAIL_0 ((uint8_t)0x00) /*!< 0 extra clock cycles provided to the MCU before switching to STANDBY state */ -#define MCU_CK_CONF_CLOCK_TAIL_64 ((uint8_t)0x20) /*!< 64 extra clock cycles provided to the MCU before switching to STANDBY state */ -#define MCU_CK_CONF_CLOCK_TAIL_256 ((uint8_t)0x40) /*!< 256 extra clock cycles provided to the MCU before switching to STANDBY state */ -#define MCU_CK_CONF_CLOCK_TAIL_512 ((uint8_t)0x60) /*!< 512 extra clock cycles provided to the MCU before switching to STANDBY state */ -#define MCU_CK_CONF_XO_RATIO_1 ((uint8_t)0x00) /*!< XO Clock signal available on the GPIO divided by 1 */ -#define MCU_CK_CONF_XO_RATIO_2_3 ((uint8_t)0x02) /*!< XO Clock signal available on the GPIO divided by 2/3 */ -#define MCU_CK_CONF_XO_RATIO_1_2 ((uint8_t)0x04) /*!< XO Clock signal available on the GPIO divided by 1/2 */ -#define MCU_CK_CONF_XO_RATIO_1_3 ((uint8_t)0x06) /*!< XO Clock signal available on the GPIO divided by 1/3 */ -#define MCU_CK_CONF_XO_RATIO_1_4 ((uint8_t)0x08) /*!< XO Clock signal available on the GPIO divided by 1/4 */ -#define MCU_CK_CONF_XO_RATIO_1_6 ((uint8_t)0x0A) /*!< XO Clock signal available on the GPIO divided by 1/6 */ -#define MCU_CK_CONF_XO_RATIO_1_8 ((uint8_t)0x0C) /*!< XO Clock signal available on the GPIO divided by 1/8 */ -#define MCU_CK_CONF_XO_RATIO_1_12 ((uint8_t)0x0E) /*!< XO Clock signal available on the GPIO divided by 1/12 */ -#define MCU_CK_CONF_XO_RATIO_1_16 ((uint8_t)0x10) /*!< XO Clock signal available on the GPIO divided by 1/16 */ -#define MCU_CK_CONF_XO_RATIO_1_24 ((uint8_t)0x12) /*!< XO Clock signal available on the GPIO divided by 1/24 */ -#define MCU_CK_CONF_XO_RATIO_1_36 ((uint8_t)0x14) /*!< XO Clock signal available on the GPIO divided by 1/36 */ -#define MCU_CK_CONF_XO_RATIO_1_48 ((uint8_t)0x16) /*!< XO Clock signal available on the GPIO divided by 1/48 */ -#define MCU_CK_CONF_XO_RATIO_1_64 ((uint8_t)0x18) /*!< XO Clock signal available on the GPIO divided by 1/64 */ -#define MCU_CK_CONF_XO_RATIO_1_96 ((uint8_t)0x1A) /*!< XO Clock signal available on the GPIO divided by 1/96 */ -#define MCU_CK_CONF_XO_RATIO_1_128 ((uint8_t)0x1C) /*!< XO Clock signal available on the GPIO divided by 1/128 */ -#define MCU_CK_CONF_XO_RATIO_1_192 ((uint8_t)0x1E) /*!< XO Clock signal available on the GPIO divided by 1/196 */ -#define MCU_CK_CONF_RCO_RATIO_1 ((uint8_t)0x00) /*!< RCO Clock signal available on the GPIO divided by 1 */ -#define MCU_CK_CONF_RCO_RATIO_1_128 ((uint8_t)0x01) /*!< RCO Clock signal available on the GPIO divided by 1/128*/ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup Radio_Configuration_Registers - * @{ - */ - - - -/** @defgroup SYNT3_Register - * @{ - */ - -/** - * \brief SYNT3 register - * \code - * Read Write - * Default value: 0x0C - * - * 7:5 WCP[2:0]: Set the charge pump current according to the VCO frequency in RX mode. - * - * VCO Frequency | WCP2 | WCP1 | WCP0 | Charge Pump Current (uA) - * ------------------------------------------------------------------------------------------------------------ - * 4644-4678 | 0 | 0 | 0 | 378.4 - * 4708-4772 | 0 | 0 | 1 | 368.9 - * 4772-4836 | 0 | 1 | 0 | 359.5 - * 4836-4902 | 0 | 1 | 1 | 350 - * 4902-4966 | 1 | 0 | 0 | 340.5 - * 4966-5030 | 1 | 0 | 1 | 331.1 - * 5030-5095 | 1 | 1 | 0 | 321.6 - * 5095-5161 | 1 | 1 | 1 | 312.2 - * 5161-5232 | 0 | 0 | 0 | 378.4 - * 5232-5303 | 0 | 0 | 1 | 368.9 - * 5303-5375 | 0 | 1 | 0 | 359.5 - * 5375-5448 | 0 | 1 | 1 | 350 - * 5448-5519 | 1 | 0 | 0 | 340.5 - * 5519-5592 | 1 | 0 | 1 | 331.1 - * 5592-5663 | 1 | 1 | 0 | 321.6 - * 5663-5736 | 1 | 1 | 1 | 312.2 - * - * - * 4:0 SYNT[25:21]: highest 5 bits of the PLL programmable divider - * The valid range depends on fXO and REFDIV settings; for - * fXO=26MHz - * REFDIV = 0 - SYNT[25:21] = 11...13 - * REFDIV = 1 - SYNT[25:21] = 22 27 - * - * - * \endcode - */ -#define SYNT3_BASE ((uint8_t)0x08) /*!< [4:0] -> SYNT[25:21], highest 5 bits of the PLL programmable divider */ - -#define WCP_CONF_WCP_378UA ((uint8_t)0x00) /*!< Charge pump current nominal value = 378uA [VCO 4644-4708]&[VCO 5161-5232] */ -#define WCP_CONF_WCP_369UA ((uint8_t)0x01) /*!< Charge pump current nominal value = 369uA [VCO 4708-4772]&[VCO 5232-5303] */ -#define WCP_CONF_WCP_359UA ((uint8_t)0x02) /*!< Charge pump current nominal value = 359uA [VCO 4772-4836]&[VCO 5303-5375] */ -#define WCP_CONF_WCP_350UA ((uint8_t)0x03) /*!< Charge pump current nominal value = 350uA [VCO 4836-4902]&[VCO 5375-5448] */ -#define WCP_CONF_WCP_340UA ((uint8_t)0x04) /*!< Charge pump current nominal value = 340uA [VCO 4902-4966]&[VCO 5448-5519] */ -#define WCP_CONF_WCP_331UA ((uint8_t)0x05) /*!< Charge pump current nominal value = 331uA [VCO 4966-5030]&[VCO 5519-5592] */ -#define WCP_CONF_WCP_321UA ((uint8_t)0x06) /*!< Charge pump current nominal value = 321uA [VCO 5030-5095]&[VCO 5592-5563] */ -#define WCP_CONF_WCP_312UA ((uint8_t)0x07) /*!< Charge pump current nominal value = 312uA [VCO 5095-5160]&[VCO 5563-5736] */ - - -/** - * @} - */ - - -/** @defgroup SYNT2_Register - * @{ - */ - -/** - * \brief SYNT2 register - * \code - * Read Write - * Default value: 0x84 - * 7:0 SYNT[20:13]: intermediate bits of the PLL programmable divider. - * - * \endcode - */ - -#define SYNT2_BASE ((uint8_t)0x09) /*!< SYNT[20:13], intermediate bits of the PLL programmable divider */ - -/** - * @} - */ - -/** @defgroup SYNT1_Register - * @{ - */ - -/** - * \brief SYNT1 register - * \code - * Read Write - * Default value: 0xEC - * 7:0 SYNT[12:5]: intermediate bits of the PLL programmable divider. - * - * \endcode - */ - -#define SYNT1_BASE ((uint8_t)0x0A) /*!< SYNT[12:5], intermediate bits of the PLL programmable divider */ - -/** - * @} - */ - -/** @defgroup SYNT0_Register - * @{ - */ - -/** - * \brief SYNT0 register - * \code - * Read Write - * Default value: 0x51 - * 7:3 SYNT[4:0]: lowest bits of the PLL programmable divider. - * 2:0 BS[2:0]: Synthesizer band select. This parameter selects the out-of-loop divide factor of the synthesizer - * according to the formula fxo/(B/2)/D*SYNT/2^18 - * - * BS2 | BS1 | BS0 | value of B - * --------------------------------------------------------------------------- - * 0 | 0 | 1 | 6 - * 0 | 1 | 0 | 8 - * 0 | 1 | 1 | 12 - * 1 | 0 | 0 | 16 - * 1 | 0 | 1 | 32 - * - * \endcode - */ -#define SYNT0_BASE ((uint8_t)0x0B) /*!< [7:3] -> SYNT[4:0], lowest bits of the PLL programmable divider */ - -#define SYNT0_BS_6 ((uint8_t)0x01) /*!< Synthesizer band select (out-of-loop divide factor of the synthesizer)=6 (779-956MHz) */ -#define SYNT0_BS_8 ((uint8_t)0x02) /*!< Synthesizer band select (out-of-loop divide factor of the synthesizer)=8 (387-470MHz)*/ -#define SYNT0_BS_12 ((uint8_t)0x03) /*!< Synthesizer band select (out-of-loop divide factor of the synthesizer)=12 (387-470MHz)*/ -#define SYNT0_BS_16 ((uint8_t)0x04) /*!< Synthesizer band select (out-of-loop divide factor of the synthesizer)=16 (300-348MHz)*/ -#define SYNT0_BS_32 ((uint8_t)0x05) /*!< Synthesizer band select (out-of-loop divide factor of the synthesizer)=32 (150-174MHz)*/ - -/** - * @} - */ - -/** @defgroup CHSPACE_Register - * @{ - */ - -/** - * \brief CHSPACE register - * \code - * Read Write - * Default value: 0xFC - * 7:0 CH_SPACING[7:0]: Channel spacing. From ~793Hz to ~200KHz in 793Hz steps - * (in general, frequency step is fXO/215=26MHz/215~793Hz). - * - * \endcode - */ - -#define CHSPACE_BASE ((uint8_t)0x0C) /*!< Channel spacing. From ~0.8KHz to ~200KHz in (fXO/2^15)Hz (793Hz for 26MHz XO) steps */ - -/** - * @} - */ - - - -/** @defgroup IF_OFFSET_DIG_Register - * @{ - */ - -/** - * \brief IF_OFFSET_DIG register - * \code - * Read Write - * Default value: 0xA3 - * 7:0 IF_OFFSET_DIG[7:0]: Intermediate frequency setting for the digital shift-to-baseband circuits. According to the formula: fIF=fXO*(IF_OFFSET_ANA+64)/(12*2^10)=fCLK*(IF_OFFSET_DIG+64)/(12*2^10) Hz. - * - * \endcode - */ -#define IF_OFFSET_DIG_BASE ((uint8_t)0x0D) /*!< Intermediate frequency fIF=fXO*(IF_OFFSET_ANA+64)/(12*2^10)=fCLK*(IF_OFFSET_DIG+64)/(12*2^10) Hz */ - -/** - * @} - */ - -/** @defgroup IF_OFFSET_ANA_Register - * @{ - */ - -/** - * \brief IF_OFFSET_ANA register - * \code - * Read Write - * Default value: 0xA3 - * 7:0 IF_OFFSET_ANA[7:0]: Intermediate frequency setting for the digital shift-to-baseband circuits. According to the formula: fIF=fXO*(IF_OFFSET_ANA+64)/(12*2^10)=fCLK*(IF_OFFSET_DIG+64)/(12*2^10) Hz. - * - * \endcode - */ -#define IF_OFFSET_ANA_BASE ((uint8_t)0x07) /*!< Intermediate frequency fIF=fXO*(IF_OFFSET_ANA+64)/(12*2^10)=fCLK*(IF_OFFSET_DIG+64)/(12*2^10) Hz */ - - -/** - * @} - */ - -/** @defgroup FC_OFFSET1_Register - * @{ - */ - -/** - * \brief FC_OFFSET1 registers - * \code - * Read Write - * Default value: 0xA3 - * 7:4 Reserved. - * 3:0 FC_OFFSET[11:8]: Carrier offset. This value is the higher part of a 12-bit 2s complement integer - * representing an offset in 99Hz(2) units added/subtracted to the - * carrier frequency set by registers SYNT3 SYNT0. - * This register can be used to set a fixed correction value - * obtained e.g. from crystal measurements. - * - * \endcode - */ -#define FC_OFFSET1_BASE ((uint8_t)0x0E) /*!< [3:0] -> [11:8] Carrier offset (upper part) */ - -/** - * @} - */ - - -/** @defgroup FC_OFFSET0_Register - * @{ - */ - -/** - * \brief FC_OFFSET0 registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 FC_OFFSET[7:0]: Carrier offset. This value is the lower part of a 12-bit 2s complement integer - * representing an offset in 99Hz(2) units added/subtracted to the - * carrier frequency set by registers SYNT3 SYNT0. - * This register can be used to set a fixed correction value - * obtained e.g. from crystal measurements. - * - * \endcode - */ -#define FC_OFFSET0_BASE ((uint8_t)0x0F) /*!< [7:0] -> [7:0] Carrier offset (lower part). This value is a 12-bit 2s complement integer - representing an offset in fXO/2^18 (99Hz for 26 MHz XO) units added/subtracted to the carrier frequency - set by registers SYNT3 SYNT0. Range is +/-200kHz with 26 MHz XO */ -/** - * @} - */ - - -/** @defgroup PA_LEVEL_x_Registers - * @{ - */ - -/** - * \brief PA_POWER_x[8:1] registers - * \code - * Default values from 8 to 1: [0x03, 0x0E, 0x1A, 0x25, 0x35, 0x40, 0x4E, 0x00] - * Read Write - * - * 7 Reserved. - * 6:0 PA_LEVEL_(x-1)[6:0]: Output power level for x-th slot. - * \endcode - */ - -#define PA_POWER8_BASE ((uint8_t)0x10) /*!< PA Power level for 8th slot of PA ramping or ASK modulation */ -#define PA_POWER7_BASE ((uint8_t)0x11) /*!< PA Power level for 7th slot of PA ramping or ASK modulation */ -#define PA_POWER6_BASE ((uint8_t)0x12) /*!< PA Power level for 6th slot of PA ramping or ASK modulation */ -#define PA_POWER5_BASE ((uint8_t)0x13) /*!< PA Power level for 5th slot of PA ramping or ASK modulation */ -#define PA_POWER4_BASE ((uint8_t)0x14) /*!< PA Power level for 4th slot of PA ramping or ASK modulation */ -#define PA_POWER3_BASE ((uint8_t)0x15) /*!< PA Power level for 3rd slot of PA ramping or ASK modulation */ -#define PA_POWER2_BASE ((uint8_t)0x16) /*!< PA Power level for 2nd slot of PA ramping or ASK modulation */ -#define PA_POWER1_BASE ((uint8_t)0x17) /*!< PA Power level for 1st slot of PA ramping or ASK modulation */ - -/** - * @} - */ - -/** @defgroup PA_POWER_CONF_Registers - * @{ - */ - -/** - * \brief PA_POWER_CONF_Registers - * \code - * Default value:0x07 - * Read Write - * - * 7:6 CWC[1:0]: Output stage additional load capacitors bank (to be used to - * optimize the PA for different sub-bands). - * - * CWC1 | CWC0 | Total capacity in pF - * --------------------------------------------------------- - * 0 | 0 | 0 - * 0 | 1 | 1.2 - * 1 | 0 | 2.4 - * 1 | 1 | 3.6 - * - * 5 PA_RAMP_ENABLE: - * 1 - Enable the power ramping - * 0 - Disable the power ramping - * 4:3 PA_RAMP_STEP_WIDTH[1:0]: Step width in bit period - * - * PA_RAMP_STEP_WIDTH1 | PA_RAMP_STEP_WIDTH0 | PA ramping time step - * ------------------------------------------------------------------------------------------- - * 0 | 0 | 1/8 Bit period - * 0 | 1 | 2/8 Bit period - * 1 | 0 | 3/8 Bit period - * 1 | 1 | 4/8 Bit period - * - * 2:0 PA_LEVEL_MAX_INDEX[2:0]: Fixes the MAX PA LEVEL in PA ramping or ASK modulation - * - * \endcode - */ -#define PA_POWER0_BASE ((uint8_t)0x18) /*!< PA ramping settings and additional load capacitor banks used - for PA optimization in different sub bands*/ -#define PA_POWER0_CWC_MASK ((uint8_t)0x20) /*!< Output stage additional load capacitors bank */ -#define PA_POWER0_CWC_0 ((uint8_t)0x00) /*!< No additional PA load capacitor */ -#define PA_POWER0_CWC_1_2P ((uint8_t)0x40) /*!< 1.2pF additional PA load capacitor */ -#define PA_POWER0_CWC_2_4P ((uint8_t)0x80) /*!< 2.4pF additional PA load capacitor */ -#define PA_POWER0_CWC_3_6P ((uint8_t)0xC0) /*!< 3.6pF additional PA load capacitor */ -#define PA_POWER0_PA_RAMP_MASK ((uint8_t)0x20) /*!< The PA power ramping */ -#define PA_POWER0_PA_RAMP_STEP_WIDTH_MASK ((uint8_t)0x20) /*!< The step width */ -#define PA_POWER0_PA_RAMP_STEP_WIDTH_TB_8 ((uint8_t)0x00) /*!< PA ramping time step = 1/8 Bit period*/ -#define PA_POWER0_PA_RAMP_STEP_WIDTH_TB_4 ((uint8_t)0x08) /*!< PA ramping time step = 2/8 Bit period*/ -#define PA_POWER0_PA_RAMP_STEP_WIDTH_3TB_8 ((uint8_t)0x10) /*!< PA ramping time step = 3/8 Bit period*/ -#define PA_POWER0_PA_RAMP_STEP_WIDTH_TB_2 ((uint8_t)0x18) /*!< PA ramping time step = 4/8 Bit period*/ -#define PA_POWER0_PA_LEVEL_MAX_INDEX ((uint8_t)0x20) /*!< Final level for power ramping */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_0 ((uint8_t)0x00) /*!< */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_1 ((uint8_t)0x01) /*!< Fixes the MAX PA LEVEL in PA ramping or ASK modulation */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_2 ((uint8_t)0x02) /*!< */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_3 ((uint8_t)0x03) /*!< _________ */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_4 ((uint8_t)0x04) /*!< PA_LVL2 _| <--| */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_5 ((uint8_t)0x05) /*!< _| | */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_6 ((uint8_t)0x06) /*!< PA_LVL1 _| | */ -#define PA_POWER0_PA_LEVEL_MAX_INDEX_7 ((uint8_t)0x07) /*!< PA_LVL0 _| MAX_INDEX- */ - - - -/** - * @} - */ - - -/** @defgroup MOD1_Register - * @{ - */ - -/** - * \brief MOD1 register - * \code - * Read Write - * Default value: 0x83 - * 7:0 DATARATE_M[7:0]: The Mantissa of the specified data rate - * - * \endcode - */ -#define MOD1_BASE ((uint8_t)0x1A) /*!< The Mantissa of the specified data rate */ - -/** - * @} - */ - -/** @defgroup MOD0_Register - * @{ - */ - -/** - * \brief MOD0 register - * \code - * Read Write - * Default value: 0x1A - * 7 CW: 1 - CW Mode enabled - enables the generation of a continous wave carrier without any modulation - * 0 - CW Mode disabled - * - * 6 BT_SEL: Select BT value for GFSK - * 1 - BT=0.5 - * 0 - BT=1 - * - * 5:4 MOD_TYPE[1:0]: Modulation type - * - * - * MOD_TYPE1 | MOD_TYPE0 | Modulation - * --------------------------------------------------------- - * 0 | 0 | 2-FSK,MSK - * 0 | 1 | GFSK,GMSK - * 1 | 0 | ASK/OOK - * - * 3:0 DATARATE_E[3:0]: The Exponent of the specified data rate - * - * \endcode - */ -#define MOD0_BASE ((uint8_t)0x1B) /*!< Modulation Settings, Exponent of the specified data rate, CW mode*/ - -#define MOD0_MOD_TYPE_2_FSK ((uint8_t)0x00) /*!< Modulation type 2-FSK (MSK if the frequency deviation is identical to a quarter of the data rate) */ -#define MOD0_MOD_TYPE_GFSK ((uint8_t)0x10) /*!< Modulation type GFSK (GMSK if the frequency deviation is identical to a quarter of the data rate) */ -#define MOD0_MOD_TYPE_ASK ((uint8_t)0x20) /*!< Modulation type ASK (OOK the PA is switched off for symbol "0") */ -#define MOD0_MOD_TYPE_MSK ((uint8_t)0x00) /*!< Modulation type MSK (the frequency deviation must be identical to a quarter of the data rate) */ -#define MOD0_MOD_TYPE_GMSK ((uint8_t)0x10) /*!< Modulation type GMSK (the frequency deviation must be identical to a quarter of the data rate) */ -#define MOD0_BT_SEL_BT_MASK ((uint8_t)0x00) /*!< Select the BT = 1 or BT = 0.5 valid only for GFSK or GMSK modulation*/ -#define MOD0_CW ((uint8_t)0x80) /*!< Set the Continous Wave (no modulation) transmit mode */ - -/** - * @} - */ - - -/** @defgroup FDEV0_Register - * @{ - */ - -/** - * \brief FDEV0 register - * \code - * Read Write - * Default value: 0x45 - * 7:4 FDEV_E[3:0]: Exponent of the frequency deviation (allowed values from 0 to 9) - * - * 3 CLOCK_REC_ALGO_SEL: Select PLL or DLL mode for clock recovery - * 1 - DLL mode - * 0 - PLL mode - * - * 2:0 FDEV_M[1:0]: Mantissa of the frequency deviation (allowed values from 0 to 7) - * - * - * \endcode - */ -#define FDEV0_BASE ((uint8_t)0x1C) /*!< Sets the Mantissa and exponent of frequency deviation (frequency separation/2) - and PLL or DLL alogrithm from clock recovery in RX digital demod*/ -#define FDEV0_CLOCK_REG_ALGO_SEL_MASK ((uint8_t)0x08) /*!< Can be DLL or PLL algorithm for clock recovery in RX digital demod (see CLOCKREC reg) */ -#define FDEV0_CLOCK_REG_ALGO_SEL_PLL ((uint8_t)0x00) /*!< Sets PLL alogrithm for clock recovery in RX digital demod (see CLOCKREC reg) */ -#define FDEV0_CLOCK_REG_ALGO_SEL_DLL ((uint8_t)0x08) /*!< Sets DLL alogrithm for clock recovery in RX digital demod (see CLOCKREC reg) */ - -/** - * @} - */ - -/** @defgroup CHFLT_Register - * @{ - */ - -/** - * \brief CHFLT register - * \code - * Read Write - * Default value: 0x23 - * 7:4 CHFLT_M[3:0]: Mantissa of the channel filter BW (allowed values from 0 to 8) - * - * 3:0 CHFLT_E[3:0]: Exponent of the channel filter BW (allowed values from 0 to 9) - * - * M\E | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | - * -----+-------+-------+-------+-------+------+------+------+-----+-----+-----+ - * 0 | 800.1 | 450.9 | 224.7 | 112.3 | 56.1 | 28.0 | 14.0 | 7.0 | 3.5 | 1.8 | - * 1 | 795.1 | 425.9 | 212.4 | 106.2 | 53.0 | 26.5 | 13.3 | 6.6 | 3.3 | 1.7 | - * 2 | 768.4 | 403.2 | 201.1 | 100.5 | 50.2 | 25.1 | 12.6 | 6.3 | 3.1 | 1.6 | - * 3 | 736.8 | 380.8 | 190.0 | 95.0 | 47.4 | 23.7 | 11.9 | 5.9 | 3.0 | 1.5 | - * 4 | 705.1 | 362.1 | 180.7 | 90.3 | 45.1 | 22.6 | 11.3 | 5.6 | 2.8 | 1.4 | - * 5 | 670.9 | 341.7 | 170.6 | 85.3 | 42.6 | 21.3 | 10.6 | 5.3 | 2.7 | 1.3 | - * 6 | 642.3 | 325.4 | 162.4 | 81.2 | 40.6 | 20.3 | 10.1 | 5.1 | 2.5 | 1.3 | - * 7 | 586.7 | 294.5 | 147.1 | 73.5 | 36.7 | 18.4 | 9.2 | 4.6 | 2.3 | 1.2 | - * 8 | 541.4 | 270.3 | 135.0 | 67.5 | 33.7 | 16.9 | 8.4 | 4.2 | 2.1 | 1.1 | - * - * \endcode - */ -#define CHFLT_BASE ((uint8_t)0x1D) /*!< RX Channel Filter Bandwidth */ - -#define CHFLT_800_1 ((uint8_t)0x00) /*!< RX Channel Filter Bandwidth = 800.1 kHz */ -#define CHFLT_795_1 ((uint8_t)0x10) /*!< RX Channel Filter Bandwidth = 795.1 kHz */ -#define CHFLT_768_4 ((uint8_t)0x20) /*!< RX Channel Filter Bandwidth = 768.4 kHz */ -#define CHFLT_736_8 ((uint8_t)0x30) /*!< RX Channel Filter Bandwidth = 736.8 kHz */ -#define CHFLT_705_1 ((uint8_t)0x40) /*!< RX Channel Filter Bandwidth = 705.1 kHz */ -#define CHFLT_670_9 ((uint8_t)0x50) /*!< RX Channel Filter Bandwidth = 670.9 kHz */ -#define CHFLT_642_3 ((uint8_t)0x60) /*!< RX Channel Filter Bandwidth = 642.3 kHz */ -#define CHFLT_586_7 ((uint8_t)0x70) /*!< RX Channel Filter Bandwidth = 586.7 kHz */ -#define CHFLT_541_4 ((uint8_t)0x80) /*!< RX Channel Filter Bandwidth = 541.4 kHz */ -#define CHFLT_450_9 ((uint8_t)0x01) /*!< RX Channel Filter Bandwidth = 450.9 kHz */ -#define CHFLT_425_9 ((uint8_t)0x11) /*!< RX Channel Filter Bandwidth = 425.9 kHz */ -#define CHFLT_403_2 ((uint8_t)0x21) /*!< RX Channel Filter Bandwidth = 403.2 kHz */ -#define CHFLT_380_8 ((uint8_t)0x31) /*!< RX Channel Filter Bandwidth = 380.8 kHz */ -#define CHFLT_362_1 ((uint8_t)0x41) /*!< RX Channel Filter Bandwidth = 362.1 kHz */ -#define CHFLT_341_7 ((uint8_t)0x51) /*!< RX Channel Filter Bandwidth = 341.7 kHz */ -#define CHFLT_325_4 ((uint8_t)0x61) /*!< RX Channel Filter Bandwidth = 325.4 kHz */ -#define CHFLT_294_5 ((uint8_t)0x71) /*!< RX Channel Filter Bandwidth = 294.5 kHz */ -#define CHFLT_270_3 ((uint8_t)0x81) /*!< RX Channel Filter Bandwidth = 270.3 kHz */ -#define CHFLT_224_7 ((uint8_t)0x02) /*!< RX Channel Filter Bandwidth = 224.7 kHz */ -#define CHFLT_212_4 ((uint8_t)0x12) /*!< RX Channel Filter Bandwidth = 212.4 kHz */ -#define CHFLT_201_1 ((uint8_t)0x22) /*!< RX Channel Filter Bandwidth = 201.1 kHz */ -#define CHFLT_190 ((uint8_t)0x32) /*!< RX Channel Filter Bandwidth = 190.0 kHz */ -#define CHFLT_180_7 ((uint8_t)0x42) /*!< RX Channel Filter Bandwidth = 180.7 kHz */ -#define CHFLT_170_6 ((uint8_t)0x52) /*!< RX Channel Filter Bandwidth = 170.6 kHz */ -#define CHFLT_162_4 ((uint8_t)0x62) /*!< RX Channel Filter Bandwidth = 162.4 kHz */ -#define CHFLT_147_1 ((uint8_t)0x72) /*!< RX Channel Filter Bandwidth = 147.1 kHz */ -#define CHFLT_135 ((uint8_t)0x82) /*!< RX Channel Filter Bandwidth = 135.0 kHz */ -#define CHFLT_112_3 ((uint8_t)0x03) /*!< RX Channel Filter Bandwidth = 112.3 kHz */ -#define CHFLT_106_2 ((uint8_t)0x13) /*!< RX Channel Filter Bandwidth = 106.2 kHz */ -#define CHFLT_100_5 ((uint8_t)0x23) /*!< RX Channel Filter Bandwidth = 100.5 kHz */ -#define CHFLT_95 ((uint8_t)0x33) /*!< RX Channel Filter Bandwidth = 95.0 kHz */ -#define CHFLT_90_3 ((uint8_t)0x43) /*!< RX Channel Filter Bandwidth = 90.3 kHz */ -#define CHFLT_85_3 ((uint8_t)0x53) /*!< RX Channel Filter Bandwidth = 85.3 kHz */ -#define CHFLT_81_2 ((uint8_t)0x63) /*!< RX Channel Filter Bandwidth = 81.2 kHz */ -#define CHFLT_73_5 ((uint8_t)0x73) /*!< RX Channel Filter Bandwidth = 73.5 kHz */ -#define CHFLT_67_5 ((uint8_t)0x83) /*!< RX Channel Filter Bandwidth = 67.5 kHz */ -#define CHFLT_56_1 ((uint8_t)0x04) /*!< RX Channel Filter Bandwidth = 56.1 kHz */ -#define CHFLT_53 ((uint8_t)0x14) /*!< RX Channel Filter Bandwidth = 53.0 kHz */ -#define CHFLT_50_2 ((uint8_t)0x24) /*!< RX Channel Filter Bandwidth = 50.2 kHz */ -#define CHFLT_47_4 ((uint8_t)0x34) /*!< RX Channel Filter Bandwidth = 47.4 kHz */ -#define CHFLT_45_1 ((uint8_t)0x44) /*!< RX Channel Filter Bandwidth = 45.1 kHz */ -#define CHFLT_42_6 ((uint8_t)0x54) /*!< RX Channel Filter Bandwidth = 42.6 kHz */ -#define CHFLT_40_6 ((uint8_t)0x64) /*!< RX Channel Filter Bandwidth = 40.6 kHz */ -#define CHFLT_36_7 ((uint8_t)0x74) /*!< RX Channel Filter Bandwidth = 36.7 kHz */ -#define CHFLT_33_7 ((uint8_t)0x84) /*!< RX Channel Filter Bandwidth = 33.7 kHz */ -#define CHFLT_28 ((uint8_t)0x05) /*!< RX Channel Filter Bandwidth = 28.0 kHz */ -#define CHFLT_26_5 ((uint8_t)0x15) /*!< RX Channel Filter Bandwidth = 26.5 kHz */ -#define CHFLT_25_1 ((uint8_t)0x25) /*!< RX Channel Filter Bandwidth = 25.1 kHz */ -#define CHFLT_23_7 ((uint8_t)0x35) /*!< RX Channel Filter Bandwidth = 23.7 kHz */ -#define CHFLT_22_6 ((uint8_t)0x45) /*!< RX Channel Filter Bandwidth = 22.6 kHz */ -#define CHFLT_21_3 ((uint8_t)0x55) /*!< RX Channel Filter Bandwidth = 21.3 kHz */ -#define CHFLT_20_3 ((uint8_t)0x65) /*!< RX Channel Filter Bandwidth = 20.3 kHz */ -#define CHFLT_18_4 ((uint8_t)0x75) /*!< RX Channel Filter Bandwidth = 18.4 kHz */ -#define CHFLT_16_9 ((uint8_t)0x85) /*!< RX Channel Filter Bandwidth = 16.9 kHz */ -#define CHFLT_14 ((uint8_t)0x06) /*!< RX Channel Filter Bandwidth = 14.0 kHz */ -#define CHFLT_13_3 ((uint8_t)0x16) /*!< RX Channel Filter Bandwidth = 13.3 kHz */ -#define CHFLT_12_6 ((uint8_t)0x26) /*!< RX Channel Filter Bandwidth = 12.6 kHz */ -#define CHFLT_11_9 ((uint8_t)0x36) /*!< RX Channel Filter Bandwidth = 11.9 kHz */ -#define CHFLT_11_3 ((uint8_t)0x46) /*!< RX Channel Filter Bandwidth = 11.3 kHz */ -#define CHFLT_10_6 ((uint8_t)0x56) /*!< RX Channel Filter Bandwidth = 10.6 kHz */ -#define CHFLT_10_1 ((uint8_t)0x66) /*!< RX Channel Filter Bandwidth = 10.1 kHz */ -#define CHFLT_9_2 ((uint8_t)0x76) /*!< RX Channel Filter Bandwidth = 9.2 kHz */ -#define CHFLT_8_4 ((uint8_t)0x86) /*!< RX Channel Filter Bandwidth = 8.4 kHz */ -#define CHFLT_7 ((uint8_t)0x07) /*!< RX Channel Filter Bandwidth = 7.0 kHz */ -#define CHFLT_6_6 ((uint8_t)0x17) /*!< RX Channel Filter Bandwidth = 6.6 kHz */ -#define CHFLT_6_3 ((uint8_t)0x27) /*!< RX Channel Filter Bandwidth = 6.3 kHz */ -#define CHFLT_5_9 ((uint8_t)0x37) /*!< RX Channel Filter Bandwidth = 5.9 kHz */ -#define CHFLT_5_6 ((uint8_t)0x47) /*!< RX Channel Filter Bandwidth = 5.6 kHz */ -#define CHFLT_5_3 ((uint8_t)0x57) /*!< RX Channel Filter Bandwidth = 5.3 kHz */ -#define CHFLT_5_1 ((uint8_t)0x67) /*!< RX Channel Filter Bandwidth = 5.1 kHz */ -#define CHFLT_4_6 ((uint8_t)0x77) /*!< RX Channel Filter Bandwidth = 4.6 kHz */ -#define CHFLT_4_2 ((uint8_t)0x87) /*!< RX Channel Filter Bandwidth = 4.2 kHz */ -#define CHFLT_3_5 ((uint8_t)0x08) /*!< RX Channel Filter Bandwidth = 3.5 kHz */ -#define CHFLT_3_3 ((uint8_t)0x18) /*!< RX Channel Filter Bandwidth = 3.3 kHz */ -#define CHFLT_3_1 ((uint8_t)0x28) /*!< RX Channel Filter Bandwidth = 3.1 kHz */ -#define CHFLT_3 ((uint8_t)0x38) /*!< RX Channel Filter Bandwidth = 3.0 kHz */ -#define CHFLT_2_8 ((uint8_t)0x48) /*!< RX Channel Filter Bandwidth = 2.8 kHz */ -#define CHFLT_2_7 ((uint8_t)0x58) /*!< RX Channel Filter Bandwidth = 2.7 kHz */ -#define CHFLT_2_5 ((uint8_t)0x68) /*!< RX Channel Filter Bandwidth = 2.5 kHz */ -#define CHFLT_2_3 ((uint8_t)0x78) /*!< RX Channel Filter Bandwidth = 2.3 kHz */ -#define CHFLT_2_1 ((uint8_t)0x88) /*!< RX Channel Filter Bandwidth = 2.1 kHz */ -#define CHFLT_1_8 ((uint8_t)0x09) /*!< RX Channel Filter Bandwidth = 1.8 kHz */ -#define CHFLT_1_7 ((uint8_t)0x19) /*!< RX Channel Filter Bandwidth = 1.7 kHz */ -#define CHFLT_1_6 ((uint8_t)0x29) /*!< RX Channel Filter Bandwidth = 1.6 kHz */ -#define CHFLT_1_5 ((uint8_t)0x39) /*!< RX Channel Filter Bandwidth = 1.5 kHz */ -#define CHFLT_1_4 ((uint8_t)0x49) /*!< RX Channel Filter Bandwidth = 1.4 kHz */ -#define CHFLT_1_3a ((uint8_t)0x59) /*!< RX Channel Filter Bandwidth = 1.3 kHz */ -#define CHFLT_1_3 ((uint8_t)0x69) /*!< RX Channel Filter Bandwidth = 1.3 kHz */ -#define CHFLT_1_2 ((uint8_t)0x79) /*!< RX Channel Filter Bandwidth = 1.2 kHz */ -#define CHFLT_1_1 ((uint8_t)0x89) /*!< RX Channel Filter Bandwidth = 1.1 kHz */ - -/** - * @} - */ - -/** @defgroup AFC2_Register - * @{ - */ - -/** - * \brief AFC2 register - * \code - * Read Write - * Default value: 0x48 - * 7 AFC Freeze on Sync: Freeze AFC correction upon sync word detection. - * 1 - AFC Freeze enabled - * 0 - AFC Freeze disabled - * - * 6 AFC Enabled: Enable AFC - * 1 - AFC enabled - * 0 - AFC disabled - * - * 5 AFC Mode: Select AFC mode - * 1 - AFC Loop closed on 2nd conversion stage. - * 0 - AFC Loop closed on slicer - * - * 4:0 AFC PD leakage[4:0]: Peak detector leakage. This parameter sets the decay speed of the min/max frequency peak detector (AFC2 register), - * the range allowed is 0..31 (0 - no leakage, 31 - high leakage). The recommended value for this parameter is 4. - * - * \endcode - */ -#define AFC2_BASE ((uint8_t)0x1E) /*!< Automatic frequency compensation algorithm parameters (FSK/GFSK/MSK)*/ - -#define AFC2_AFC_FREEZE_ON_SYNC_MASK ((uint8_t)0x80) /*!< The frequency correction value is frozen when SYNC word is detected */ -#define AFC2_AFC_MASK ((uint8_t)0x40) /*!< Mask of Automatic Frequency Correction */ -#define AFC2_AFC_MODE_MASK ((uint8_t)0x20) /*!< Automatic Frequency Correction can be in Main MODE or Auxiliary MODE*/ -#define AFC2_AFC_MODE_SLICER ((uint8_t)0x00) /*!< Automatic Frequency Correction Main MODE */ -#define AFC2_AFC_MODE_MIXER ((uint8_t)0x20) /*!< Automatic Frequency Correction Auxiliary MODE */ - -/** - * @} - */ - -/** @defgroup AFC1_Register - * @{ - */ - -/** - * \brief AFC1 register - * \code - * Read Write - * Default value: 0x18 - * 7:0 AFC_FAST_PERIOD: Length of the AFC fast period. this parameter sets the length of the fast period in number of samples (AFC1 register), the range allowed - * is 0..255. The recommended setting for this parameter is such that the fast period equals the preamble length. Since the - * algorithm operates typically on 2 samples per symbol, the programmed value should be twice the number of preamble - * symbols. - * - * \endcode - */ -#define AFC1_BASE ((uint8_t)0x1F) /*!< Length of the AFC fast period */ - -/** - * @} - */ - -/** @defgroup AFC0_Register - * @{ - */ - -/** - * \brief AFC0 register - * \code - * Read Write - * Default value: 0x25 - * 7:4 AFC_FAST_GAIN_LOG2[3:0]: AFC loop gain in fast mode (2's log) - * - * 3:0 AFC_SLOW_GAIN_LOG2[3:0]: AFC loop gain in slow mode (2's log) - * - * \endcode - */ -#define AFC0_BASE ((uint8_t)0x20) /*!< AFC loop gain in fast and slow modes (2's log) */ - -/** - * @} - */ - -/** @defgroup CLOCKREC_Register - * @{ - */ - -/** - * \brief CLOCKREC register - * \code - * Read Write - * Default value: 0x58 - * - * 7:5 CLK_REC_P_GAIN [2:0]: Clock recovery loop gain (log2) - * - * 4 PSTFLT_LEN: Set Postfilter length - * 1 - 16 symbols - * 0 - 8 symbols - * - * 3:0 CLK_REC_I_GAIN[3:0]: Integral gain for the clock recovery loop - * \endcode - */ - -#define CLOCKREC_BASE ((uint8_t)0x23) /*!< Gain of clock recovery loop - Postfilter length 0-8 symbols, 1-16 symbols */ - -/** - * @} - */ - -/** @defgroup AGCCTRL2_Register - * @{ - */ - -/** - * \brief AGCCTRL2 register - * \code - * Read Write - * Default value: 0x22 - * - * 7 Reserved - * - * 6 FREEZE_ON_STEADY: Enable freezing on steady state - * 1 - Enable - * 0 - Disable - * - * 5 FREEZE_ON_SYNC: Enable freezing on sync detection - * 1 - Enable - * 0 - Disable - * - * 4 START_MAX_ATTENUATION: Start with max attenuation - * 1 - Enable - * 0 - Disable - * - * 3:0 MEAS_TIME[3:0]: Measure time during which the signal peak is detected (according to the formula 12/fxo*2^MEAS_TIME) - * \endcode - */ -#define AGCCTRL2_BASE ((uint8_t)0x24) /*!< AGC freeze strategy, AGC attenuation strategy, AGC measure time */ - -#define AGCCTRL2_FREEZE_ON_STEADY_MASK ((uint8_t)0x40) /*!< The attenuation settings will be frozen as soon as signal level - is betweeen min and max treshold (see AGCCTRL1) */ -#define AGCCTRL2_FREEZE_ON_SYNC_MASK ((uint8_t)0x20) /*!< The attenuation settings will be frozen as soon sync word is detected */ -#define AGCCTRL2_START_MAX_ATTENUATION_MASK ((uint8_t)0x10) /*!< The AGC algorithm can start with MAX attenuation or MIN attenuation */ - -/** - * @} - */ - -/** @defgroup AGCCTRL1_Register - * @{ - */ - -/** - * \brief AGCCTRL1 register - * \code - * Read Write - * Default value: 0x65 - * - * 7:4 THRESHOLD_HIGH[3:0]: High threshold for the AGC - * - * 3:0 THRESHOLD_LOW[3:0]: Low threshold for the AGC - * \endcode - */ -#define AGCCTRL1_BASE ((uint8_t)0x25) /*!< Sets low and high threshold for AGC */ - -/** - * @} - */ - -/** @defgroup AGCCTRL0_Register - * @{ - */ - -/** - * \brief AGCCTRL0 register - * \code - * Read Write - * Default value: 0x8A - * - * 7 AGC S_ENABLE: Enable AGC - * 1 - Enable - * 0 - Disable - * - * 6 AGC_MODE: Set linear-Binary AGC mode - * 1 - Enable - * 0 - Disable - * - * 5:0 HOLD_TIME[5:0]: Hold time after gain adjustment according to formula 12/fxo*HOLD_TIME - * \endcode - */ -#define AGCCTRL0_BASE ((uint8_t)0x26) /*!< Enables AGC, set AGC algo between linear/binary mode, set hold time - to account signal propagation through RX chain */ -#define AGCCTRL0_AGC_MASK ((uint8_t)0x80) /*!< AGC on/off */ -#define AGCCTRL0_AGC_MODE_MASK ((uint8_t)0x40) /*!< AGC search correct attenuation in binary mode or sequential mode */ -#define AGCCTRL0_AGC_MODE_LINEAR ((uint8_t)0x00) /*!< AGC search correct attenuation in sequential mode (recommended) */ -#define AGCCTRL0_AGC_MODE_BINARY ((uint8_t)0x40) /*!< AGC search correct attenuation in binary mode */ - -/** - * @} - */ - -/** @defgroup CHNUM_Register - * @{ - */ - -/** - * \brief CHNUM registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 CH_NUM[7:0]: Channel number. This value is multiplied by the channel spacing and added to the - * synthesizer base frequency to generate the actual RF carrier frequency. - * \endcode - */ -#define CHNUM_BASE ((uint8_t)0x6C) /*!< Channel number. This value is multiplied by the channel - spacing and added to the synthesizer base frequency to generate the actual RF carrier frequency */ -/** - * @} - */ - -/** @defgroup AFC_CORR_Register - * @{ - */ - -/** - * \brief AFC_CORR registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 AFC_CORR[7:0]: AFC word of the received packet - * \endcode - */ -#define AFC_CORR_BASE ((uint8_t)(0xC4)) /*!< AFC word of the received packet */ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup Packet_Configuration_Registers - * @{ - */ - -/** @defgroup PCKTCTRL4_Register - * @{ - */ - -/** - * \brief PCKTCTRL4 register - * \code - * Read Write - * Default value: 0x00 - * - * 7:5 NOT_USED. - * - * 4:3 ADDRESS_LEN[1:0]: length of address field in bytes - * - * 2:0 control_len[2:0]: length of control field in bytes - * \endcode - */ -#define PCKTCTRL4_BASE ((uint8_t)0x30) /*!< lenghts of address and control field */ - -#define PCKTCTRL4_ADDRESS_LEN_MASK ((uint8_t)0x18) -#define PCKTCTRL4_CONTROL_LEN_MASK ((uint8_t)0x07) - -/** - * @} - */ - -/** @defgroup PCKTCTRL3_Register - * @{ - */ - -/** - * \brief PCKTCTRL3 register - * \code - * Read Write - * Default value: 0x07 - * - * 7:6 PCKT_FRMT[1:0]: format of packet - * - * PCKT_FRMT1 | PCKT_FRMT0 | Format - * ---------------------------------------------------------------------- - * 0 | 0 | BASIC - * 1 | 0 | MBUS - * 1 | 1 | STACK - * - * 5:4 RX_MODE[1:0]: length of address 0x30 field in bytes - * - * RX_MODE1 | RX_MODE0 | Rx Mode - * -------------------------------------------------------------------- - * 0 | 0 | normal - * 0 | 1 | direct through FIFO - * 1 | 0 | direct through GPIO - * - * 3:0 LEN_WID[3:0]: length of length field in bits - * \endcode - */ -#define PCKTCTRL3_BASE ((uint8_t)0x31) /*!< packet format, RX mode, lenght of length field */ - -#define PCKTCTRL3_PCKT_FRMT_BASIC ((uint8_t)0x00) /*!< Basic Packet Format */ -#define PCKTCTRL3_PCKT_FRMT_MBUS ((uint8_t)0x80) /*!< Wireless M-BUS Packet Format */ -#define PCKTCTRL3_PCKT_FRMT_STACK ((uint8_t)0xC0) /*!< STack Packet Format */ - -#define PCKTCTRL3_RX_MODE_NORMAL ((uint8_t)0x00) /*!< Normal RX Mode */ -#define PCKTCTRL3_RX_MODE_DIRECT_FIFO ((uint8_t)0x10) /*!< RX Direct Mode; data available through FIFO */ -#define PCKTCTRL3_RX_MODE_DIRECT_GPIO ((uint8_t)0x20) /*!< RX Direct Mode; data available through selected GPIO */ - -#define PCKTCTRL3_PKT_FRMT_MASK ((uint8_t)0xC0) -#define PCKTCTRL3_RX_MODE_MASK ((uint8_t)0x30) -#define PCKTCTRL3_LEN_WID_MASK ((uint8_t)0x0F) - -/** - * @} - */ - -/** @defgroup PCKTCTRL2_Register - * @{ - */ - -/** - * \brief PCKTCTRL2 register - * \code - * Read Write - * Default value: 0x1E - * - * 7:3 PREAMBLE_LENGTH[4:0]: length of preamble field in bytes (0..31) - * - * - * 2:1 SYNC_LENGTH[1:0]: length of sync field in bytes - * - * - * 0 FIX_VAR_LEN: fixed/variable packet length - * 1 - Variable - * 0 - Fixed - * \endcode - */ -#define PCKTCTRL2_BASE ((uint8_t)0x32) /*!< length of preamble and sync fields (in bytes), fix or variable packet length */ - -#define PCKTCTRL2_FIX_VAR_LEN_MASK ((uint8_t)0x01) /*!< Enable/disable the length mode */ -#define PCKTCTRL2_PREAMBLE_LENGTH_MASK ((uint8_t)0xF8) -#define PCKTCTRL2_SYNC_LENGTH_MASK ((uint8_t)0x06) - -/** - * @} - */ - -/** @defgroup PCKTCTRL1_Register - * @{ - */ - -/** - * \brief PCKTCTRL1 register - * \code - * Read Write - * Default value: 0x20 - * - * 7:5 CRC_MODE[2:0]: CRC type (0, 8, 16, 24 bits) - * - * CRC_MODE2 | CRC_MODE1 | CRC_MODE0 | CRC Mode (n. bits - poly) - * ------------------------------------------------------------------------------------------------- - * 0 | 0 | 1 | 8 - 0x07 - * 0 | 1 | 0 | 16 - 0x8005 - * 0 | 1 | 1 | 16 - 0x1021 - * 1 | 0 | 0 | 24 - 0x864CBF - * - * 4 WHIT_EN[0]: Enable Whitening - * 1 - Enable - * 0 - Disable - * - * 3:2 TX_SOURCE[1:0]: length of sync field in bytes - * - * TX_SOURCE1 | TX_SOURCE0 | Tx Mode - * -------------------------------------------------------------------- - * 0 | 0 | normal - * 0 | 1 | direct through FIFO - * 1 | 0 | direct through GPIO - * 1 | 1 | pn9 - * - * 1 NOT_USED - * - * 0 FEC_EN: enable FEC - * 1 - FEC in TX , Viterbi decoding in RX - * 0 - Disabled - * \endcode - */ -#define PCKTCTRL1_BASE ((uint8_t)0x33) /*!< CRC type, whitening enable, TX mode */ - -#define PCKTCTRL1_FEC_MASK ((uint8_t)0x01) /*!< Enable/disable the Forward Error Correction */ -#define PCKTCTRL1_TX_SOURCE_MASK ((uint8_t)0x0C) /*!< TX source mode */ -#define PCKTCTRL1_CRC_MODE_MASK ((uint8_t)0xE0) /*!< CRC type */ -#define PCKTCTRL1_WHIT_MASK ((uint8_t)0x10) /*!< Enable/disable the Whitening */ - -/** - * @} - */ - - - -/** @defgroup PCKTLEN1_Register - * @{ - */ - -/** - * \brief PCKTLEN1 register - * \code - * Read Write - * Default value: 0x00 - * - * 7:0 pktlen1[7:0]: lenght of packet in bytes (upper field) LENGHT/256 - * \endcode - */ -#define PCKTLEN1_BASE ((uint8_t)0x34) /*!< lenght of packet in bytes (upper field) */ - -/** - * @} - */ - -/** @defgroup PCKTLEN0_Register - * @{ - */ - -/** - * \brief PCKTLEN0 register - * \code - * Read Write - * Default value: 0x14 - * - * 7:0 pktlen0[7:0]: lenght of packet in bytes (lower field) LENGHT%256 - * \endcode - */ -#define PCKTLEN0_BASE ((uint8_t)0x35) /*!< lenght of packet in bytes (lower field) [PCKTLEN=PCKTLEN1x256+PCKTLEN0]*/ - -/** - * @} - */ - -/** @defgroup SYNCx_Registers - * @{ - */ -/** - * \brief SYNCx[4:1] Registers - * \code - * Read Write - * Default value: 0x88 - * - * 7:0 SYNCx[7:0]: xth sync word - * \endcode - */ -#define SYNC4_BASE ((uint8_t)0x36) /*!< Sync word 4 */ -#define SYNC3_BASE ((uint8_t)0x37) /*!< Sync word 3 */ -#define SYNC2_BASE ((uint8_t)0x38) /*!< Sync word 2 */ -#define SYNC1_BASE ((uint8_t)0x39) /*!< Sync word 1 */ - -/** - * @} - */ - - -/** @defgroup MBUS_PRMBL_Register - * @{ - */ - -/** - * \brief MBUS_PRMBL register - * \code - * Read Write - * Default value: 0x20 - * - * 7:0 MBUS_PRMBL[7:0]: MBUS preamble control - * \endcode - */ -#define MBUS_PRMBL_BASE ((uint8_t)0x3B) /*!< MBUS preamble lenght (in 01 bit pairs) */ - -/** - * @} - */ - - -/** @defgroup MBUS_PSTMBL_Register - * @{ - */ - -/** - * \brief MBUS_PSTMBL register - * \code - * Read Write - * Default value: 0x20 - * - * 7:0 MBUS_PSTMBL[7:0]: MBUS postamble control - * \endcode - */ -#define MBUS_PSTMBL_BASE ((uint8_t)0x3C) /*!< MBUS postamble length (in 01 bit pairs) */ - -/** - * @} - */ - -/** @defgroup MBUS_CTRL_Register - * @{ - */ - -/** - * \brief MBUS_CTRL register - * \code - * Read Write - * Default value: 0x00 - * - * 7:4 NOT_USED - * - * 3:1 MBUS_SUBMODE[2:0]: MBUS submode (allowed values are 0,1,3,5) - * - * 0 NOT_USED - * \endcode - */ -#define MBUS_CTRL_BASE ((uint8_t)0x3D) /*!< MBUS sub-modes (S1, S2 short/long header, T1, T2, R2) */ - -#define MBUS_CTRL_MBUS_SUBMODE_S1_S2L ((uint8_t)0x00) /*!< MBUS sub-modes S1 & S2L, header lenght min 279, sync 0x7696, Manchester */ -#define MBUS_CTRL_MBUS_SUBMODE_S2_S1M_T2_OTHER ((uint8_t)0x02) /*!< MBUS sub-modes S2, S1-m, T2 (only other to meter) short header, header lenght min 15, sync 0x7696, Manchester */ -#define MBUS_CTRL_MBUS_SUBMODE_T1_T2_METER ((uint8_t)0x06) /*!< MBUS sub-modes T1, T2 (only meter to other), header lenght min 19, sync 0x3D, 3 out of 6 */ -#define MBUS_CTRL_MBUS_SUBMODE_R2 ((uint8_t)0x0A) /*!< MBUS sub-mode R2, header lenght min 39, sync 0x7696, Manchester */ - -/** - * @} - */ - - - -/** @defgroup PCKT_FLT_GOALS_CONTROLx_MASK_Registers - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_CONTROLx_MASK registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 CONTROLx_MASK[7:0]: All 0s - no filtering - * - * \endcode - */ -#define PCKT_FLT_GOALS_CONTROL0_MASK_BASE ((uint8_t)0x42) /*!< Packet control field #3 mask, all 0s -> no filtering */ - -#define PCKT_FLT_GOALS_CONTROL1_MASK_BASE ((uint8_t)0x43) /*!< Packet control field #2 mask, all 0s -> no filtering */ - -#define PCKT_FLT_GOALS_CONTROL2_MASK_BASE ((uint8_t)0x44) /*!< Packet control field #1 mask, all 0s -> no filtering */ - -#define PCKT_FLT_GOALS_CONTROL3_MASK_BASE ((uint8_t)0x45) /*!< Packet control field #0 mask, all 0s -> no filtering */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_CONTROLx_FIELD_Registers - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_CONTROLx_FIELD registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 CONTROLx_FIELD[7:0]: Control field (byte x) to be used as reference - * - * \endcode - */ -#define PCKT_FLT_GOALS_CONTROL0_FIELD_BASE ((uint8_t)0x46) /*!< Control field (byte #3) */ - -#define PCKT_FLT_GOALS_CONTROL1_FIELD_BASE ((uint8_t)0x47) /*!< Control field (byte #2) */ - -#define PCKT_FLT_GOALS_CONTROL2_FIELD_BASE ((uint8_t)0x48) /*!< Control field (byte #1) */ - -#define PCKT_FLT_GOALS_CONTROL3_FIELD_BASE ((uint8_t)0x49) /*!< Control field (byte #0) */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_SOURCE_MASK_Register - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_SOURCE_MASK register - * \code - * Default value: 0x00 - * Read Write - * 7:0 RX_SOURCE_MASK[7:0]: For received packet only: all 0s - no filtering - * - * \endcode - */ -#define PCKT_FLT_GOALS_SOURCE_MASK_BASE ((uint8_t)0x4A) /*!< Source address mask, valid in RX mode */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_SOURCE_ADDR_Register - * @{ - */ -/** - * \brief PCKT_FLT_GOALS_SOURCE_ADDR register - * \code - * Default value: 0x00 - * Read Write - * 7:0 RX_SOURCE_ADDR[7:0]: RX packet source / TX packet destination fields - * - * \endcode - */ -#define PCKT_FLT_GOALS_SOURCE_ADDR_BASE ((uint8_t)0x4B) /*!< Source address */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_BROADCAST_Register - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_BROADCAST register - * \code - * Default value: 0x00 - * Read Write - * 7:0 BROADCAST[7:0]: Address shared for broadcast communication link - * - * \endcode - */ -#define PCKT_FLT_GOALS_BROADCAST_BASE ((uint8_t)0x4C) /*!< Address shared for broadcast communication links */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_MULTICAST_Register - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_MULTICAST register - * \code - * Default value: 0x00 - * Read Write - * 7:0 MULTICAST[7:0]: Address shared for multicast communication links - * - * \endcode - */ -#define PCKT_FLT_GOALS_MULTICAST_BASE ((uint8_t)0x4D) /*!< Address shared for multicast communication links */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_GOALS_TX_SOURCE_ADDR_Register - * @{ - */ - -/** - * \brief PCKT_FLT_GOALS_TX_SOURCE_ADDR register - * \code - * Default value: 0x00 - * Read Write - * 7:0 TX_SOURCE_ADDR[7:0]: TX packet source / RX packet destination fields - * - * \endcode - */ -#define PCKT_FLT_GOALS_TX_ADDR_BASE ((uint8_t)0x4E) /*!< Address of the destination (also device own address) */ - -/** - * @} - */ - -/** @defgroup PCKT_FLT_OPTIONS_Register - * @{ - */ - -/** - * \brief PCKT_FLT_OPTIONS register - * \code - * Default value: 0x70 - * Read Write - * 7 Reserved. - * - * 6 RX_TIMEOUT_AND_OR_SELECT[0]: 1 - OR logical function applied to CS/SQI/PQI - * values (masked by 7:5 bits in PROTOCOL register) - * 5 CONTROL_FILTERING[0]: 1 - RX packet accepted if its control fields matches - * with masked CONTROLx_FIELD registers. - * 4 SOURCE_FILTERING[0]: 1 - RX packet accepted if its source field - * matches w/ masked RX_SOURCE_ADDR register. - * 3 DEST_VS_ SOURCE _ADDR[0]: 1 - RX packet accepted if its destination - * address matches with TX_SOURCE_ADDR reg. - * 2 DEST_VS_MULTICAST_ADDR[0]: 1 - RX packet accepted if its destination - * address matches with MULTICAST register - * 1 DEST_VS_BROADCAST_ADDR[0]: 1 - RX packet accepted if its destination - * address matches with BROADCAST register. - * 0 CRC_CHECK[0]: 1 - packet discarded if CRC not valid. - * - * \endcode - */ -#define PCKT_FLT_OPTIONS_BASE ((uint8_t)0x4F) /*!< Options relative to packet filtering */ - -#define PCKT_FLT_OPTIONS_CRC_CHECK_MASK ((uint8_t)0x01) /*!< Enable/disable of CRC check: packet is discarded if CRC is not valid [RX] */ -#define PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK ((uint8_t)0x02) /*!< Packet discarded if destination address differs from BROADCAST register [RX] */ -#define PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK ((uint8_t)0x04) /*!< Packet discarded if destination address differs from MULTICAST register [RX] */ -#define PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK ((uint8_t)0x08) /*!< Packet discarded if destination address differs from TX_ADDR register [RX] */ -#define PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK ((uint8_t)0x10) /*!< Packet discarded if source address (masked by the SOURCE_MASK register) - differs from SOURCE_ADDR register [RX] */ -#define PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK ((uint8_t)0x20) /*!< Packet discarded if the x-byte (x=1¸4) control field (masked by the CONTROLx_MASK register) - differs from CONTROLx_FIELD register [RX] */ -#define PCKT_FLT_OPTIONS_RX_TIMEOUT_AND_OR_SELECT ((uint8_t)0x40) /*!< Logical function applied to CS/SQI/PQI values (masked by [7:5] bits in PROTOCOL[2] - register) */ - -/** - * @} - */ - -/** @defgroup TX_CTRL_FIELD_Registers - * @{ - */ - -/** - * \brief TX_CTRL_FIELDx registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 TX_CTRLx[7:0]: Control field value to be used in TX packet as byte n.x - * \endcode - */ -#define TX_CTRL_FIELD3_BASE ((uint8_t)0x68) /*!< Control field value to be used in TX packet as byte n.3 */ - -#define TX_CTRL_FIELD2_BASE ((uint8_t)0x69) /*!< Control field value to be used in TX packet as byte n.2 */ - -#define TX_CTRL_FIELD1_BASE ((uint8_t)0x6A) /*!< Control field value to be used in TX packet as byte n.1 */ - -#define TX_CTRL_FIELD0_BASE ((uint8_t)0x6B) /*!< Control field value to be used in TX packet as byte n.0 */ - -/** - * @} - */ - - -/** @defgroup TX_PCKT_INFO_Register - * @{ - */ - -/** - * \brief TX_PCKT_INFO registers - * \code - * Default value: 0x00 - * Read - * - * 7:6 Not used. - * - * 5:4 TX_SEQ_NUM: Current TX packet sequence number - * - * 0 N_RETX[3:0]: Number of retransmissions done on the - * last TX packet - * \endcode - */ -#define TX_PCKT_INFO_BASE ((uint8_t)(0xC2)) /*!< Current TX packet sequence number [5:4]; - Number of retransmissions done on the last TX packet [3:0]*/ -/** - * @} - */ - -/** @defgroup RX_PCKT_INFO_Register - * @{ - */ - -/** - * \brief RX_PCKT_INFO registers - * \code - * Default value: 0x00 - * Read - * - * 7:3 Not used. - * - * 2 NACK_RX: NACK field of the received packet - * - * 1:0 RX_SEQ_NUM[1:0]: Sequence number of the received packet - * \endcode - */ -#define RX_PCKT_INFO_BASE ((uint8_t)(0xC3)) /*!< NO_ACK field of the received packet [2]; - sequence number of the received packet [1:0]*/ - -#define TX_PCKT_INFO_NACK_RX ((uint8_t)(0x04)) /*!< NACK field of the received packet */ - -/** - * @} - */ - -/** @defgroup RX_PCKT_LEN1 - * @{ - */ - -/** - * \brief RX_PCKT_LEN1 registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 RX_PCKT_LEN1[7:0]: Length (number of bytes) of the received packet: RX_PCKT_LEN=RX_PCKT_LEN1 × 256 + RX_PCKT_LEN0 - * This value is packet_length/256 - * \endcode - */ -#define RX_PCKT_LEN1_BASE ((uint8_t)(0xC9)) /*!< Length (number of bytes) of the received packet: */ - -/** - * @} - */ - -/** @defgroup RX_PCKT_LEN0 - * @{ - */ - -/** - * \brief RX_PCKT_LEN0 registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 RX_PCKT_LEN0[7:0]: Length (number of bytes) of the received packet: RX_PCKT_LEN=RX_PCKT_LEN1 × 256 + RX_PCKT_LEN0 - * This value is packet_length%256 - * \endcode - */ -#define RX_PCKT_LEN0_BASE ((uint8_t)(0xCA)) /*!< RX_PCKT_LEN=RX_PCKT_LEN1 × 256 + RX_PCKT_LEN0 */ - -/** - * @} - */ - - -/** @defgroup CRC_FIELD_Register - * @{ - */ - -/** - * \brief CRC_FIELD[2:0] registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 CRC_FIELDx[7:0]: upper(x=2), middle(x=1) and lower(x=0) part of the crc field of the received packet - * \endcode - */ -#define CRC_FIELD2_BASE ((uint8_t)(0xCB)) /*!< CRC2 field of the received packet */ - -#define CRC_FIELD1_BASE ((uint8_t)(0xCC)) /*!< CRC1 field of the received packet */ - -#define CRC_FIELD0_BASE ((uint8_t)(0xCD)) /*!< CRC0 field of the received packet */ - -/** - * @} - */ - -/** @defgroup RX_CTRL_FIELD_Register - * @{ - */ - -/** - * \brief RX_CTRL_FIELD[3:0] registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 RX_CTRL_FIELDx[7:0]: upper(x=3), middle(x=2), middle(x=1) and lower(x=0) part of the control field of the received packet - * \endcode - */ -#define RX_CTRL_FIELD0_BASE ((uint8_t)(0xCE)) /*!< CRTL3 Control field of the received packet */ - -#define RX_CTRL_FIELD1_BASE ((uint8_t)(0xCF)) /*!< CRTL2 Control field of the received packet */ - -#define RX_CTRL_FIELD2_BASE ((uint8_t)(0xD0)) /*!< CRTL1 Control field of the received packet */ - -#define RX_CTRL_FIELD3_BASE ((uint8_t)(0xD1)) /*!< CRTL0 Control field of the received packet */ - -/** - * @} - */ - -/** @defgroup RX_ADDR_FIELD_Register - * @{ - */ - -/** - * \brief RX_ADDR_FIELD[1:0] registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 RX_ADDR_FIELDx[7:0]: source(x=1) and destination(x=0) address field of the received packet - * \endcode - */ -#define RX_ADDR_FIELD1_BASE ((uint8_t)(0xD2)) /*!< ADDR1 Address field of the received packet */ - -#define RX_ADDR_FIELD0_BASE ((uint8_t)(0xD3)) /*!< ADDR0 Address field of the received packet */ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup Protocol_Registers - * @{ - */ - -/** @defgroup PROTOCOL2_Register - * @{ - */ - -/** - * \brief PROTOCOL2 register - * \code - * Default value: 0x06 - * Read Write - * 7 CS_TIMEOUT_MASK: 1 - CS value contributes to timeout disabling - * - * 6 SQI_TIMEOUT_MASK: 1 - SQI value contributes to timeout disabling - * - * 5 PQI_TIMEOUT_MASK: 1 - PQI value contributes to timeout disabling - * - * 4:3 TX_SEQ_NUM_RELOAD[1:0]: TX sequence number to be used when counting reset is required using the related command. - * - * 2 RCO_CALIBRATION[0]: 1 - Enables the automatic RCO calibration - * - * 1 VCO_CALIBRATION[0]: 1 - Enables the automatic VCO calibration - * - * 0 LDCR_MODE[0]: 1 - LDCR mode enabled - * - * \endcode - */ -#define PROTOCOL2_BASE ((uint8_t)0x50) /*!< Protocol2 regisetr address */ - -#define PROTOCOL2_LDC_MODE_MASK ((uint8_t)0x01) /*!< Enable/disable Low duty Cycle mode */ -#define PROTOCOL2_VCO_CALIBRATION_MASK ((uint8_t)0x02) /*!< Enable/disable VCO automatic calibration */ -#define PROTOCOL2_RCO_CALIBRATION_MASK ((uint8_t)0x04) /*!< Enable/disable RCO automatic calibration */ -#define PROTOCOL2_PQI_TIMEOUT_MASK ((uint8_t)0x20) /*!< PQI value contributes to timeout disabling */ -#define PROTOCOL2_SQI_TIMEOUT_MASK ((uint8_t)0x40) /*!< SQI value contributes to timeout disabling */ -#define PROTOCOL2_CS_TIMEOUT_MASK ((uint8_t)0x80) /*!< CS value contributes to timeout disabling */ - -/** - * @} - */ - -/** @defgroup PROTOCOL1_Register - * @{ - */ - -/** - * \brief PROTOCOL1 register - * \code - * Default value: 0x00 - * Read Write - * 7 LDCR_RELOAD_ON_SYNC: 1 - LDCR timer will be reloaded with the value stored in the LDCR_RELOAD registers - * - * 6 PIGGYBACKING: 1 - PIGGYBACKING enabled - * - * 5:4 Reserved. - * - * 3 SEED_RELOAD[0]: 1 - Reload the back-off random generator - * seed using the value written in the - * BU_COUNTER_SEED_MSByte / LSByte registers - * - * 2 CSMA_ON [0]: 1 - CSMA channel access mode enabled - * - * 1 CSMA_PERS_ON[0]: 1 - CSMA persistent (no back-off) enabled - * - * 0 AUTO_PCKT_FLT[0]: 1 - automatic packet filtering mode enabled - * - * \endcode - */ -#define PROTOCOL1_BASE ((uint8_t)0x51) /*!< Protocol1 regisetr address */ - -#define PROTOCOL1_AUTO_PCKT_FLT_MASK ((uint8_t)0x01) /*!< Enable/disable automatic packet filtering mode */ -#define PROTOCOL1_CSMA_PERS_ON_MASK ((uint8_t)0x02) /*!< Enable/disable CSMA persistent (no back-off) */ -#define PROTOCOL1_CSMA_ON_MASK ((uint8_t)0x04) /*!< Enable/disable CSMA channel access mode */ -#define PROTOCOL1_SEED_RELOAD_MASK ((uint8_t)0x08) /*!< Reloads the seed of the PN generator for CSMA procedure */ -#define PROTOCOL1_PIGGYBACKING_MASK ((uint8_t)0x40) /*!< Enable/disable Piggybacking */ -#define PROTOCOL1_LDC_RELOAD_ON_SYNC_MASK ((uint8_t)0x80) /*!< LDC timer will be reloaded with the value stored in the LDC_RELOAD registers */ - -/** - * @} - */ - -/** @defgroup PROTOCOL0_Register - * @{ - */ - -/** - * \brief PROTOCOL0 register - * \code - * Default value: 0x08 - * Read Write - * 7:4 NMAX_RETX[3:0]: Max number of re-TX. 0 - re-transmission is not performed - * - * 3 NACK_TX[0]: 1 - field NO_ACK=1 on transmitted packet - * - * 2 AUTO_ACK[0]: 1 - automatic ack after RX - * - * 1 PERS_RX[0]: 1 - persistent reception enabled - * - * 0 PERS_TX[0]: 1 - persistent transmission enabled - * - * \endcode - */ -#define PROTOCOL0_BASE ((uint8_t)0x52) /*!< Persistent RX/TX, autoack, Max number of retransmissions */ - -#define PROTOCOL0_PERS_TX_MASK ((uint8_t)0x01) /*!< Enables persistent transmission */ -#define PROTOCOL0_PERS_RX_MASK ((uint8_t)0x02) /*!< Enables persistent reception */ -#define PROTOCOL0_AUTO_ACK_MASK ((uint8_t)0x04) /*!< Enables auto acknowlegment */ -#define PROTOCOL0_NACK_TX_MASK ((uint8_t)0x08) /*!< Writes field NO_ACK=1 on transmitted packet */ -#define PROTOCOL0_NMAX_RETX_MASK ((uint8_t)0xF0) /*!< Retransmission mask */ - -/** - * @} - */ - -/** @defgroup TIMERS5_Register - * @{ - */ - -/** - * \brief TIMERS5 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 RX_TIMEOUT_PRESCALER[7:0] : RX operation timeout: prescaler value - * \endcode - */ -#define TIMERS5_RX_TIMEOUT_PRESCALER_BASE ((uint8_t)0x53) /*!< RX operation timeout: prescaler value */ - -/** - * @} - */ - -/** @defgroup TIMERS4_Register - * @{ - */ - -/** - * \brief TIMERS4 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 RX_TIMEOUT_COUNTER[7:0] : RX operation timeout: counter value - * \endcode - */ -#define TIMERS4_RX_TIMEOUT_COUNTER_BASE ((uint8_t)0x54) /*!< RX operation timeout: counter value */ - -/** - * @} - */ - -/** @defgroup TIMERS3_Register - * @{ - */ - -/** - * \brief TIMERS3 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 LDCR_PRESCALER[7:0] : LDC Mode: Prescaler part of the wake-up value - * \endcode - */ -#define TIMERS3_LDC_PRESCALER_BASE ((uint8_t)0x55) /*!< LDC Mode: Prescaler of the wake-up timer */ - -/** - * @} - */ - -/** @defgroup TIMERS2_Register - * @{ - */ - -/** - * \brief TIMERS2 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 LDCR_COUNTER[7:0] : LDC Mode: counter part of the wake-up value - * \endcode - */ -#define TIMERS2_LDC_COUNTER_BASE ((uint8_t)0x56) /*!< LDC Mode: counter of the wake-up timer */ - -/** - * @} - */ - -/** @defgroup TIMERS1_Register - * @{ - */ - -/** - * \brief TIMERS1 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 LDCR_RELOAD_PRESCALER[7:0] : LDC Mode: Prescaler part of the reload value - * \endcode - */ -#define TIMERS1_LDC_RELOAD_PRESCALER_BASE ((uint8_t)0x57) /*!< LDC Mode: Prescaler part of the reload value */ - -/** - * @} - */ - -/** @defgroup TIMERS0_Register - * @{ - */ - -/** - * \brief TIMERS0 register - * \code - * Default value: 0x00 - * Read Write - * 7:0 LDCR_RELOAD_COUNTER[7:0] : LDC Mode: Counter part of the reload value - * \endcode - */ -#define TIMERS0_LDC_RELOAD_COUNTER_BASE ((uint8_t)0x58) /*!< LDC Mode: Counter part of the reload value */ - -/** - * @} - */ - - -/** @defgroup CSMA_CONFIG3_Register - * @{ - */ - -/** - * \brief CSMA_CONFIG3 registers - * \code - * Default value: 0xFF - * Read Write - * 7:0 BU_COUNTER_SEED_MSByte: Seed of the random number generator used to apply the BEB (Binary Exponential Backoff) algorithm (MSB) - * \endcode - */ -#define CSMA_CONFIG3_BASE ((uint8_t)0x64) /*!< CSMA/CA: Seed of the random number generator used to apply the BEB (Binary Exponential Backoff) algorithm (MSB) */ - -/** - * @} - */ - -/** @defgroup CSMA_CONFIG2_Register - * @{ - */ - -/** - * \brief CSMA_CONFIG2 registers - * \code - * Default value: 0x00 - * Read Write - * 7:0 BU_COUNTER_SEED_LSByte: Seed of the random number generator used to apply the BEB (Binary Exponential Backoff) algorithm (LSB) - * \endcode - */ -#define CSMA_CONFIG2_BASE ((uint8_t)0x65) /*!< CSMA/CA: Seed of the random number generator used to apply the BEB (Binary Exponential Backoff) algorithm (LSB) */ - -/** - * @} - */ - -/** @defgroup CSMA_CONFIG1_Register - * @{ - */ - -/** - * \brief CSMA_CONFIG1 registers - * \code - * Default value: 0x04 - * Read Write - * 7:2 BU_PRESCALER[5:0]: Used to program the back-off unit BU - * - * 1:0 CCA_PERIOD[1:0]: Used to program the Tcca time (64 / 128 /256 / 512 × Tbit. - * \endcode - */ -#define CSMA_CONFIG1_BASE ((uint8_t)0x66) /*!< CSMA/CA: Prescaler of the back-off time unit (BU); CCA period */ - -#define CSMA_CCA_PERIOD_64TBIT ((uint8_t)0x00) /*!< CSMA/CA: Sets CCA period to 64*TBIT */ -#define CSMA_CCA_PERIOD_128TBIT ((uint8_t)0x01) /*!< CSMA/CA: Sets CCA period to 128*TBIT */ -#define CSMA_CCA_PERIOD_256TBIT ((uint8_t)0x02) /*!< CSMA/CA: Sets CCA period to 256*TBIT */ -#define CSMA_CCA_PERIOD_512TBIT ((uint8_t)0x03) /*!< CSMA/CA: Sets CCA period to 512*TBIT */ - -/** - * @} - */ - -/** @defgroup CSMA_CONFIG0_Register - * @{ - */ - -/** - * \brief CSMA_CONFIG0 registers - * \code - * Default value: 0x00 - * Read Write - * 7:4 CCA_LENGTH[3:0]: Used to program the Tlisten time - * - * 3 Reserved. - * - * 2:0 NBACKOFF_MAX[2:0]: Max number of back-off cycles. - * \endcode - */ -#define CSMA_CONFIG0_BASE ((uint8_t)0x67) /*!< CSMA/CA: CCA lenght; Max number of backoff cycles */ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup Link_Quality_Registers - * @{ - */ - -/** @defgroup QI_Register - * @{ - */ - -/** - * \brief QI register - * \code - * Read Write - * Default value: 0x02 - * - * 7:6 SQI_TH[1:0]: SQI threshold according to the formula: 8*SYNC_LEN - 2*SQI_TH - * - * 5:2 PQI_TH[3:0]: PQI threshold according to the formula: 4*PQI_THR - * - * - * 1 SQI_EN[0]: SQI enable - * 1 - Enable - * 0 - Disable - * - * 0 PQI_EN[0]: PQI enable - * 1 - Enable - * 0 - Disable - * \endcode - */ -#define QI_BASE ((uint8_t)0x3A) /*!< QI register */ - -#define QI_PQI_MASK ((uint8_t)0x01) /*!< PQI enable/disable */ -#define QI_SQI_MASK ((uint8_t)0x02) /*!< SQI enable/disable */ - -/** - * @} - */ - -/** @defgroup LINK_QUALIF2 - * @{ - */ - -/** - * \brief LINK_QUALIF2 registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 PQI[7:0]: PQI value of the received packet - * \endcode - */ -#define LINK_QUALIF2_BASE ((uint8_t)(0xC5)) /*!< PQI value of the received packet */ - -/** - * @} - */ - -/** @defgroup LINK_QUALIF1 - * @{ - */ - -/** - * \brief LINK_QUALIF1 registers - * \code - * Default value: 0x00 - * Read - * - * 7 CS: Carrier Sense indication - * - * 6:0 SQI[6:0]: SQI value of the received packet - * \endcode - */ -#define LINK_QUALIF1_BASE ((uint8_t)(0xC6)) /*!< Carrier sense indication [7]; SQI value of the received packet */ - -#define LINK_QUALIF1_CS ((uint8_t)(0x80)) /*!< Carrier sense indication [7] */ - -/** - * @} - */ - -/** @defgroup LINK_QUALIF0 - * @{ - */ - -/** - * \brief LINK_QUALIF0 registers - * \code - * Default value: 0x00 - * Read - * - * 7:4 LQI [3:0]: LQI value of the received packet - * - * 3:0 AGC_WORD[3:0]: AGC word of the received packet - * \endcode - */ -#define LINK_QUALIF0_BASE ((uint8_t)(0xC7)) /*!< LQI value of the received packet [7:4]; AGC word of the received packet [3:0] */ - -/** - * @} - */ - -/** @defgroup RSSI_LEVEL - * @{ - */ - -/** - * \brief RSSI_LEVEL registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 RSSI_LEVEL[7:0]: RSSI level of the received packet - * \endcode - */ -#define RSSI_LEVEL_BASE ((uint8_t)(0xC8)) /*!< RSSI level of the received packet */ - -/** - * @} - */ - -/** @defgroup RSSI_FLT_Register - * @{ - */ - -/** - * \brief RSSI register - * \code - * Read Write - * Default value: 0xF3 - * 7:4 RSSI_FLT[3:0]: Gain of the RSSI filter - * - * 3:2 CS_MODE[1:0]: AFC loop gain in slow mode (2's log) - * - * CS_MODE1 | CS_MODE0 | CS Mode - * ----------------------------------------------------------------------------------------- - * 0 | 0 | Static CS - * 0 | 1 | Dynamic CS with 6dB dynamic threshold - * 1 | 0 | Dynamic CS with 12dB dynamic threshold - * 1 | 1 | Dynamic CS with 18dB dynamic threshold - * - * 1:0 OOK_PEAK_DECAY[1:0]: Peak decay control for OOK: 3 slow decay; 0 fast decay - * - * \endcode - */ -#define RSSI_FLT_BASE ((uint8_t)0x21) /*!< Gain of the RSSI filter; lower value is fast but inaccurate, - higher value is slow and more accurate */ -#define RSSI_FLT_CS_MODE_MASK ((uint8_t)0x0C) /*!< Carrier sense mode mask */ -#define RSSI_FLT_CS_MODE_STATIC ((uint8_t)0x00) /*!< Carrier sense mode; static carrier sensing */ -#define RSSI_FLT_CS_MODE_DYNAMIC_6 ((uint8_t)0x04) /*!< Carrier sense mode; dynamic carrier sensing with 6dB threshold */ -#define RSSI_FLT_CS_MODE_DYNAMIC_12 ((uint8_t)0x08) /*!< Carrier sense mode; dynamic carrier sensing with 12dB threshold */ -#define RSSI_FLT_CS_MODE_DYNAMIC_18 ((uint8_t)0x0C) /*!< Carrier sense mode; dynamic carrier sensing with 18dB threshold */ -#define RSSI_FLT_OOK_PEAK_DECAY_MASK ((uint8_t)0x03) /*!< Peak decay control for OOK mask */ -#define RSSI_FLT_OOK_PEAK_DECAY_FAST ((uint8_t)0x00) /*!< Peak decay control for OOK: fast decay */ -#define RSSI_FLT_OOK_PEAK_DECAY_MEDIUM_FAST ((uint8_t)0x01) /*!< Peak decay control for OOK: medium_fast decay */ -#define RSSI_FLT_OOK_PEAK_DECAY_MEDIUM_SLOW ((uint8_t)0x02) /*!< Peak decay control for OOK: medium_fast decay */ -#define RSSI_FLT_OOK_PEAK_DECAY_SLOW ((uint8_t)0x03) /*!< Peak decay control for OOK: slow decay */ - -/** - * @} - */ - -/** @defgroup RSSI_TH_Register - * @{ - */ - -/** - * \brief RSSI_TH register - * \code - * Read Write - * Default value: 0x24 - * - * 7:0 RSSI_THRESHOLD [7:0]: Signal detect threshold in 0.5dB. -120dBm corresponds to 20 - * \endcode - */ -#define RSSI_TH_BASE ((uint8_t)0x22) /*!< Signal detect threshold in 0.5dB stp. 20 correspond to -120 dBm */ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup FIFO_Registers - * @{ - */ - -/** @defgroup FIFO_CONFIG3_Register - * @{ - */ - -/** - * \brief FIFO_CONFIG3 registers - * \code - * Default value: 0x30 - * Read Write - * 7 Reserved. - * - * 6:0 rxafthr [6:0]: FIFO Almost Full threshold for rx fifo. - * - * \endcode - */ -#define FIFO_CONFIG3_RXAFTHR_BASE ((uint8_t)0x3E) /*!< FIFO Almost Full threshold for rx fifo [6:0] */ - -/** - * @} - */ - -/** @defgroup FIFO_CONFIG2_Register - * @{ - */ - -/** - * \brief FIFO_CONFIG2 registers - * \code - * Default value: 0x30 - * Read Write - * 7 Reserved. - * - * 6:0 rxaethr [6:0]: FIFO Almost Empty threshold for rx fifo. - * - * \endcode - */ -#define FIFO_CONFIG2_RXAETHR_BASE ((uint8_t)0x3F) /*!< FIFO Almost Empty threshold for rx fifo [6:0] */ - -/** - * @} - */ - -/** @defgroup FIFO_CONFIG1_Register - * @{ - */ - -/** - * \brief FIFO_CONFIG1 registers - * \code - * Default value: 0x30 - * Read Write - * 7 Reserved. - * - * 6:0 txafthr [6:0]: FIFO Almost Full threshold for tx fifo. - * - * \endcode - */ -#define FIFO_CONFIG1_TXAFTHR_BASE ((uint8_t)0x40) /*!< FIFO Almost Full threshold for tx fifo [6:0] */ - -/** - * @} - */ - -/** @defgroup FIFO_CONFIG0_Register - * @{ - */ - -/** - * \brief FIFO_CONFIG0 registers - * \code - * Default value: 0x30 - * Read Write - * 7 Reserved. - * - * 6:0 txaethr [6:0]: FIFO Almost Empty threshold for tx fifo. - * - * \endcode - */ -#define FIFO_CONFIG0_TXAETHR_BASE ((uint8_t)0x41) /*!< FIFO Almost Empty threshold for tx fifo [6:0] */ - -/** - * @} - */ - -/** @defgroup LINEAR_FIFO_STATUS1_Register - * @{ - */ - -/** - * \brief LINEAR_FIFO_STATUS1 registers - * \code - * Default value: 0x00 - * Read - * - * 7 Reserved. - * - * 6:0 elem_txfifo[6:0]: Number of elements in the linear TXFIFO (<=96) - * \endcode - */ -#define LINEAR_FIFO_STATUS1_BASE ((uint8_t)(0xE6)) /*!< Number of elements in the linear TX FIFO [6:0] (<=96) */ - -/** - * @} - */ - -/** @defgroup LINEAR_FIFO_STATUS0_Register - * @{ - */ - -/** - * \brief LINEAR_FIFO_STATUS0 registers - * \code - * Default value: 0x00 - * Read - * - * 7 Reserved. - * - * 6:0 elem_rxfifo[6:0]: Number of elements in the linear RXFIFO (<=96) - * \endcode - */ -#define LINEAR_FIFO_STATUS0_BASE ((uint8_t)(0xE7)) /*!< Number of elements in the linear RX FIFO [6:0] (<=96) */ - -/** - * @} - */ - - -/** - * @} - */ - - -/** @defgroup Calibration_Registers - * @{ - */ - -/** @defgroup RCO_VCO_CALIBR_IN2_Register - * @{ - */ - -/** - * \brief RCO_VCO_CALIBR_IN2 registers - * \code - * Default value: 0x70 - * Read Write - * 7:4 RWT_IN[3:0]: RaWThermometric word value for the RCO [7:4] - * - * 3:0 RFB_IN[4:1]: ResistorFineBit word value for the RCO (first 4 bits) - * \endcode - */ -#define RCO_VCO_CALIBR_IN2_BASE ((uint8_t)0x6D) /*!< RaWThermometric word value for the RCO [7:4]; ResistorFineBit word value for the RCO [3:0] */ - -/** - * @} - */ - -/** @defgroup RCO_VCO_CALIBR_IN1_Register - * @{ - */ - -/** - * \brief RCO_VCO_CALIBR_IN1 registers - * \code - * Default value: 0x48 - * Read Write - * - * 7 RFB_IN[0]: ResistorFineBit word value for the RCO (LSb) - * - * 6:0 VCO_CALIBR_TX[6:0]: Word value for the VCO to be used in TX mode - * \endcode - */ -#define RCO_VCO_CALIBR_IN1_BASE ((uint8_t)0x6E) /*!< ResistorFineBit word value for the RCO [7]; Word value for the VCO to be used in TX mode [6:0]*/ - -/** - * @} - */ - -/** @defgroup RCO_VCO_CALIBR_IN0_Register - * @{ - */ - -/** - * \brief RCO_VCO_CALIBR_IN0 registers - * \code - * Default value: 0x48 - * Read Write - * - * 7 Reserved. - * - * 6:0 VCO_CALIBR_RX[6:0]: Word value for the VCO to be used in RX mode - * \endcode - */ -#define RCO_VCO_CALIBR_IN0_BASE ((uint8_t)0x6F) /*!< Word value for the VCO to be used in RX mode [6:0] */ - -/** - * @} - */ - -/** @defgroup RCO_VCO_CALIBR_OUT1_Register - * @{ - */ - -/** - * \brief RCO_VCO_CALIBR_OUT1 registers - * \code - * Default value: 0x00 - * Read - * - * 7:4 RWT_OUT[3:0]: RWT word from internal RCO calibrator - * - * 3:0 RFB_OUT[4:1]: RFB word from internal RCO calibrator (upper part) - * \endcode - */ -#define RCO_VCO_CALIBR_OUT1_BASE ((uint8_t)(0xE4)) /*!< RaWThermometric RWT word from internal RCO calibrator [7]; - ResistorFineBit RFB word from internal RCO oscillator [6:0] */ -/** - * @} - */ - -/** @defgroup RCO_VCO_CALIBR_OUT0_Register - * @{ - */ - -/** - * \brief RCO_VCO_CALIBR_OUT0 registers - * \code - * Default value: 0x00 - * Read - * - * 7 RFB_OUT[0]: RFB word from internal RCO calibrator (last bit LSB) - * - * 6:0 VCO_CALIBR_DATA[6:0]: Output word from internal VCO calibrator - * \endcode - */ -#define RCO_VCO_CALIBR_OUT0_BASE ((uint8_t)(0xE5)) /*!< ResistorFineBit RFB word from internal RCO oscillator [0]; - Output word from internal calibrator [6:0]; */ -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup AES_Registers - * @{ - */ - -/** @defgroup AES_KEY_IN_Register - * @{ - */ - -/** - * \brief AES_KEY_INx registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 AES_KEY_INx[7:0]: AES engine key input (total - 128 bits) - * \endcode - */ -#define AES_KEY_IN_15_BASE ((uint8_t)0x70) /*!< AES engine key input 15 */ - -#define AES_KEY_IN_14_BASE ((uint8_t)0x71) /*!< AES engine key input 14 */ - -#define AES_KEY_IN_13_BASE ((uint8_t)0x72) /*!< AES engine key input 13 */ - -#define AES_KEY_IN_12_BASE ((uint8_t)0x73) /*!< AES engine key input 12 */ - -#define AES_KEY_IN_11_BASE ((uint8_t)0x74) /*!< AES engine key input 11 */ - -#define AES_KEY_IN_10_BASE ((uint8_t)0x75) /*!< AES engine key input 10 */ - -#define AES_KEY_IN_9_BASE ((uint8_t)0x76) /*!< AES engine key input 9 */ - -#define AES_KEY_IN_8_BASE ((uint8_t)0x77) /*!< AES engine key input 8 */ - -#define AES_KEY_IN_7_BASE ((uint8_t)0x78) /*!< AES engine key input 7 */ - -#define AES_KEY_IN_6_BASE ((uint8_t)0x79) /*!< AES engine key input 6 */ - -#define AES_KEY_IN_5_BASE ((uint8_t)0x7A) /*!< AES engine key input 5 */ - -#define AES_KEY_IN_4_BASE ((uint8_t)0x7B) /*!< AES engine key input 4 */ - -#define AES_KEY_IN_3_BASE ((uint8_t)0x7C) /*!< AES engine key input 3 */ - -#define AES_KEY_IN_2_BASE ((uint8_t)0x7D) /*!< AES engine key input 2 */ - -#define AES_KEY_IN_1_BASE ((uint8_t)0x7E) /*!< AES engine key input 1 */ - -#define AES_KEY_IN_0_BASE ((uint8_t)0x7F) /*!< AES engine key input 0 */ - -/** - * @} - */ - -/** @defgroup AES_DATA_IN_Register - * @{ - */ - -/** - * \brief AES_DATA_INx registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 AES_DATA_INx[7:0]: AES engine data input (total - 128 bits) - * \endcode - */ -#define AES_DATA_IN_15_BASE ((uint8_t)0x80) /*!< AES engine data input 15 - Take care: Address is in reverse order respect data numbering; eg.: 0x81 -> AES_data14[7:0] */ -#define AES_DATA_IN_14_BASE ((uint8_t)0x81) /*!< AES engine data input 14 */ - -#define AES_DATA_IN_13_BASE ((uint8_t)0x82) /*!< AES engine data input 13 */ - -#define AES_DATA_IN_12_BASE ((uint8_t)0x83) /*!< AES engine data input 12 */ - -#define AES_DATA_IN_11_BASE ((uint8_t)0x84) /*!< AES engine data input 11 */ - -#define AES_DATA_IN_10_BASE ((uint8_t)0x85) /*!< AES engine data input 10 */ - -#define AES_DATA_IN_9_BASE ((uint8_t)0x86) /*!< AES engine data input 9 */ - -#define AES_DATA_IN_8_BASE ((uint8_t)0x87) /*!< AES engine data input 8 */ - -#define AES_DATA_IN_7_BASE ((uint8_t)0x88) /*!< AES engine data input 7 */ - -#define AES_DATA_IN_6_BASE ((uint8_t)0x89) /*!< AES engine data input 6 */ - -#define AES_DATA_IN_5_BASE ((uint8_t)0x8A) /*!< AES engine data input 5 */ - -#define AES_DATA_IN_4_BASE ((uint8_t)0x8B) /*!< AES engine data input 4 */ - -#define AES_DATA_IN_3_BASE ((uint8_t)0x8C) /*!< AES engine data input 3 */ - -#define AES_DATA_IN_2_BASE ((uint8_t)0x8D) /*!< AES engine data input 2 */ - -#define AES_DATA_IN_1_BASE ((uint8_t)0x8E) /*!< AES engine data input 1 */ - -#define AES_DATA_IN_0_BASE ((uint8_t)0x8F) /*!< AES engine data input 0 */ - -/** - * @} - */ - -/** @defgroup AES_DATA_OUT_Register - * @{ - */ - -/** - * \brief AES_DATA_OUT[15:0] registers - * \code - * Default value: 0x00 - * Read - * - * 7:0 AES_DATA_OUTx[7:0]: AES engine data output (128 bits) - * \endcode - */ -#define AES_DATA_OUT_15_BASE ((uint8_t)(0xD4)) /*!< AES engine data output 15 */ - -#define AES_DATA_OUT_14_BASE ((uint8_t)(0xD5)) /*!< AES engine data output 14 */ - -#define AES_DATA_OUT_13_BASE ((uint8_t)(0xD6)) /*!< AES engine data output 13 */ - -#define AES_DATA_OUT_12_BASE ((uint8_t)(0xD7)) /*!< AES engine data output 12 */ - -#define AES_DATA_OUT_11_BASE ((uint8_t)(0xD8)) /*!< AES engine data output 11 */ - -#define AES_DATA_OUT_10_BASE ((uint8_t)(0xD9)) /*!< AES engine data output 10 */ - -#define AES_DATA_OUT_9_BASE ((uint8_t)(0xDA)) /*!< AES engine data output 9 */ - -#define AES_DATA_OUT_8_BASE ((uint8_t)(0xDB)) /*!< AES engine data output 8 */ - -#define AES_DATA_OUT_7_BASE ((uint8_t)(0xDC)) /*!< AES engine data output 7 */ - -#define AES_DATA_OUT_6_BASE ((uint8_t)(0xDD)) /*!< AES engine data output 6 */ - -#define AES_DATA_OUT_5_BASE ((uint8_t)(0xDE)) /*!< AES engine data output 5 */ - -#define AES_DATA_OUT_4_BASE ((uint8_t)(0xDF)) /*!< AES engine data output 4 */ - -#define AES_DATA_OUT_3_BASE ((uint8_t)(0xE0)) /*!< AES engine data output 3 */ - -#define AES_DATA_OUT_2_BASE ((uint8_t)(0xE1)) /*!< AES engine data output 2 */ - -#define AES_DATA_OUT_1_BASE ((uint8_t)(0xE2)) /*!< AES engine data output 1 */ - -#define AES_DATA_OUT_0_BASE ((uint8_t)(0xE3)) /*!< AES engine data output 0 */ - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup IRQ_Registers - * @{ - */ - -/** @defgroup IRQ_MASK0_Register - * @{ - */ - -/** - * \brief IRQ_MASK0 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_MASK0: IRQ mask, if the correspondent bit is set and IRQ can be generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 0 | RX data ready - * 1 | RX data discarded (upon filtering) - * 2 | TX data sent - * 3 | Max re-TX reached - * 4 | CRC error - * 5 | TX FIFO underflow/overflow error - * 6 | RX FIFO underflow/overflow error - * 7 | TX FIFO almost full - * \endcode - */ - - -#define IRQ_MASK0_BASE ((uint8_t)0x93) /*!< IRQ_MASK is split into 4 registers*/ - -#define IRQ_MASK0_RX_DATA_READY ((uint8_t)0x01) /*!< IRQ: RX data ready */ -#define IRQ_MASK0_RX_DATA_DISC ((uint8_t)0x02) /*!< IRQ: RX data discarded (upon filtering) */ -#define IRQ_MASK0_TX_DATA_SENT ((uint8_t)0x04) /*!< IRQ: TX data sent */ -#define IRQ_MASK0_MAX_RE_TX_REACH ((uint8_t)0x08) /*!< IRQ: Max re-TX reached */ -#define IRQ_MASK0_CRC_ERROR ((uint8_t)0x10) /*!< IRQ: CRC error */ -#define IRQ_MASK0_TX_FIFO_ERROR ((uint8_t)0x20) /*!< IRQ: TX FIFO underflow/overflow error */ -#define IRQ_MASK0_RX_FIFO_ERROR ((uint8_t)0x40) /*!< IRQ: RX FIFO underflow/overflow error */ -#define IRQ_MASK0_TX_FIFO_ALMOST_FULL ((uint8_t)0x80) /*!< IRQ: TX FIFO almost full */ - -/** - * @} - */ - -/** @defgroup IRQ_MASK1_Register - * @{ - */ - -/** - * \brief IRQ_MASK1 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_MASK1: IRQ mask, if the correspondent bit is set and IRQ can be generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 8 | TX FIFO almost empty - * 9 | RX FIFO almost full - * 10 | RX FIFO almost empty - * 11 | Max number of back-off during CCA - * 12 | Valid preamble detected - * 13 | Sync word detected - * 14 | RSSI above threshold (Carrier Sense) - * 15 | Wake-up timeout in LDCR mode13 - * \endcode - */ - -#define IRQ_MASK1_BASE ((uint8_t)0x92) /*!< IRQ_MASK is split into 4 registers*/ - -#define IRQ_MASK1_TX_FIFO_ALMOST_EMPTY ((uint8_t)0x01) /*!< IRQ: TX FIFO almost empty */ -#define IRQ_MASK1_RX_FIFO_ALMOST_FULL ((uint8_t)0x02) /*!< IRQ: RX FIFO almost full */ -#define IRQ_MASK1_RX_FIFO_ALMOST_EMPTY ((uint8_t)0x04) /*!< IRQ: RX FIFO almost empty */ -#define IRQ_MASK1_MAX_BO_CCA_REACH ((uint8_t)0x08) /*!< IRQ: Max number of back-off during CCA */ -#define IRQ_MASK1_VALID_PREAMBLE ((uint8_t)0x10) /*!< IRQ: Valid preamble detected */ -#define IRQ_MASK1_VALID_SYNC ((uint8_t)0x20) /*!< IRQ: Sync word detected */ -#define IRQ_MASK1_RSSI_ABOVE_TH ((uint8_t)0x40) /*!< IRQ: RSSI above threshold */ -#define IRQ_MASK1_WKUP_TOUT_LDC ((uint8_t)0x80) /*!< IRQ: Wake-up timeout in LDC mode */ - -/** - * @} - */ - -/** @defgroup IRQ_MASK2_Register - * @{ - */ - -/** - * \brief IRQ_MASK2 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_MASK2: IRQ mask, if the correspondent bit is set and IRQ can be generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 16 | READY state in steady condition14 - * 17 | STANDBY state switching in progress - * 18 | Low battery level - * 19 | Power-On reset - * 20 | Brown-Out event - * 21 | LOCK state in steady condition - * 22 | PM start-up timer expiration - * 23 | XO settling timeout - * \endcode - */ -#define IRQ_MASK2_BASE ((uint8_t)0x91) /*!< IRQ_MASK is split into 4 registers*/ - -#define IRQ_MASK2_READY ((uint8_t)0x01) /*!< IRQ: READY state */ -#define IRQ_MASK2_STANDBY_DELAYED ((uint8_t)0x02) /*!< IRQ: STANDBY state after MCU_CK_CONF_CLOCK_TAIL_X clock cycles */ -#define IRQ_MASK2_LOW_BATT_LVL ((uint8_t)0x04) /*!< IRQ: Battery level below threshold*/ -#define IRQ_MASK2_POR ((uint8_t)0x08) /*!< IRQ: Power On Reset */ -#define IRQ_MASK2_BOR ((uint8_t)0x10) /*!< IRQ: Brown out event (both accurate and inaccurate)*/ -#define IRQ_MASK2_LOCK ((uint8_t)0x20) /*!< IRQ: LOCK state */ -#define IRQ_MASK2_PM_COUNT_EXPIRED ((uint8_t)0x40) /*!< IRQ: only for debug; Power Management startup timer expiration (see reg PM_START_COUNTER, 0xB5) */ -#define IRQ_MASK2_XO_COUNT_EXPIRED ((uint8_t)0x80) /*!< IRQ: only for debug; Crystal oscillator settling time counter expired */ - -/** - * @} - */ - -/** @defgroup IRQ_MASK3_Register - * @{ - */ - -/** - * \brief IRQ_MASK3 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_MASK3: IRQ mask, if the correspondent bit is set and IRQ can be generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 24 | SYNTH locking timeout - * 25 | SYNTH calibration start-up time - * 26 | SYNTH calibration timeout - * 27 | TX circuitry start-up time - * 28 | RX circuitry start-up time - * 29 | RX operation timeout - * 30 | Others AES Endof Operation - * 31 | Reserved - * \endcode - */ -#define IRQ_MASK3_BASE ((uint8_t)0x90) /*!< IRQ_MASK is split into 4 registers*/ - -#define IRQ_MASK3_SYNTH_LOCK_TIMEOUT ((uint8_t)0x01) /*!< IRQ: only for debug; LOCK state timeout */ -#define IRQ_MASK3_SYNTH_LOCK_STARTUP ((uint8_t)0x02) /*!< IRQ: only for debug; see CALIBR_START_COUNTER */ -#define IRQ_MASK3_SYNTH_CAL_TIMEOUT ((uint8_t)0x04) /*!< IRQ: only for debug; SYNTH calibration timeout */ -#define IRQ_MASK3_TX_START_TIME ((uint8_t)0x08) /*!< IRQ: only for debug; TX circuitry startup time; see TX_START_COUNTER */ -#define IRQ_MASK3_RX_START_TIME ((uint8_t)0x10) /*!< IRQ: only for debug; RX circuitry startup time; see TX_START_COUNTER */ -#define IRQ_MASK3_RX_TIMEOUT ((uint8_t)0x20) /*!< IRQ: RX operation timeout */ -#define IRQ_MASK3_AES_END ((uint8_t)0x40) /*!< IRQ: AES End of operation */ - -/** - * @} - */ - - -/** @defgroup IRQ_STATUS0_Register - * @{ - */ - -/** - * \brief IRQ_STATUS0 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_STATUS0: IRQ status, if the correspondent bit is set and IRQ has been generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 0 | RX data ready - * 1 | RX data discarded (upon filtering) - * 2 | TX data sent - * 3 | Max re-TX reached - * 4 | CRC error - * 5 | TX FIFO underflow/overflow error - * 6 | RX FIFO underflow/overflow error - * 7 | TX FIFO almost full - * \endcode - */ - -#define IRQ_STATUS0_BASE ((uint8_t)(0xFD)) /*!< IRQ Events(RR, split into 4 registers) */ - -#define IRQ_STATUS0_SYNTH_LOCK_TIMEOUT ((uint8_t)(0x01)) /*!< IRQ: LOCK state timeout */ -#define IRQ_STATUS0_SYNTH_LOCK_STARTUP ((uint8_t)(0x02)) /*!< IRQ: only for debug; see CALIBR_START_COUNTER */ -#define IRQ_STATUS0_SYNTH_CAL_TIMEOUT ((uint8_t)(0x04)) /*!< IRQ: SYNTH locking timeout */ -#define IRQ_STATUS0_TX_START_TIME ((uint8_t)(0x08)) /*!< IRQ: only for debug; TX circuitry startup time; see TX_START_COUNTER */ -#define IRQ_STATUS0_RX_START_TIME ((uint8_t)(0x10)) /*!< IRQ: only for debug; RX circuitry startup time; see TX_START_COUNTER */ -#define IRQ_STATUS0_RX_TIMEOUT ((uint8_t)(0x20)) /*!< IRQ: RX operation timeout expiration */ -#define IRQ_STATUS0_AES_END ((uint8_t)(0x40)) /*!< IRQ: AES End of operation */ - -/** - * @} - */ - -/** @defgroup IRQ_STATUS1_Register - * @{ - */ - -/** - * \brief IRQ_STATUS1 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_STATUS1: IRQ status, if the correspondent bit is set and IRQ has been generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 8 | TX FIFO almost empty - * 9 | RX FIFO almost full - * 10 | RX FIFO almost empty - * 11 | Max number of back-off during CCA - * 12 | Valid preamble detected - * 13 | Sync word detected - * 14 | RSSI above threshold (Carrier Sense) - * 15 | Wake-up timeout in LDCR mode13 - * \endcode - */ - -#define IRQ_STATUS1_BASE ((uint8_t)(0xFC)) /*!< IRQ Events(RR, split into 4 registers) */ - -#define IRQ_STATUS1_READY ((uint8_t)(0x01)) /*!< IRQ: READY state in steady condition*/ -#define IRQ_STATUS1_STANDBY_DELAYED ((uint8_t)(0x02)) /*!< IRQ: STANDBY state after MCU_CK_CONF_CLOCK_TAIL_X clock cycles */ -#define IRQ_STATUS1_LOW_BATT_LVL ((uint8_t)(0x04)) /*!< IRQ: Battery level below threshold*/ -#define IRQ_STATUS1_POR ((uint8_t)(0x08)) /*!< IRQ: Power On Reset */ -#define IRQ_STATUS1_BOR ((uint8_t)(0x10)) /*!< IRQ: Brown out event (both accurate and inaccurate)*/ -#define IRQ_STATUS1_LOCK ((uint8_t)(0x20)) /*!< IRQ: LOCK state in steady condition */ -#define IRQ_STATUS1_PM_COUNT_EXPIRED ((uint8_t)(0x40)) /*!< IRQ: Power Management startup timer expiration (see reg PM_START_COUNTER, 0xB5) */ -#define IRQ_STATUS1_XO_COUNT_EXPIRED ((uint8_t)(0x80)) /*!< IRQ: Crystal oscillator settling time counter expired */ - -/** - * @} - */ - -/** @defgroup IRQ_STATUS2_Register - * @{ - */ - -/** - * \brief IRQ_STATUS2 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_STATUS2: IRQ status, if the correspondent bit is set and IRQ has been generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 16 | READY state in steady condition14 - * 17 | STANDBY state switching in progress - * 18 | Low battery level - * 19 | Power-On reset - * 20 | Brown-Out event - * 21 | LOCK state in steady condition - * 22 | PM start-up timer expiration - * 23 | XO settling timeout - * \endcode - */ - -#define IRQ_STATUS2_BASE ((uint8_t)0xFB) /*!< IRQ Events(RR, split into 4 registers) */ - -#define IRQ_STATUS2_TX_FIFO_ALMOST_EMPTY ((uint8_t)0x01) /*!< IRQ: TX FIFO almost empty */ -#define IRQ_STATUS2_RX_FIFO_ALMOST_FULL ((uint8_t)0x02) /*!< IRQ: RX FIFO almost full */ -#define IRQ_STATUS2_RX_FIFO_ALMOST_EMPTY ((uint8_t)0x04) /*!< IRQ: RX FIFO almost empty */ -#define IRQ_STATUS2_MAX_BO_CCA_REACH ((uint8_t)0x08) /*!< IRQ: Max number of back-off during CCA */ -#define IRQ_STATUS2_VALID_PREAMBLE ((uint8_t)0x10) /*!< IRQ: Valid preamble detected */ -#define IRQ_STATUS2_VALID_SYNC ((uint8_t)0x20) /*!< IRQ: Sync word detected */ -#define IRQ_STATUS2_RSSI_ABOVE_TH ((uint8_t)(0x40)) /*!< IRQ: RSSI above threshold */ -#define IRQ_STATUS2_WKUP_TOUT_LDC ((uint8_t)(0x80)) /*!< IRQ: Wake-up timeout in LDC mode */ - -/** - * @} - */ - -/** @defgroup IRQ_STATUS3_Register - * @{ - */ - -/** - * \brief IRQ_STATUS3 registers - * \code - * Default value: 0x00 - * Read Write - * - * 7:0 INT_STATUS3: IRQ status, if the correspondent bit is set and IRQ has been generated (according to the next table) - * - * Bit | Events Group Interrupt Event - * ------------------------------------------------------- - * 24 | SYNTH locking timeout - * 25 | SYNTH calibration start-up time - * 26 | SYNTH calibration timeout - * 27 | TX circuitry start-up time - * 28 | RX circuitry start-up time - * 29 | RX operation timeout - * 30 | Others AES Endof Operation - * 31 | Reserved - * \endcode - */ -#define IRQ_STATUS3_BASE ((uint8_t)0xFA) /*!< IRQ Events(RR, split into 4 registers) */ - -#define IRQ_STATUS3_RX_DATA_READY ((uint8_t)0x01) /*!< IRQ: RX data ready */ -#define IRQ_STATUS3_RX_DATA_DISC ((uint8_t)0x02) /*!< IRQ: RX data discarded (upon filtering) */ -#define IRQ_STATUS3_TX_DATA_SENT ((uint8_t)0x04) /*!< IRQ: TX data sent */ -#define IRQ_STATUS3_MAX_RE_TX_REACH ((uint8_t)0x08) /*!< IRQ: Max re-TX reached */ -#define IRQ_STATUS3_CRC_ERROR ((uint8_t)0x10) /*!< IRQ: CRC error */ -#define IRQ_STATUS3_TX_FIFO_ERROR ((uint8_t)0x20) /*!< IRQ: TX FIFO underflow/overflow error */ -#define IRQ_STATUS3_RX_FIFO_ERROR ((uint8_t)0x40) /*!< IRQ: RX FIFO underflow/overflow error */ -#define IRQ_STATUS3_TX_FIFO_ALMOST_FULL ((uint8_t)0x80) /*!< IRQ: TX FIFO almost full */ - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup MC_STATE_Registers - * @{ - */ - -/** @defgroup MC_STATE1_Register - * @{ - */ - -/** - * \brief MC_STATE1 registers - * \code - * Default value: 0x50 - * Read - * - * 7:4 Reserved. - * - * 3 ANT_SELECT: Currently selected antenna - * - * 2 TX_FIFO_Full: 1 - TX FIFO is full - * - * 1 RX_FIFO_Empty: 1 - RX FIFO is empty - * - * 0 ERROR_LOCK: 1 - RCO calibrator error - * \endcode - */ -#define MC_STATE1_BASE ((uint8_t)(0xC0)) /*!< MC_STATE1 register address (see the SpiritStatus struct */ - - -/** - * @} - */ - - -/** @defgroup MC_STATE0_Register - * @{ - */ - -/** - * \brief MC_STATE0 registers - * \code - * Default value: 0x00 - * Read - * - * 7:1 STATE[6:0]: Current MC state. - * - * REGISTER VALUE | STATE - * -------------------------------------------- - * 0x40 | STANDBY - * 0x36 | SLEEP - * 0x03 | READY - * 0x3B | PM setup - * 0x23 | XO settling - * 0x53 | SYNTH setup - * 0x1F | PROTOCOL - * 0x4F | SYNTH calibration - * 0x0F | LOCK - * 0x33 | RX - * 0x5F | TX - * - * 0 XO_ON: 1 - XO is operating - * \endcode - */ -#define MC_STATE0_BASE ((uint8_t)(0xC1)) /*!< MC_STATE0 register address. In this version ALL existing states have been inserted - and are still to be verified */ -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup Engineering-Test_Registers - * @{ - */ - -#define SYNTH_CONFIG1_BASE ((uint8_t)(0x9E)) /*!< Synthesizier registers: M, A, K data sync on positive/negative clock edges [4], - Enable Linearization of the charge pump [3], split time 1.75/3.45ns [2], VCO calibration window 16,32,64,128 clock cycles [1:0]*/ -#define SYNTH_CONFIG0_BASE ((uint8_t)(0x9F)) /*!< Enable DSM randomizer [7], Window width 1.2-7.5ns (Down-up) of lock detector*/ -#define VCOTH_BASE ((uint8_t)(0xA0)) /*!< Controls the threshold frequency between VCO low and VCO high [7:0] - VCOth frequency=2*fXO*(96+VCO_TH/16), fmin=4992 MHz, fmax=5820 MHz*/ -#define PM_CONFIG2_BASE ((uint8_t)(0xA4)) /*!< Enables high current buffer on Temperature sensor, sets SMPS options */ -#define PM_CONFIG1_BASE ((uint8_t)(0xA5)) /*!< Set SMPS options */ -#define PM_CONFIG0_BASE ((uint8_t)(0xA6)) /*!< Set SMPS options */ -#define VCO_CONFIG_BASE ((uint8_t)(0xA1)) /*!< Set VCO current [5:2]part and [1:0] part */ -#define XO_CONFIG_BASE ((uint8_t)(0xA7)) /*!< Clock management options from XO to digital part */ - -#define XO_RCO_TEST_BASE ((uint8_t)(0xB4)) /*!< Test of XO and RCO */ - -/** - * @} - */ - - -/** @addtogroup Commands - * @{ - */ - -#define COMMAND_TX ((uint8_t)(0x60)) /*!< Start to transmit; valid only from READY */ -#define COMMAND_RX ((uint8_t)(0x61)) /*!< Start to receive; valid only from READY */ -#define COMMAND_READY ((uint8_t)(0x62)) /*!< Go to READY; valid only from STANDBY or SLEEP or LOCK */ -#define COMMAND_STANDBY ((uint8_t)(0x63)) /*!< Go to STANDBY; valid only from READY */ -#define COMMAND_SLEEP ((uint8_t)(0x64)) /*!< Go to SLEEP; valid only from READY */ -#define COMMAND_LOCKRX ((uint8_t)(0x65)) /*!< Go to LOCK state by using the RX configuration of the synth; valid only from READY */ -#define COMMAND_LOCKTX ((uint8_t)(0x66)) /*!< Go to LOCK state by using the TX configuration of the synth; valid only from READY */ -#define COMMAND_SABORT ((uint8_t)(0x67)) /*!< Force exit form TX or RX states and go to READY state; valid only from TX or RX */ -#define COMMAND_LDC_RELOAD ((uint8_t)(0x68)) /*!< LDC Mode: Reload the LDC timer with the value stored in the LDC_PRESCALER / COUNTER - registers; valid from all states */ -#define COMMAND_SEQUENCE_UPDATE ((uint8_t)(0x69)) /*!< Autoretransmission: Reload the Packet sequence counter with the value stored in the PROTOCOL[2] register - valid from all states */ -#define COMMAND_AES_ENC ((uint8_t)(0x6A)) /*!< AES: Start the encryption routine; valid from all states; valid from all states */ -#define COMMAND_AES_KEY ((uint8_t)(0x6B)) /*!< AES: Start the procedure to compute the key for the decryption; valid from all states */ -#define COMMAND_AES_DEC ((uint8_t)(0x6C)) /*!< AES: Start the decryption routine using the current key; valid from all states */ -#define COMMAND_AES_KEY_DEC ((uint8_t)(0x6D)) /*!< AES: Compute the key and start the decryption; valid from all states */ -#define COMMAND_SRES ((uint8_t)(0x70)) /*!< Reset of all digital part, except SPI registers */ -#define COMMAND_FLUSHRXFIFO ((uint8_t)(0x71)) /*!< Clean the RX FIFO; valid from all states */ -#define COMMAND_FLUSHTXFIFO ((uint8_t)(0x72)) /*!< Clean the TX FIFO; valid from all states */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Timer.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Timer.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,239 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Timer.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT timers. - * @details - * - * This module provides API to configure the Spirit timing mechanisms. - * They allow the user to set the timer registers using raw values or - * compute them since the desired timer value is expressed in ms. - * Moreover the management of the Spirit LDCR mode can be done using - * these API. - * - * <b>Example:</b> - * @code - * ... - * - * SpiritTimerSetRxTimeoutMs(50.0); - * SpiritTimerSetWakeUpTimerMs(150.0); - * - * // IRQ configuration for RX_TIMEOUT and WAKEUP_TIMEOUT - * ... - * - * SpiritTimerLdcrMode(S_ENABLE); - * - * ... - * - * @endcode - * - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT1_TIMER_H -#define __SPIRIT1_TIMER_H - - -/* Includes ------------------------------------------------------------------*/ - -#include "SPIRIT_Regs.h" -#include "SPIRIT_Types.h" - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Timer Timer - * @brief Configuration and management of SPIRIT Timers. - * @details See the file <i>@ref SPIRIT_Timer.h</i> for more details. - * @{ - */ - - -/** - * @defgroup Timer_Exported_Types Timer Exported Types - * @{ - */ - -/** - * @brief All the possible RX timeout stop conditions enumeration. - */ -typedef enum{ - - NO_TIMEOUT_STOP = 0x00, /*!< Timeout never stopped */ - TIMEOUT_ALWAYS_STOPPED = 0x08, /*!< Timeout always stopped (default) */ - RSSI_ABOVE_THRESHOLD = 0x04, /*!< Timeout stopped on RSSI above threshold */ - SQI_ABOVE_THRESHOLD = 0x02, /*!< Timeout stopped on SQI above threshold */ - PQI_ABOVE_THRESHOLD = 0x01, /*!< Timeout stopped on PQI above threshold */ - RSSI_AND_SQI_ABOVE_THRESHOLD = 0x06, /*!< Timeout stopped on both RSSI and SQI above threshold */ - RSSI_AND_PQI_ABOVE_THRESHOLD = 0x05, /*!< Timeout stopped on both RSSI and PQI above threshold */ - SQI_AND_PQI_ABOVE_THRESHOLD = 0x03, /*!< Timeout stopped on both SQI and PQI above threshold */ - ALL_ABOVE_THRESHOLD = 0x07, /*!< Timeout stopped only if RSSI, SQI and PQI are above threshold */ - RSSI_OR_SQI_ABOVE_THRESHOLD = 0x0E, /*!< Timeout stopped if one between RSSI or SQI are above threshold */ - RSSI_OR_PQI_ABOVE_THRESHOLD = 0x0D, /*!< Timeout stopped if one between RSSI or PQI are above threshold */ - SQI_OR_PQI_ABOVE_THRESHOLD = 0x0B, /*!< Timeout stopped if one between SQI or PQI are above threshold */ - ANY_ABOVE_THRESHOLD = 0x0F /*!< Timeout stopped if one among RSSI, SQI or SQI are above threshold */ - -} RxTimeoutStopCondition; - - -#define IS_RX_TIMEOUT_STOP_CONDITION(COND) ( COND == NO_TIMEOUT_STOP || \ - COND == TIMEOUT_ALWAYS_STOPPED || \ - COND == RSSI_ABOVE_THRESHOLD || \ - COND == SQI_ABOVE_THRESHOLD || \ - COND == PQI_ABOVE_THRESHOLD || \ - COND == RSSI_AND_SQI_ABOVE_THRESHOLD || \ - COND == RSSI_AND_PQI_ABOVE_THRESHOLD || \ - COND == SQI_AND_PQI_ABOVE_THRESHOLD || \ - COND == ALL_ABOVE_THRESHOLD || \ - COND == RSSI_OR_SQI_ABOVE_THRESHOLD || \ - COND == RSSI_OR_PQI_ABOVE_THRESHOLD || \ - COND == SQI_OR_PQI_ABOVE_THRESHOLD || \ - COND == ANY_ABOVE_THRESHOLD ) - - - -/** - * @} - */ - - -/** - * @defgroup Timer_Exported_Constants Timer Exported Constants - * @{ - */ - -/** - * @brief It represents the Time Step for RX_Timeout timer in case of 24 MHz Crystal, expressed in us. - * It is equal to 1210/(24*10^6). With this time step it is possible to fix the RX_Timeout to - * a minimum value of 50.417us to a maximum value of about 3.278 s. - * Remember that it is possible to have infinite RX_Timeout writing 0 in the RX_Timeout_Counter and/or RX_Timeout_Prescaler registers. - */ -#define RX_TCLK_24MHz 50.417f -#define IS_RX_TIMEOUT_24MHz(TIMEOUT) (TIMEOUT*1000)>=RX_TCLK_24MHz - -/** - * @brief It represents the Time Step for RX_Timeout timer in case of 26 MHz Crystal, expressed in us. - * It is equal to 1210/(26*10^6). With this time step it is possible to fix the RX_Timeout to - * a minimum value of 46.538us to a maximum value of about 3.026 s. - * Remember that it is possible to have infinite RX_Timeout writing 0 in the RX_Timeout_Counter register. - */ -#define RX_TCLK_26MHz 46.538f -#define IS_RX_TIMEOUT_26MHz(TIMEOUT) (TIMEOUT*1000)>=RX_TCLK_26MHz - -/** - * @brief It represents the Time Step for RX_Wakeup timer expressed in us. This timer is based on RCO (about 34.7 kHZ). - * With this time step it is possible to fix the Wakeup_Timeout to a minimum value of 28.818us to a maximum - * value of about 1.888 s. - */ -#define WAKEUP_TCLK 28.818f -#define IS_WKUP_TIMEOUT(TIMEOUT) (TIMEOUT*1000)>=WAKEUP_TCLK - - - -/** - * @} - */ - - -/** - * @defgroup Timer_Exported_Macros Timer Exported Macros - * @{ - */ - -#define SET_INFINITE_RX_TIMEOUT() SpiritTimerSetRxTimeoutCounter(0) - -/** - * @} - */ - - -/** - * @defgroup Timer_Exported_Functions Timer Exported Functions - * @{ - */ - -void SpiritTimerLdcrMode(SpiritFunctionalState xNewState); -void SpiritTimerLdcrAutoReload(SpiritFunctionalState xNewState); -SpiritFunctionalState SpiritTimerLdcrGetAutoReload(void); -void SpiritTimerSetRxTimeout(uint8_t cCounter , uint8_t cPrescaler); -void SpiritTimerSetRxTimeoutMs(float fDesiredMsec); -void SpiritTimerSetRxTimeoutCounter(uint8_t cCounter); -void SpiritTimerSetRxTimeoutPrescaler(uint8_t cPrescaler); -void SpiritTimerGetRxTimeout(float* pfTimeoutMsec, uint8_t* pcCounter , uint8_t* pcPrescaler); -void SpiritTimerSetWakeUpTimer(uint8_t cCounter , uint8_t cPrescaler); -void SpiritTimerSetWakeUpTimerMs(float fDesiredMsec); -void SpiritTimerSetWakeUpTimerCounter(uint8_t cCounter); -void SpiritTimerSetWakeUpTimerPrescaler(uint8_t cPrescaler); -void SpiritTimerSetWakeUpTimerReloadMs(float fDesiredMsec); -void SpiritTimerGetWakeUpTimer(float* pfWakeUpMsec, uint8_t* pcCounter , uint8_t* pcPrescaler); -void SpiritTimerSetWakeUpTimerReload(uint8_t cCounter , uint8_t cPrescaler); -void SpiritTimerSetWakeUpTimerReloadCounter(uint8_t cCounter); -void SpiritTimerSetWakeUpTimerReloadPrescaler(uint8_t cPrescaler); -void SpiritTimerGetWakeUpTimerReload(float* pfWakeUpReloadMsec, uint8_t* pcCounter , uint8_t* pcPrescaler); -void SpiritTimerComputeWakeUpValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler); -void SpiritTimerComputeRxTimeoutValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler); -void SpiritTimerSetRxTimeoutStopCondition(RxTimeoutStopCondition xStopCondition); -void SpiritTimerReloadStrobe(void); -uint16_t SpiritTimerGetRcoFrequency(void); - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/ -
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Types.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Inc/SPIRIT_Types.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,276 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Types.h - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Header file for SPIRIT types. - * @details - * - * This module provide some types definitions which will be used in - * all the modules of this library. Here is defined also the global - * variable @ref g_xStatus which contains the status of Spirit and - * is updated every time an SPI transaction occurs. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPIRIT_GENERICTYPES_H -#define __SPIRIT_GENERICTYPES_H - - -/* Includes ------------------------------------------------------------------*/ - -/* Include all integer types definitions */ -#include <stdint.h> -#include <stdio.h> -#include "SPIRIT_Regs.h" - - - -#ifdef __cplusplus - extern "C" { -#endif - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @defgroup SPIRIT_Types Types - * @brief Module for SPIRIT types definition. - * * @details See the file <i>@ref SPIRIT_Types.h</i> for more details. - * @{ - */ - -/** - * @defgroup Types_Exported_Types Types Exported Types - * @{ - */ - -/** - * @brief Spirit Functional state. Used to enable or disable a specific option. - */ -typedef enum -{ - S_DISABLE = 0, - S_ENABLE = !S_DISABLE - -} SpiritFunctionalState; - -#define IS_SPIRIT_FUNCTIONAL_STATE(STATE) (STATE == S_DISABLE || STATE == S_ENABLE) - -/** - * @brief Spirit Flag status. Used to control the state of a flag. - */ -typedef enum -{ - S_RESET = 0, - S_SET = !S_RESET - -} SpiritFlagStatus; - -#define IS_SPIRIT_FLAG_STATUS(STATUS) (STATUS == S_RESET || STATUS == S_SET) - - -/** - * @brief boolean type enumeration. - */ -typedef enum -{ - S_FALSE = 0, - S_TRUE = !S_FALSE - -} SpiritBool; - - -/** - * @brief SPIRIT States enumeration. - */ -typedef enum -{ - MC_STATE_STANDBY =0x40, /*!< STANDBY */ - MC_STATE_SLEEP =0x36, /*!< SLEEP */ - MC_STATE_READY =0x03, /*!< READY */ - MC_STATE_PM_SETUP =0x3D, /*!< PM_SETUP */ - MC_STATE_XO_SETTLING =0x23, /*!< XO_SETTLING */ - MC_STATE_SYNTH_SETUP =0x53, /*!< SYNT_SETUP */ - MC_STATE_PROTOCOL =0x1F, /*!< PROTOCOL */ - MC_STATE_SYNTH_CALIBRATION =0x4F, /*!< SYNTH */ - MC_STATE_LOCK =0x0F, /*!< LOCK */ - MC_STATE_RX =0x33, /*!< RX */ - MC_STATE_TX =0x5F /*!< TX */ - -} SpiritState; - - - -/** - * @brief SPIRIT Status. This definition represents the single field of the SPIRIT - * status returned on each SPI transaction, equal also to the MC_STATE registers. - * This field-oriented structure allows user to address in simple way the single - * field of the SPIRIT status. - * The user shall define a variable of SpiritStatus type to access on SPIRIT status fields. - * @note The fields order in the structure depends on used endianness (little or big - * endian). The actual definition is valid ONLY for LITTLE ENDIAN mode. Be sure to - * change opportunely the fields order when use a different endianness. - */ - -typedef struct -{ - uint8_t XO_ON:1; /*!< This one bit field notifies if XO is operating - (XO_ON is 1) or not (XO_On is 0) */ - SpiritState MC_STATE: 7; /*!< This 7 bits field indicates the state of the - Main Controller of SPIRIT. The possible states - and their corresponding values are defined in - @ref SpiritState */ - uint8_t ERROR_LOCK: 1; /*!< This one bit field notifies if there is an - error on RCO calibration (ERROR_LOCK is 1) or - not (ERROR_LOCK is 0) */ - uint8_t RX_FIFO_EMPTY: 1; /*!< This one bit field notifies if RX FIFO is empty - (RX_FIFO_EMPTY is 1) or not (RX_FIFO_EMPTY is 0) */ - uint8_t TX_FIFO_FULL: 1; /*!< This one bit field notifies if TX FIFO is full - (TX_FIFO_FULL is 1) or not (TX_FIFO_FULL is 0) */ - uint8_t ANT_SELECT: 1; /*!< This one bit field notifies the currently selected - antenna */ - uint8_t : 4; /*!< This 4 bits field are reserved and equal to 5 */ - -}SpiritStatus; - - - -/** - * @} - */ - - -/** - * @defgroup Types_Exported_Constants Types Exported Constants - * @{ - */ - - -/** - * @} - */ - -/** - * @defgroup Types_Exported_Variables Types Exported Variables - * @{ - */ - -extern volatile SpiritStatus g_xStatus; - -/** - * @} - */ - -/** - * @defgroup Types_Exported_Macros Types Exported Macros - * @{ - */ - -#ifdef SPIRIT_USE_FULL_ASSERT - /** - * @brief The s_assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function which reports - * the name of the source file and the source line number of the call - * that failed. If expr is true, it returns no value. - * @retval None - */ - #define s_assert_param(expr) ((expr) ? (void)0 : s_assert_failed((uint8_t *)__FILE__, __LINE__)) - void s_assert_failed(uint8_t* file, uint32_t line); -#elif SPIRIT_USE_VCOM_ASSERT - /** - * @brief The s_assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function which reports - * the name of the source file and the source line number of the call - * that failed. If expr is true, it returns no value. - * @retval None - */ - #define s_assert_param(expr) ((expr) ? (void)0 : s_assert_failed((uint8_t *)__FILE__, __LINE__,#expr)) - void s_assert_failed(uint8_t* file, uint32_t line, char* expression); - -#elif SPIRIT_USE_FRAME_ASSERT - /** - * @brief The s_assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function which reports - * the name of the source file and the source line number of the call - * that failed. If expr is true, it returns no value. - * @retval None - */ -#define s_assert_param(expr) ((expr) ? (void)0 : s_assert_failed(#expr)) - void s_assert_failed(char* expression); -#else -#define s_assert_param(expr) {} -#endif - -/** - * @brief Returns the absolute value. - */ -#define S_ABS(a) ((a)>0?(a):-(a)) - - -/** - * @} - */ - - -/** - * @defgroup Types_Exported_Functions Types Exported Functions - * @{ - */ - -void SpiritRefreshStatus(void); - -/** - *@} - */ - -/** - * @} - */ - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Aes.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Aes.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,319 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Aes.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT AES Engine. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Aes.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Aes - * @{ - */ - - -/** - * @defgroup Aes_Private_TypesDefinitions AES Private Types Definitions - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Private_Defines AES Private Defines - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Private_Macros AES Private Macros - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Private_Variables AES Private Variables - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Private_FunctionPrototypes AES Private Function Prototypes - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup Aes_Private_Functions AES Private Functions - * @{ - */ - - -/** - * @brief Enables or Disables the AES engine. - * @param xNewState new state for AES engine. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None - */ -void SpiritAesMode(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Modifies the register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AES_MASK; - } - else - { - tempRegValue &= ~AES_MASK; - } - - /* Writes the ANA_FUNC_CONF0 register to enable or disable the AES engine */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Writes the data to encrypt or decrypt, or the encryption key for the - * derive decryption key operation into the AES_DATA_IN registers. - * @param pcBufferDataIn pointer to the user data buffer. The first byte of the array - * shall be the MSB byte and it will be put in the AES_DATA_IN[0] register, while - * the last one shall be the LSB and it will be put in the AES_DATA_IN[cDataLength-1] - * register. If data to write are less than 16 bytes the remaining AES_DATA_IN registers - * will be filled with bytes equal to 0. This parameter is an uint8_t*. - * @param cDataLength length of data in bytes. - * This parameter is an uint8_t. - * @retval None - */ -void SpiritAesWriteDataIn(uint8_t* pcBufferDataIn, uint8_t cDataLength) -{ - uint8_t i, dataInArray[16]; - - /* Verifies that there are no more than 16 bytes */ - (cDataLength>16) ? (cDataLength=16) : cDataLength; - - /* Fill the dataInArray with the data buffer, using padding */ - for(i=0;i<16;i++) - { - (i<(16 - cDataLength)) ? (dataInArray[i]=0):(dataInArray[i]=pcBufferDataIn[15-i]); - - } - - /* Writes the AES_DATA_IN registers */ - g_xStatus = SpiritSpiWriteRegisters(AES_DATA_IN_15_BASE, 16, dataInArray); - -} - - -/** - * @brief Returns the encrypted or decrypted data or the decription key from the AES_DATA_OUT register. - * @param pcBufferDataOut pointer to the user data buffer. The AES_DATA_OUT[0] - * register value will be put as first element of the buffer (MSB), while the - * AES_DAT_OUT[cDataLength-1] register value will be put as last element of the buffer (LSB). - * This parameter is a uint8_t*. - * @param cDataLength length of data to read in bytes. - * This parameter is a uint8_t. - * @retval None - */ -void SpiritAesReadDataOut(uint8_t* pcBufferDataOut, uint8_t cDataLength) -{ - uint8_t address, dataOutArray[16]; - - /* Verifies that there are no more than 16 bytes */ - (cDataLength>16) ? (cDataLength=16) : cDataLength; - - /* Evaluates the address of AES_DATA_OUT from which start to read */ - address = AES_DATA_OUT_15_BASE+16-cDataLength; - - /* Reads the exact number of AES_DATA_OUT registers */ - g_xStatus = (SpiritSpiReadRegisters(address, cDataLength, dataOutArray)); - - /* Copy in the user buffer the read values changing the order */ - for(int i = (cDataLength-1); i>=0; i--) - { - *pcBufferDataOut = dataOutArray[i]; - pcBufferDataOut++; - } - -} - - -/** - * @brief Writes the encryption key into the AES_KEY_IN register. - * @param pcKey pointer to the buffer of 4 words containing the AES key. - * The first byte of the buffer shall be the most significant byte AES_KEY_0 of the AES key. - * The last byte of the buffer shall be the less significant byte AES_KEY_15 of the AES key. - * This parameter is an uint8_t*. - * @retval None - */ -void SpiritAesWriteKey(uint8_t* pcKey) -{ - uint8_t pcTempKey[16]; - for (uint8_t i = 0; i < 16; i++) - { - pcTempKey[15-i] = pcKey[i]; - } - - /* Writes the AES_DATA_IN registers */ - g_xStatus = SpiritSpiWriteRegisters(AES_KEY_IN_15_BASE, 16, pcTempKey); - -} - -/** - * @brief Returns the encryption/decryption key from the AES_KEY_IN register. - * @param pcKey pointer to the buffer of 4 words (16 bytes) containing the AES key. - * The first byte of the buffer shall be the most significant byte AES_KEY_0 of the AES key. - * The last byte of the buffer shall be the less significant byte AES_KEY_15 of the AES key. - * This parameter is an uint8_t*. - * @retval None - */ -void SpiritAesReadKey(uint8_t* pcKey) -{ - uint8_t pcTempKey[16]; - - /* Reads the AES_DATA_IN registers */ - g_xStatus = SpiritSpiReadRegisters(AES_KEY_IN_15_BASE, 16, pcTempKey); - - - for (uint8_t i = 0; i < 16; i++) - pcKey[i] = pcTempKey[15-i]; - -} - - - -/** - * @brief Derives the decryption key from a given encryption key. - * @param None. - * @retval None. - */ -void SpiritAesDeriveDecKeyFromEnc(void) -{ - /* Sends the COMMAND_AES_KEY command */ - g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_KEY); - -} - - -/** - * @brief Executes the encryption operation. - * @param None. - * @retval None. - */ -void SpiritAesExecuteEncryption(void) -{ - /* Sends the COMMAND_AES_ENC command */ - g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_ENC); - -} - - -/** - * @brief Executes the decryption operation. - * @param None. - * @retval None. - */ -void SpiritAesExecuteDecryption(void) -{ - /* Sends the COMMAND_AES_DEC command */ - g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_DEC); - -} - - -/** - * @brief Executes the key derivation and the decryption operation. - * @param None. - * @retval None. - */ -void SpiritAesDeriveDecKeyExecuteDec(void) -{ - /* Sends the COMMAND_AES_KEY_DEC command */ - g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_KEY_DEC); - -} - - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Calibration.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Calibration.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,491 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Calibration.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT VCO-RCO calibration. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Calibration.h" -#include "MCU_Interface.h" - - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Calibration - * @{ - */ - - -/** - * @defgroup Calibration_Private_TypesDefinitions Calibration Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Calibration_Private_Defines Calibration Private Defines - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup Calibration_Private_Macros Calibration Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Calibration_Private_Variables Calibration Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup Calibration_Private_FunctionPrototypes Calibration Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Calibration_Private_Functions Calibration Private Functions - * @{ - */ - -/** - * @brief Enables or Disables the RCO calibration. - * @param xNewState new state for RCO calibration. - This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritCalibrationRco(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Build new value for the register */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL2_RCO_CALIBRATION_MASK; - } - else - { - tempRegValue &= ~PROTOCOL2_RCO_CALIBRATION_MASK; - } - - /* Writes register to enable or disable the RCO calibration */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables or Disables the VCO calibration. - * @param xNewState new state for VCO calibration. - This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritCalibrationVco(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Build new value for the register */ - if(xNewState==S_ENABLE) - tempRegValue |= PROTOCOL2_VCO_CALIBRATION_MASK; - else - tempRegValue &= ~PROTOCOL2_VCO_CALIBRATION_MASK; - - /* Writes register to enable or disable the VCO calibration */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the RCO calibration words. - * @param cRwt RWT word for RCO calibration. - * This parameter can be a value of uint8_t. - * @param cRfb RFB word for RCO calibration. - * This parameter can be a value of uint8_t. - * @retval None. - */ -void SpiritCalibrationSetRcoCalWords(uint8_t cRwt, uint8_t cRfb) -{ - uint8_t tempRegValue[2]; - - /* Build the value of RWT and the MSbits of the RFB word */ - tempRegValue[0] = (cRwt << 4) | (cRfb >> 1); - - /* Reads the register value to update the LSbit of RFB */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue[1]); - - /* Build new value for the register */ - tempRegValue[1] = (tempRegValue[1] & 0x7F) | (cRfb<<7); - - /* Writes the new value for RCO calibration words */ - g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN2_BASE, 2, tempRegValue); - -} - - -/** - * @brief Returns the RCO calibration words. - * @param pcRwt pointer to the variable in which the RWT word has to be stored. - * This parameter is a variable of uint8_t*. - * @param pcRfb pointer to the variable in which the RFB word has to be stored. - * This parameter is a variable of uint8_t*. - * @retval None. - */ -void SpiritCalibrationGetRcoCalWords(uint8_t* pcRwt, uint8_t* pcRfb) -{ - uint8_t tempRegValue[2]; - - /* Reads the registers values */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_OUT1_BASE, 2, tempRegValue); - - /* Build the RWT value */ - (*pcRwt) = tempRegValue[0] >> 4; - /* Build the RFB value */ - (*pcRfb) = (tempRegValue[0] & 0x0F)<<1 | (tempRegValue[1]>>7); - -} - - -/** - * @brief Returns the VCO calibration data from internal VCO calibrator. - * @param None. - * @retval uint8_t VCO calibration data word. - */ -uint8_t SpiritCalibrationGetVcoCalData(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_OUT0_BASE, 1, &tempRegValue); - - /* Build and returns the VCO calibration data value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the VCO calibration data to be used in TX mode. - * @param cVcoCalData calibration data word to be set. - * This parameter is a variable of uint8_t. - * @retval None. - */ -void SpiritCalibrationSetVcoCalDataTx(uint8_t cVcoCalData) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue); - - /* Build the value to be written */ - tempRegValue &= 0x80; - tempRegValue |= cVcoCalData; - - /* Writes the new value of calibration data in TX */ - g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the actual VCO calibration data used in TX mode. - * @param None. - * @retval uint8_t Calibration data word used in TX mode. - */ -uint8_t SpiritCalibrationGetVcoCalDataTx(void) -{ - uint8_t tempRegValue; - - /* Reads the register containing the calibration data word used in TX mode */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue); - - /* Mask the VCO_CALIBR_TX field and returns the value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the VCO calibration data to be used in RX mode. - * @param cVcoCalData calibration data word to be set. - * This parameter is a variable of uint8_t. - * @retval None. - */ -void SpiritCalibrationSetVcoCalDataRx(uint8_t cVcoCalData) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN0_BASE, 1, &tempRegValue); - - /* Build the value to be written */ - tempRegValue &= 0x80; - tempRegValue |= cVcoCalData; - - /* Writes the new value of calibration data in RX */ - g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the actual VCO calibration data used in RX mode. - * @param None. - * @retval uint8_t Calibration data word used in RX mode. - */ -uint8_t SpiritCalibrationGetVcoCalDataRx(void) -{ - uint8_t tempRegValue; - - /* Reads the register containing the calibration data word used in TX mode */ - g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN0_BASE, 1, &tempRegValue); - - /* Mask the VCO_CALIBR_RX field and returns the value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the VCO calibration window. - * @param xRefWord value of REFWORD corresponding to the Ref_period according to the formula: CALIBRATION_WIN = 11*Ref_period/fxo. - This parameter can be a value of @ref VcoWin. - * @retval None. - */ -void SpiritCalibrationSetVcoWindow(VcoWin xRefWord) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_VCO_WIN(xRefWord)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - - /* Build the values to be written */ - tempRegValue &= 0xFC; - tempRegValue |= xRefWord; - - /* Writes the new value of VCO calibration window */ - g_xStatus = SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the VCO calibration window. - * @param None. - * @retval VcoWin Value of REFWORD corresponding to the Ref_period according to the formula: CALIBRATION_WIN = 11*Ref_period/fxo. - * This parameter can be a value of @ref VcoWin. - */ -VcoWin SpiritCalibrationGetVcoWindow(void) -{ - uint8_t tempRegValue1, tempRegValue2; - VcoWin refWord; - - /* Reads the register containing the REFWORD value */ - g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue1); - - /* Reads the Xtal configuration */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue2); - - /* Mask the REFWORD field */ - tempRegValue1 &= 0x03; - - /* Mask the 24_26_MHz_SELECT field */ - tempRegValue2 = ((tempRegValue2 & 0x40)>>6); - - /* In case of 26 MHz crystal */ - if(tempRegValue2) - { - switch(tempRegValue1) - { - case 0: - refWord = CALIB_TIME_6_77_US_26MHZ; - break; - case 1: - refWord = CALIB_TIME_13_54_US_26MHZ; - break; - case 2: - refWord = CALIB_TIME_27_08_US_26MHZ; - break; - case 3: - refWord = CALIB_TIME_54_15_US_26MHZ; - break; - } - } - - /* In case of 24 MHz crystal */ - else - { - switch(tempRegValue1) - { - case 0: - refWord = CALIB_TIME_7_33_US_24MHZ; - break; - case 1: - refWord = CALIB_TIME_14_67_US_24MHZ; - break; - case 2: - refWord = CALIB_TIME_29_33_US_24MHZ; - break; - case 3: - refWord = CALIB_TIME_58_67_US_24MHZ; - break; - } - } - - return refWord; - -} - -/** - * @brief Selects a VCO. - * @param xVco can be VCO_H or VCO_L according to which VCO select. - * This parameter can be a value of @ref VcoSel. - * @retval None. - */ -void SpiritCalibrationSelectVco(VcoSel xVco) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_VCO_SEL(xVco)); - - SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - - tempRegValue &= 0xF9; - - if(xVco == VCO_H) - { - tempRegValue |= 0x02; - - } - else - { - tempRegValue |= 0x04; - } - SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - -} - - - -/** - * @brief Returns the VCO selected. - * @param void. - * @retval VCO_H or VCO_L according to which VCO selected. - * This parameter can be a value of @ref VcoSel. - */ -VcoSel SpiritCalibrationGetVcoSelecttion(void) -{ - uint8_t tempRegValue; - - SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - - tempRegValue = (tempRegValue>>1)&0x3; - - if(tempRegValue == 0x01) - { - return VCO_H; - - } - else - { - return VCO_L; - } - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Commands.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Commands.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Commands.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Management of SPIRIT Commands. - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Commands.h" -#include "MCU_Interface.h" - - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Commands - * @{ - */ - - -/** - * @defgroup Commands_Private_TypesDefinitions Commands Private TypesDefinitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Commands_Private_Defines Commands Private Defines - * @{ - */ - -/** - *@} - */ - -/** - * @defgroup Commands_Private_Macros Commands Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Commands_Private_Variables Commands Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup Commands_Private_FunctionPrototypes Commands Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Commands_Private_Functions Commands Private Functions - * @{ - */ - -/** - * @brief Sends a specific command to SPIRIT. - * @param xCommandCode code of the command to send. - This parameter can be any value of @ref SpiritCmd. - * @retval None. - */ -void SpiritCmdStrobeCommand(SpiritCmd xCommandCode) -{ - /* Check the parameters */ - s_assert_param(IS_SPIRIT_CMD(xCommandCode)); - - g_xStatus = SpiritSpiCommandStrobes((uint8_t) xCommandCode); -} - - -/** - *@} - */ - - -/** - *@} - */ - - -/** - *@} - */ - - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Csma.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Csma.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,600 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Csma.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT CSMA. - * @details - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Csma.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Csma - * @{ - */ - - -/** - * @defgroup Csma_Private_TypesDefinitions CSMA Private TypesDefinitions - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup Csma_Private_Defines CSMA Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Csma_Private_Macros CSMA Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Csma_Private_Variables CSMA Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup Csma_Private_FunctionPrototypes CSMA Private FunctionPrototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Csma_Private_Functions CSMA Private Functions - * @{ - */ - - -/** - * @brief Initializes the SPIRIT CSMA according to the specified parameters in the CsmaInit. - * @param pxCsmaInit Csma init structure. - * This parameter is a pointer to @ref CsmaInit. - * @retval None. - */ -void SpiritCsmaInit(CsmaInit* pxCsmaInit) -{ - uint8_t tempRegValue[5]; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxCsmaInit->xCsmaPersistentMode)); - s_assert_param(IS_CCA_PERIOD(pxCsmaInit->xMultiplierTbit)); - s_assert_param(IS_CSMA_LENGTH(pxCsmaInit->xCcaLength)); - s_assert_param(IS_BU_COUNTER_SEED(pxCsmaInit->nBuCounterSeed)); - s_assert_param(IS_BU_PRESCALER(pxCsmaInit->cBuPrescaler)); - s_assert_param(IS_CMAX_NB(pxCsmaInit->cMaxNb)); - - /* CSMA BU counter seed (MSB) config */ - tempRegValue[0] = (uint8_t)(pxCsmaInit->nBuCounterSeed >> 8); - - /* CSMA BU counter seed (LSB) config */ - tempRegValue[1] = (uint8_t) pxCsmaInit->nBuCounterSeed; - - /* CSMA BU prescaler config and CCA period config */ - tempRegValue[2] = (pxCsmaInit->cBuPrescaler << 2) | pxCsmaInit->xMultiplierTbit; - - /* CSMA CCA length config and max number of back-off */ - tempRegValue[3] = (pxCsmaInit->xCcaLength | pxCsmaInit->cMaxNb); - - /* Reads the PROTOCOL1_BASE register value, to write the SEED_RELOAD and CSMA_PERS_ON fields */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]); - - /* Writes the new value for persistent mode */ - if(pxCsmaInit->xCsmaPersistentMode==S_ENABLE) - { - tempRegValue[4] |= PROTOCOL1_CSMA_PERS_ON_MASK; - } - else - { - tempRegValue[4] &= ~PROTOCOL1_CSMA_PERS_ON_MASK; - } - - /* Writes PROTOCOL1_BASE register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]); - - /* Writes CSMA_CONFIGx_BASE registers */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG3_BASE, 4, tempRegValue); - -} - - - /** - * @brief Returns the fitted structure CsmaInit starting from the registers values. - * @param pxCsmaInit Csma structure to be fitted. - * This parameter is a pointer to @ref CsmaInit. - * @retval None. - */ -void SpiritCsmaGetInfo(CsmaInit* pxCsmaInit) -{ - uint8_t tempRegValue[5]; - - /* Reads PROTOCOL1_BASE register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[4]); - - /* Reads CSMA_CONFIGx_BASE registers */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG3_BASE, 4, tempRegValue); - - /* Reads the bu counter seed */ - pxCsmaInit->nBuCounterSeed = (uint16_t)tempRegValue[1] | ((uint16_t)(tempRegValue[0] << 8)); - - /* Reads the bu prescaler */ - pxCsmaInit->cBuPrescaler = tempRegValue[2]>>2; - - /* Reads the Cca period */ - pxCsmaInit->xMultiplierTbit = (CcaPeriod)(tempRegValue[2] & 0x03); - - /* Reads the Cca length */ - pxCsmaInit->xCcaLength = (CsmaLength)(tempRegValue[3]&0xF0); - - /* Reads the max number of back off */ - pxCsmaInit->cMaxNb = tempRegValue[3] & 0x07; - - /* Reads the persistent mode enable bit */ - pxCsmaInit->xCsmaPersistentMode = (SpiritFunctionalState)((tempRegValue[4]>>1) & 0x01); - -} - - -/** - * @brief Enables or Disables the CSMA. - * @param xNewState the state of the CSMA mode. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritCsma(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Sets or resets the CSMA enable bit */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL1_CSMA_ON_MASK; - } - else - { - tempRegValue &= ~PROTOCOL1_CSMA_ON_MASK; - } - - /* Writes the new value on the PROTOCOL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - -/** - * @brief Gets the CSMA mode. Says if it is enabled or disabled. - * @param None. - * @retval SpiritFunctionalState: CSMA mode. - */ -SpiritFunctionalState SpiritCsmaGetCsma(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Return if set or reset */ - if(tempRegValue & PROTOCOL1_CSMA_ON_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - -/** - * @brief Enables or Disables the persistent CSMA mode. - * @param xNewState the state of the persistent CSMA mode. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritCsmaPersistentMode(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Enables/disables the CSMA persistent mode */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL1_CSMA_PERS_ON_MASK; - } - else - { - tempRegValue &= ~PROTOCOL1_CSMA_PERS_ON_MASK; - } - - /* Writes the new vaue on the PROTOCOL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Gets the persistent CSMA mode. - * @param None. - * @retval SpiritFunctionalState: CSMA persistent mode. - */ -SpiritFunctionalState SpiritCsmaGetPersistentMode(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Return if set or reset */ - if(tempRegValue & PROTOCOL1_CSMA_PERS_ON_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - - -/** - * @brief Enables or Disables the seed reload mode (if enabled it reloads the back-off generator seed using the value written in the BU_COUNTER_SEED register). - * @param xNewState the state of the seed reload mode. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritCsmaSeedReloadMode(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Enables/disables the seed reload mode */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL1_SEED_RELOAD_MASK; - } - else - { - tempRegValue &= ~PROTOCOL1_SEED_RELOAD_MASK; - } - - /* Writes the new value on the PROTOCOL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Gets the seed reload mode. - * @param None. - * @retval SpiritFunctionalState: CSMA seed reload mode. - */ -SpiritFunctionalState SpiritCsmaGetSeedReloadMode(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Return if set or reset */ - if(tempRegValue & PROTOCOL1_SEED_RELOAD_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } -} - - -/** - * @brief Sets the BU counter seed (BU_COUNTER_SEED register). The CSMA back off time is given by the formula: BO = rand(2^NB)*BU. - * @param nBuCounterSeed seed of the random number generator used to apply the BBE algorithm. - * This parameter is an uint16_t. - * @retval None. - */ -void SpiritCsmaSetBuCounterSeed(uint16_t nBuCounterSeed) -{ - uint8_t tempRegValue[2]; - - /* Check parameters */ - s_assert_param(IS_BU_COUNTER_SEED(nBuCounterSeed)); - - /* Build value (MSB)*/ - tempRegValue[0]=(uint8_t)(nBuCounterSeed>>8); - /* Build value (LSB) */ - tempRegValue[1]=(uint8_t)nBuCounterSeed; - - /* Writes the CSMA_CONFIG3 registers */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG3_BASE, 2, tempRegValue); - -} - -/** - * @brief Returns the BU counter seed (BU_COUNTER_SEED register). - * @param None. - * @retval uint16_t Seed of the random number generator used to apply the BBE algorithm. - */ -uint16_t SpiritCsmaGetBuCounterSeed(void) -{ - uint8_t tempRegValue[2]; - - /* Reads the CSMA_CONFIGx registers value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG3_BASE, 2, tempRegValue); - - /* Build the counter seed and return it */ - return ((uint16_t)tempRegValue[1] + (((uint16_t)tempRegValue[0])<<8)); - -} - - -/** - * @brief Sets the BU prescaler. The CSMA back off time is given by the formula: BO = rand(2^NB)*BU. - * @param cBuPrescaler used to program the back-off unit BU. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritCsmaSetBuPrescaler(uint8_t cBuPrescaler) -{ - uint8_t tempRegValue; - - /* Check parameters */ - s_assert_param(IS_BU_PRESCALER(cBuPrescaler)); - - /* Reads the CSMA_CONFIG1 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - - /* Build the new value for the BU prescaler */ - tempRegValue &= 0x03; - tempRegValue |= (cBuPrescaler<<2); - - /* Writes the new value on the CSMA_CONFIG1_BASE register */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the BU prescaler. - * @param None. - * @retval uint8_t Value back-off unit (BU). - */ -uint8_t SpiritCsmaGetBuPrescaler(void) -{ - uint8_t tempRegValue; - - /* Reads the CSMA_CONFIG1 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - - /* Build and return the BU prescaler value */ - return (tempRegValue >> 2); - -} - - -/** - * @brief Sets the CCA period. - * @param xMultiplierTbit value of CCA period to store. - * This parameter can be a value of @ref CcaPeriod. - * @retval None. - */ -void SpiritCsmaSetCcaPeriod(CcaPeriod xMultiplierTbit) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_CCA_PERIOD(xMultiplierTbit)); - - /* Reads the CSMA_CONFIG1 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - - /* Build the new value setting the the CCA period */ - tempRegValue &= 0xFC; - tempRegValue |= xMultiplierTbit; - - /* Writes the new value on the CSMA_CONFIG1 register */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the CCA period. - * @param None. - * @retval CcaPeriod CCA period. - */ -CcaPeriod SpiritCsmaGetCcaPeriod(void) -{ - uint8_t tempRegValue; - - /* Reads the CSMA_CONFIG1 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG1_BASE, 1, &tempRegValue); - - /* Build and return the CCA period value */ - return (CcaPeriod)(tempRegValue & 0x03); - -} - - -/** - * @brief Sets the CCA length. - * @param xCcaLength the CCA length (a value between 1 and 15 that multiplies the CCA period). - * This parameter can be any value of @ref CsmaLength. - * @retval None. - */ -void SpiritCsmaSetCcaLength(CsmaLength xCcaLength) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_CSMA_LENGTH(xCcaLength)); - - /* Reads the CSMA_CONFIG0 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); - - /* Build the value of CCA length to be set */ - tempRegValue &= 0x0F; - tempRegValue |= xCcaLength; - - /* Writes the new value on the CSMA_CONFIG0 register */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the CCA length. - * @param None. - * @retval uint8_t CCA length. - */ -uint8_t SpiritCsmaGetCcaLength(void) -{ - uint8_t tempRegValue; - - /* Reads the CSMA_CONFIG0 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); - - /* Build and return the CCA length */ - return tempRegValue >> 4; - -} - - -/** - * @brief Sets the max number of back-off. If reached Spirit stops the transmission. - * @param cMaxNb the max number of back-off. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritCsmaSetMaxNumberBackoff(uint8_t cMaxNb) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_CMAX_NB(cMaxNb)); - - /* Reads the CSMA_CONFIG0 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); - - /* Build the value of max back off to be set */ - tempRegValue &= 0xF8; - tempRegValue |= cMaxNb; - - /* Writes the new value on the CSMA_CONFIG0 register */ - g_xStatus = SpiritSpiWriteRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); -} - -/** - * @brief Returns the max number of back-off. - * @param None. - * @retval uint8_t Max number of back-off. - */ -uint8_t SpiritCsmaGetMaxNumberBackoff(void) -{ - uint8_t tempRegValue; - - /* Reads the CSMA_CONFIG0 register value */ - g_xStatus = SpiritSpiReadRegisters(CSMA_CONFIG0_BASE, 1, &tempRegValue); - - /* Build and return the max number of back-off */ - return (tempRegValue & 0x07); - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_DirectRF.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_DirectRF.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_DirectRF.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT direct transmission / receive modes. - * @details - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_DirectRF.h" -#include "MCU_Interface.h" - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_DirectRf - * @{ - */ - - -/** - * @defgroup DirectRf_Private_TypesDefinitions Direct RF Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Private_Defines Direct RF Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Private_Macros Direct RF Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Private_Variables Direct RF Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup DirectRf_Private_FunctionPrototypes Direct RF Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup DirectRf_Private_Functions Direct RF Private Functions - * @{ - */ - -/** - * @brief Sets the DirectRF RX mode of SPIRIT. - * @param xDirectRx code of the desired mode. - * This parameter can be any value of @ref DirectRx. - * @retval None. - */ -void SpiritDirectRfSetRxMode(DirectRx xDirectRx) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_DIRECT_RX(xDirectRx)); - - /* Reads the register value */ - SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Build the value to be stored */ - tempRegValue &= ~PCKTCTRL3_RX_MODE_MASK; - tempRegValue |= (uint8_t)xDirectRx; - - /* Writes value on register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the DirectRF RX mode of SPIRIT. - * @param None. - * @retval DirectRx Direct Rx mode. - */ -DirectRx SpiritDirectRfGetRxMode(void) -{ - uint8_t tempRegValue; - - /* Reads the register value and mask the RX_Mode field */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Rebuild and return value */ - return (DirectRx)(tempRegValue & 0x30); - -} - - -/** - * @brief Sets the TX mode of SPIRIT. - * @param xDirectTx code of the desired source. - * This parameter can be any value of @ref DirectTx. - * @retval None. - */ -void SpiritDirectRfSetTxMode(DirectTx xDirectTx) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_DIRECT_TX(xDirectTx)); - - /* Reads the register value */ - SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build the value to be stored */ - tempRegValue &= ~PCKTCTRL1_TX_SOURCE_MASK; - tempRegValue |= (uint8_t)xDirectTx; - - /* Writes value on register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the DirectRF TX mode of SPIRIT. - * @param None. - * @retval DirectTx Direct Tx mode. - */ -DirectTx SpiritDirectRfGetTxMode(void) -{ - uint8_t tempRegValue; - - /* Reads the register value and mask the RX_Mode field */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Returns value */ - return (DirectTx)(tempRegValue & 0x0C); - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_General.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_General.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,449 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_General.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT General functionalities. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_General.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_General - * @{ - */ - - -/** - * @defgroup General_Private_TypesDefinitions General Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup General_Private_Defines General Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup General_Private_Macros General Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup General_Private_Variables General Private Variables - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup General_Private_FunctionPrototypes General Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup General_Private_Functions General Private Functions - * @{ - */ - -/** - * @brief Enables or Disables the output of battery level detector. - * @param xNewState new state for battery level detector. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None - */ -void SpiritGeneralBatteryLevel(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the ANA_FUNC_CONF0_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Build the value to be stored */ - if(xNewState == S_ENABLE) - { - tempRegValue |= BATTERY_LEVEL_MASK; - } - else - { - tempRegValue &= ~BATTERY_LEVEL_MASK; - } - - /* Writes the new value */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the battery level. - * @param xBatteryLevel new state for battery level. - * This parameter can be a value of @ref BatteryLevel. - * @retval None. - */ -void SpiritGeneralSetBatteryLevel(BatteryLevel xBatteryLevel) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_BLD_LVL(xBatteryLevel)); - - /* Reads the ANA_FUNC_CONF1_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - - /* Build the value to be stored */ - tempRegValue &= ~ANA_FUNC_CONF1_SET_BLD_LVL_MASK; - switch(xBatteryLevel) - { - case BLD_LVL_2_7_V: - tempRegValue |= BLD_LVL_2_7; - break; - case BLD_LVL_2_5_V: - tempRegValue |= BLD_LVL_2_5; - break; - case BLD_LVL_2_3_V: - tempRegValue |= BLD_LVL_2_3; - break; - case BLD_LVL_2_1_V: - tempRegValue |= BLD_LVL_2_1; - break; - } - - /* Writes the new value */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the settled battery level. - * @param None. - * @retval BatteryLevel Settled battery level. This parameter can be a value of @ref BatteryLevel. - */ -BatteryLevel SpiritGeneralGetBatteryLevel(void) -{ - uint8_t tempRegValue; - - /* Reads the ANA_FUNC_CONF1_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - - /* Mask the battery level field and returns the settled battery level */ - return ((BatteryLevel)(tempRegValue & ANA_FUNC_CONF1_SET_BLD_LVL_MASK)); - -} - - -/** - * @brief Enables or Disables the output of brown out detector. - * @param xNewState new state for brown out detector. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritGeneralBrownOut(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the ANA_FUNC_CONF0_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Build the value to be stored */ - if(xNewState == S_ENABLE) - { - tempRegValue |= BROWN_OUT_MASK; - } - else - { - tempRegValue &= ~BROWN_OUT_MASK; - } - - /* Writes value on register */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets High Power Mode. - * @param xNewState new state for High Power Mode. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritGeneralHighPwr(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the ANA_FUNC_CONF0_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Build the value to write */ - if(xNewState == S_ENABLE) - { - tempRegValue |= HIGH_POWER_MODE_MASK; - } - else - { - tempRegValue &= ~HIGH_POWER_MODE_MASK; - } - - /* Writes the new value on register */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets External Reference. - * @param xExtMode new state for the external reference. - * This parameter can be: MODE_EXT_XO or MODE_EXT_XIN. - * @retval None. - */ -void SpiritGeneralSetExtRef(ModeExtRef xExtMode) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_MODE_EXT(xExtMode)); - - /* Reads the ANA_FUNC_CONF0_BASE register value */ - SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Build the value to write */ - if(xExtMode == MODE_EXT_XO) - { - tempRegValue &= ~EXT_REF_MASK; - } - else - { - tempRegValue |= EXT_REF_MASK; - } - - /* Writes value on register */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns External Reference. - * @param None. - * @retval ModeExtRef Settled external reference. - * This parameter can be: MODE_EXT_XO or MODE_EXT_XIN. - */ -ModeExtRef SpiritGeneralGetExtRef(void) -{ - uint8_t tempRegValue; - - /* Reads the ANA_FUNC_CONF0_BASE register value and return the result */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Mask the EXT_REF field field and returns the settled reference signal */ - return ((ModeExtRef)((tempRegValue & 0x10)>>4)); - -} - - -/** - * @brief Sets XO gm at startup. - * @param xGm transconductance value of XO at startup. - * This parameter can be a value of @ref GmConf. - * @retval None. - */ -void SpiritGeneralSetXoGm(GmConf xGm) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_GM_CONF(xGm)); - - /* Reads the ANA_FUNC_CONF1_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - - /* Build the value to write */ - tempRegValue &= ~ANA_FUNC_CONF1_GMCONF_MASK; - switch(xGm) - { - case GM_SU_13_2: - tempRegValue |= GM_13_2; - break; - case GM_SU_18_2: - tempRegValue |= GM_18_2; - break; - case GM_SU_21_5: - tempRegValue |= GM_21_5; - break; - case GM_SU_25_6: - tempRegValue |= GM_25_6; - break; - case GM_SU_28_8: - tempRegValue |= GM_28_8; - break; - case GM_SU_33_9: - tempRegValue |= GM_33_9; - break; - case GM_SU_38_5: - tempRegValue |= GM_38_5; - break; - case GM_SU_43_0: - tempRegValue |= GM_43_0; - break; - } - - /* Writes new value on register */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the configured XO gm at startup. - * @param None. - * @retval GmConf Settled XO gm. This parameter can be a value of @ref GmConf. - */ -GmConf SpiritGeneralGetXoGm(void) -{ - uint8_t tempRegValue; - - /* Reads the ANA_FUNC_CONF1_BASE register value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF1_BASE, 1, &tempRegValue); - - /* Mask the GM_CONF field field and returns the settled transconductance of the XO at startup */ - return ((GmConf)((tempRegValue & 0x1C)>>2)); - -} - - -/** - * @brief Returns the settled packet format. - * @param None. - * @retval PacketType Settled packet type. This parameter can be a value of @ref PacketType. - */ -PacketType SpiritGeneralGetPktType(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* cast and return value */ - return (PacketType)(tempRegValue>>6); - -} - - - -/** - * @brief Returns device part number. - * @param None. - * @retval uint16_t Device part number. - */ -uint16_t SpiritGeneralGetDevicePartNumber(void) -{ - uint8_t tempRegValue[2]; - - /* Reads the register value containing the device part number */ - g_xStatus = SpiritSpiReadRegisters(DEVICE_INFO1_PARTNUM, 2, tempRegValue); - - return ((((uint16_t)tempRegValue[0])<<8) | ((uint16_t)tempRegValue[1])); - -} - -/** - * @brief Returns SPIRIT RF board version. - * @param None. - * @retval SPIRIT RF board version: 0x30 is the only admitted value - */ -uint8_t SpiritGeneralGetSpiritVersion(void) -{ - uint8_t ver; - SpiritSpiReadRegisters(DEVICE_INFO0_VERSION, 1, &ver); - return ver; -} - -/** - *@} - */ - - -/** - *@} - */ - - -/** - *@} - */ - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Gpio.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Gpio.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,458 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Gpio.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief This file provides all the low level API to manage SPIRIT GPIO. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Gpio.h" -#include "MCU_Interface.h" - - -/** @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** @addtogroup SPIRIT_Gpio - * @{ - */ - - -/** @defgroup Gpio_Private_TypesDefinitions GPIO Private Types Definitions - * @{ - */ - - -/** - * @} - */ - - -/** @defgroup Gpio_Private_Defines GPIO Private Defines - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Private_Macros GPIO Private Macros - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Private_Variables GPIO Private Variables - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Private_FunctionPrototypes GPIO Private Function Prototypes - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Gpio_Private_Functions GPIO Private Functions - * @{ - */ - -/** - * @brief Initializes the SPIRIT GPIOx according to the specified - * parameters in the pxGpioInitStruct. - * @param pxGpioInitStruct pointer to a SGpioInit structure that - * contains the configuration information for the specified SPIRIT GPIO. - * @retval None. - */ -void SpiritGpioInit(SGpioInit* pxGpioInitStruct) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_GPIO(pxGpioInitStruct->xSpiritGpioPin)); - s_assert_param(IS_SPIRIT_GPIO_MODE(pxGpioInitStruct->xSpiritGpioMode)); - s_assert_param(IS_SPIRIT_GPIO_IO(pxGpioInitStruct->xSpiritGpioIO)); - - tempRegValue = ((uint8_t)(pxGpioInitStruct->xSpiritGpioMode) | (uint8_t)(pxGpioInitStruct->xSpiritGpioIO)); - - g_xStatus = SpiritSpiWriteRegisters(pxGpioInitStruct->xSpiritGpioPin, 1, &tempRegValue); - -} - - -/** - * @brief Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. - * @param xNewState new state for temperature sensor. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritGpioTemperatureSensor(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - uint8_t gpio0tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the ANA_FUNC_CONF0 register and mask the result to enable or disable the - temperature sensor */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= TEMPERATURE_SENSOR_MASK; - } - else - { - tempRegValue &= (~TEMPERATURE_SENSOR_MASK); - gpio0tempRegValue = 0x0A; /* Default value */ - } - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - /* Sets the SPIRIT GPIO_0 according to input request */ - g_xStatus = SpiritSpiWriteRegisters(GPIO0_CONF_BASE, 1, &gpio0tempRegValue); - -} - - -/** - * @brief Forces SPIRIT GPIO_x configured as digital output, to VDD or GND. - * @param xGpioX Specifies the GPIO to be configured. - * This parameter can be one of following parameters: - * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0 - * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1 - * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2 - * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3 - * @param xLevel Specifies the level. - * This parameter can be: HIGH or LOW. - * @retval None. - */ -void SpiritGpioSetLevel(SpiritGpioPin xGpioX, OutputLevel xLevel) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_GPIO(xGpioX)); - s_assert_param(IS_SPIRIT_GPIO_LEVEL(xLevel)); - - /* Reads the SPIRIT_GPIOx register and mask the GPIO_SELECT field */ - g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue); - tempRegValue &= 0x04; - - /* Sets the value of the SPIRIT GPIO register according to the specified level */ - if(xLevel == HIGH) - { - tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_VDD | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; - } - else - { - tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_GND | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; - } - - /* Writes the SPIRIT GPIO register */ - g_xStatus = SpiritSpiWriteRegisters(xGpioX, 1, &tempRegValue); - -} - - -/** - * @brief Returns output value (VDD or GND) of SPIRIT GPIO_x, when it is configured as digital output. - * @param xGpioX Specifies the GPIO to be read. - * This parameter can be one of following parameters: - * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0 - * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1 - * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2 - * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3 - * @retval OutputLevel Logical level of selected GPIO configured as digital output. - * This parameter can be: HIGH or LOW. - */ -OutputLevel SpiritGpioGetLevel(SpiritGpioPin xGpioX) -{ - uint8_t tempRegValue = 0x00; - OutputLevel level; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_GPIO(xGpioX)); - - /* Reads the SPIRIT_GPIOx register */ - g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue); - - /* Mask the GPIO_SELECT field and returns the value according */ - tempRegValue &= 0xF8; - if(tempRegValue == SPIRIT_GPIO_DIG_OUT_VDD) - { - level = HIGH; - } - else - { - level = LOW; - } - - return level; - -} - - -/** - * @brief Enables or Disables the MCU clock output. - * @param xNewState new state for the MCU clock output. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritGpioClockOutput(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the MCU_CK_CONF register and mask the result to enable or disable the clock output */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - if(xNewState) - { - tempRegValue |= MCU_CK_ENABLE; - } - else - { - tempRegValue &= (~MCU_CK_ENABLE); - } - - /* Writes the MCU_CK_CONF register */ - g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Initializes the SPIRIT Clock Output according to the specified - * parameters in the xClockOutputInitStruct. - * @param pxClockOutputInitStruct pointer to a ClockOutputInit structure that - * contains the configuration information for the SPIRIT Clock Output. - * @retval None. - * @note The function SpiritGpioClockOutput() must be called in order to enable - * or disable the MCU clock dividers. - */ -void SpiritGpioClockOutputInit(ClockOutputInit* pxClockOutputInitStruct) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(pxClockOutputInitStruct->xClockOutputXOPrescaler)); - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(pxClockOutputInitStruct->xClockOutputRCOPrescaler)); - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(pxClockOutputInitStruct->xExtraClockCycles)); - - /* Calculates the register value to write according to the specified configuration */ - tempRegValue = ((uint8_t)(pxClockOutputInitStruct->xClockOutputXOPrescaler) | (uint8_t)(pxClockOutputInitStruct->xClockOutputRCOPrescaler) | \ - (uint8_t)(pxClockOutputInitStruct->xExtraClockCycles)); - - /* Writes the MCU_CLOCK register */ - g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the XO ratio as clock output. - * @param xXOPrescaler the XO prescaler to be used as clock output. - * This parameter can be any value of @ref ClockOutputXOPrescaler . - * @retval None - */ -void SpiritGpioSetXOPrescaler(ClockOutputXOPrescaler xXOPrescaler) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(xXOPrescaler)); - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the XO_RATIO field and writes the new value */ - tempRegValue &= 0x61; - tempRegValue |= ((uint8_t)xXOPrescaler); - - /* Writes the new XO prescaler in the MCU_CLOCK register */ - g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the settled XO prescaler as clock output. - * @param None. - * @retval ClockOutputXOPrescaler Settled XO prescaler used for clock - * output. This parameter can be a value of @ref ClockOutputXOPrescaler . - */ -ClockOutputXOPrescaler SpiritGpioGetXOPrescaler(void) -{ - uint8_t tempRegValue = 0x00; - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the XO_RATIO field and return the value */ - return ((ClockOutputXOPrescaler)(tempRegValue & 0x1E)); - -} - - -/** - * @brief Sets the RCO ratio as clock output - * @param xRCOPrescaler the RCO prescaler to be used as clock output. - * This parameter can be any value of @ref ClockOutputRCOPrescaler . - * @retval None. - */ -void SpiritGpioSetRCOPrescaler(ClockOutputRCOPrescaler xRCOPrescaler) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(xRCOPrescaler)); - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the RCO_RATIO field and writes the new value */ - tempRegValue &= 0xFE; - tempRegValue |= ((uint8_t)xRCOPrescaler); - - /* Writes the new RCO prescaler in the MCU_CLOCK register */ - g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the settled RCO prescaler as clock output. - * @param None. - * @retval ClockOutputRCOPrescaler Settled RCO prescaler used for clock - * output. This parameter can be a value of @ref ClockOutputRCOPrescaler. - */ -ClockOutputRCOPrescaler SpiritGpioGetRCOPrescaler(void) -{ - uint8_t tempRegValue = 0x00; - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the RCO_RATIO field and returns the value */ - return ((ClockOutputRCOPrescaler)(tempRegValue & 0x01)); - -} - - -/** - * @brief Sets the RCO ratio as clock output. - * @param xExtraCycles the number of extra clock cycles provided before switching - * to STANDBY state. This parameter can be any value of @ref ExtraClockCycles . - * @retval None. - */ -void SpiritGpioSetExtraClockCycles(ExtraClockCycles xExtraCycles) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xExtraCycles)); - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the CLOCK_TAIL field and writes the new value */ - tempRegValue &= 0x9F; - tempRegValue |= ((uint8_t)xExtraCycles); - - /* Writes the new number of extra clock cycles in the MCU_CLOCK register */ - g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the settled RCO prescaler as clock output. - * @param None. - * @retval ExtraClockCycles Settled number of extra clock cycles - * provided before switching to STANDBY state. This parameter can be - * any value of @ref ExtraClockCycles . - */ -ExtraClockCycles SpiritGpioGetExtraClockCycles(void) -{ - uint8_t tempRegValue = 0x00; - - /* Reads the MCU_CLK_CONFIG register */ - g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); - - /* Mask the CLOCK_TAIL field and returns the value */ - return ((ExtraClockCycles)(tempRegValue & 0x60)); - -} - - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Irq.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Irq.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,320 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Irq.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT IRQs. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Irq.h" -#include "MCU_Interface.h" - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Irq - * @{ - */ - - -/** - * @defgroup Irq_Private_TypesDefinitions IRQ Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Irq_Private_Defines IRQ Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Irq_Private_Macros IRQ Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Irq_Private_Variables IRQ Private Variables - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup Irq_Private_FunctionPrototypes IRQ Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Irq_Private_Functions IRQ Private Functions - * @{ - */ - - -/** - * @brief De initializate the SpiritIrqs structure setting all the bitfield to 0. - * Moreover, it sets the IRQ mask registers to 0x00000000, disabling all IRQs. - * @param pxIrqInit pointer to a variable of type @ref SpiritIrqs, in which all the - * bitfields will be settled to zero. - * @retval None. - */ -void SpiritIrqDeInit(SpiritIrqs* pxIrqInit) -{ - uint8_t tempRegValue[4]={0x00,0x00,0x00,0x00}; - - if(pxIrqInit!=NULL) - { - /* Sets the bitfields of passed structure to one */ - *(uint32_t*)pxIrqInit = 0x0; - } - - /* Writes the IRQ_MASK registers */ - g_xStatus = SpiritSpiWriteRegisters(IRQ_MASK3_BASE, 4, tempRegValue); -} - - -/** - * @brief Enables all the IRQs according to the user defined pxIrqInit structure. - * @param pxIrqInit pointer to a variable of type @ref SpiritIrqs, through which the - * user enable specific IRQs. This parameter is a pointer to a SpiritIrqs. - * For example suppose to enable only the two IRQ Low Battery Level and Tx Data Sent: - * @code - * SpiritIrqs myIrqInit = {0}; - * myIrqInit.IRQ_LOW_BATT_LVL = 1; - * myIrqInit.IRQ_TX_DATA_SENT = 1; - * SpiritIrqInit(&myIrqInit); - * @endcode - * @retval None. - */ -void SpiritIrqInit(SpiritIrqs* pxIrqInit) -{ - /* Writes the IRQ_MASK registers */ - g_xStatus = SpiritSpiWriteRegisters(IRQ_MASK3_BASE, 4, (uint8_t*)pxIrqInit); - -} - - -/** - * @brief Enables or disables a specific IRQ. - * @param xIrq IRQ to enable or disable. - * This parameter can be any value of @ref IrqList. - * @param xNewState new state for the IRQ. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritIrq(IrqList xIrq, SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue[4]; - uint32_t tempValue = 0; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_IRQ_LIST(xIrq)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the IRQ_MASK registers */ - g_xStatus = SpiritSpiReadRegisters(IRQ_MASK3_BASE, 4, tempRegValue); - - /* Build the IRQ mask word */ - for(uint8_t i=0; i<4; i++) - { - tempValue += ((uint32_t)tempRegValue[i])<<(8*(3-i)); - } - - /* Rebuild the new mask according to user request */ - if(xNewState == S_DISABLE) - { - tempValue &= (~xIrq); - } - else - { - tempValue |= (xIrq); - } - - /* Build the array of bytes to write in the IRQ_MASK registers */ - for(uint8_t j=0; j<4; j++) - { - tempRegValue[j] = (uint8_t)(tempValue>>(8*(3-j))); - } - - /* Writes the new IRQ mask in the corresponding registers */ - g_xStatus = SpiritSpiWriteRegisters(IRQ_MASK3_BASE, 4, tempRegValue); - -} - - -/** - * @brief Fills a pointer to a structure of SpiritIrqs type reading the IRQ_MASK registers. - * @param pxIrqMask pointer to a variable of type @ref SpiritIrqs, through which the - * user can read which IRQs are enabled. All the bitfields equals to zero correspond - * to enabled IRQs, while all the bitfields equals to one correspond to disabled IRQs. - * This parameter is a pointer to a SpiritIrqs. - * For example suppose that the Power On Reset and RX Data ready are the only enabled IRQs. - * @code - * SpiritIrqs myIrqMask; - * SpiritIrqGetStatus(&myIrqMask); - * @endcode - * Then - * myIrqMask.IRQ_POR and myIrqMask.IRQ_RX_DATA_READY are equal to 0 - * while all the other bitfields are equal to one. - * @retval None. - */ -void SpiritIrqGetMask(SpiritIrqs* pxIrqMask) -{ - /* Reads IRQ_MASK registers */ - g_xStatus = SpiritSpiReadRegisters(IRQ_MASK3_BASE, 4, (uint8_t*)pxIrqMask); -} - - -/** - * @brief Filla a pointer to a structure of SpiritIrqs type reading the IRQ_STATUS registers. - * @param pxIrqStatus pointer to a variable of type @ref SpiritIrqs, through which the - * user can read the status of all the IRQs. All the bitfields equals to one correspond - * to the raised interrupts. This parameter is a pointer to a SpiritIrqs. - * For example suppose that the XO settling timeout is raised as well as the Sync word - * detection. - * @code - * SpiritIrqs myIrqStatus; - * SpiritIrqGetStatus(&myIrqStatus); - * @endcode - * Then - * myIrqStatus.IRQ_XO_COUNT_EXPIRED and myIrqStatus.IRQ_VALID_SYNC are equals to 1 - * while all the other bitfields are equals to zero. - * @retval None. - */ -void SpiritIrqGetStatus(SpiritIrqs* pxIrqStatus) -{ - /* Reads IRQ_STATUS registers */ - g_xStatus = SpiritSpiReadRegisters(IRQ_STATUS3_BASE, 4, (uint8_t*)pxIrqStatus); -} - - -/** - * @brief Clear the IRQ status registers. - * @param None. - * @retval None. - */ -void SpiritIrqClearStatus(void) -{ - uint8_t tempRegValue[4]; - - /* Reads the IRQ_STATUS registers clearing all the flags */ - g_xStatus = SpiritSpiReadRegisters(IRQ_STATUS3_BASE, 4, tempRegValue); - -} - - -/** - * @brief Verifies if a specific IRQ has been generated. - * The call resets all the IRQ status, so it can't be used in case of multiple raising interrupts. - * @param xFlag IRQ flag to be checked. - * This parameter can be any value of @ref IrqList. - * @retval SpiritBool S_TRUE or S_FALSE. - */ -SpiritBool SpiritIrqCheckFlag(IrqList xFlag) -{ - uint8_t tempRegValue[4]; - uint32_t tempValue = 0; - SpiritBool flag; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_IRQ_LIST(xFlag)); - - /* Reads registers and build the status word */ - g_xStatus = SpiritSpiReadRegisters(IRQ_STATUS3_BASE, 4, tempRegValue); - for(uint8_t i=0; i<4; i++) - { - tempValue += ((uint32_t)tempRegValue[i])<<(8*(3-i)); - } - - if(tempValue & xFlag) - { - flag = S_TRUE; - } - else - { - flag = S_FALSE; - } - - return flag; - -} - - -/** - *@} - */ - - -/** - *@} - */ - - -/** - *@} - */ - - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_LinearFifo.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_LinearFifo.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,337 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_LinearFifo.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT Fifo. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_LinearFifo.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_LinearFifo - * @{ - */ - - -/** - * @defgroup LinearFifo_Private_TypesDefinitions Linear FIFO Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup LinearFifo_Private_Defines Linear FIFO Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup LinearFifo_Private_Macros Linear FIFO Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup LinearFifo_Private_Variables Linear FIFO Private Variables - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup LinearFifo_Private_FunctionPrototypes Linear FIFO Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup LinearFifo_Private_Functions Linear FIFO Private Functions - * @{ - */ - -/** - * @brief Returns the number of elements in the Rx FIFO. - * @param None. - * @retval uint8_t Number of elements in the Rx FIFO. - */ -uint8_t SpiritLinearFifoReadNumElementsRxFifo(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(LINEAR_FIFO_STATUS0_BASE, 1, &tempRegValue); - - /* Build and return value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Returns the number of elements in the Tx FIFO. - * @param None. - * @retval uint8_t Number of elements in the Tx FIFO. - */ -uint8_t SpiritLinearFifoReadNumElementsTxFifo(void) -{ - uint8_t tempRegValue; - - /* Reads the number of elements in TX FIFO and return the value */ - g_xStatus = SpiritSpiReadRegisters(LINEAR_FIFO_STATUS1_BASE, 1, &tempRegValue); - - /* Build and return value */ - return (tempRegValue & 0x7F); -} - - -/** - * @brief Sets the almost full threshold for the Rx FIFO. When the number of elements in RX FIFO reaches this value an interrupt can be generated to the MCU. - * @note The almost full threshold is encountered from the top of the FIFO. For example, if it is set to 7 the almost - * full FIFO irq will be raised when the number of elements is equals to 96-7 = 89. - * @param cThrRxFifo almost full threshold. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritLinearFifoSetAlmostFullThresholdRx(uint8_t cThrRxFifo) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_FIFO_THR(cThrRxFifo)); - - /* Build the register value */ - tempRegValue = cThrRxFifo & 0x7F; - - /* Writes the Almost Full threshold for RX in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(FIFO_CONFIG3_RXAFTHR_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the almost full threshold for RX FIFO. - * @note The almost full threshold is encountered from the top of the FIFO. For example, if it is 7 the almost - * full FIFO irq will be raised when the number of elements is equals to 96-7 = 89. - * @param None. - * @retval uint8_t Almost full threshold for Rx FIFO. - */ -uint8_t SpiritLinearFifoGetAlmostFullThresholdRx(void) -{ - uint8_t tempRegValue; - - /* Reads the almost full threshold for RX FIFO and return the value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG3_RXAFTHR_BASE, 1, &tempRegValue); - - /* Build and return value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the almost empty threshold for the Rx FIFO. When the number of elements in RX FIFO reaches this value an interrupt can be generated to the MCU. - * @param cThrRxFifo almost empty threshold. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritLinearFifoSetAlmostEmptyThresholdRx(uint8_t cThrRxFifo) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_FIFO_THR(cThrRxFifo)); - - /* Build the register value */ - tempRegValue = cThrRxFifo & 0x7F; - - /* Writes the Almost Empty threshold for RX in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(FIFO_CONFIG2_RXAETHR_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the almost empty threshold for Rx FIFO. - * @param None. - * @retval uint8_t Almost empty threshold for Rx FIFO. - */ -uint8_t SpiritLinearFifoGetAlmostEmptyThresholdRx(void) -{ - uint8_t tempRegValue; - - /* Reads the almost empty threshold for RX FIFO and returns the value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG2_RXAETHR_BASE, 1, &tempRegValue); - - /* Build and return value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the almost full threshold for the Tx FIFO. When the number of elements in TX FIFO reaches this value an interrupt can be generated to the MCU. - * @note The almost full threshold is encountered from the top of the FIFO. For example, if it is set to 7 the almost - * full FIFO irq will be raised when the number of elements is equals to 96-7 = 89. - * @param cThrTxFifo almost full threshold. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritLinearFifoSetAlmostFullThresholdTx(uint8_t cThrTxFifo) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_FIFO_THR(cThrTxFifo)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG1_TXAFTHR_BASE, 1, &tempRegValue); - - /* Build the register value */ - tempRegValue &= 0x80; - tempRegValue |= cThrTxFifo; - - /* Writes the Almost Full threshold for Tx in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(FIFO_CONFIG1_TXAFTHR_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the almost full threshold for Tx FIFO. - * @note The almost full threshold is encountered from the top of the FIFO. For example, if it is set to 7 the almost - * full FIFO irq will be raised when the number of elements is equals to 96-7 = 89. - * @param None. - * @retval uint8_t Almost full threshold for Tx FIFO. - */ -uint8_t SpiritLinearFifoGetAlmostFullThresholdTx(void) -{ - uint8_t tempRegValue; - - /* Reads the almost full threshold for Tx FIFO and returns the value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG1_TXAFTHR_BASE, 1, &tempRegValue); - - /* Build and returns value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Sets the almost empty threshold for the Tx FIFO. When the number of elements in Tx FIFO reaches this value an interrupt can can be generated to the MCU. - * @param cThrTxFifo: almost empty threshold. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritLinearFifoSetAlmostEmptyThresholdTx(uint8_t cThrTxFifo) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_FIFO_THR(cThrTxFifo)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG0_TXAETHR_BASE, 1, &tempRegValue); - - /* Build the register value */ - tempRegValue &= 0x80; - tempRegValue |= cThrTxFifo; - - /* Writes the Almost Empty threshold for Tx in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(FIFO_CONFIG0_TXAETHR_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the almost empty threshold for Tx FIFO. - * @param None. - * @retval uint8_t Almost empty threshold for Tx FIFO. - */ -uint8_t SpiritLinearFifoGetAlmostEmptyThresholdTx(void) -{ - uint8_t tempRegValue; - - /* Reads the almost empty threshold for TX FIFO and returns the value */ - g_xStatus = SpiritSpiReadRegisters(FIFO_CONFIG0_TXAETHR_BASE, 1, &tempRegValue); - - /* Build and return value */ - return (tempRegValue & 0x7F); - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Management.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Management.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,364 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Management.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief The management layer for SPIRIT1 library. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Management.h" - -/** -* @addtogroup SPIRIT_Libraries -* @{ -*/ - - -/** -* @defgroup SPIRIT_MANAGEMENT SPIRIT Management -* @{ -*/ - -/** -* @brief BS value to write in the SYNT0 register according to the selected band -*/ -static const uint8_t s_vectcBandRegValue[4]={SYNT0_BS_6, SYNT0_BS_12, SYNT0_BS_16, SYNT0_BS_32}; - -#define COMMUNICATION_STATE_TX 0 -#define COMMUNICATION_STATE_RX 1 -#define COMMUNICATION_STATE_NONE 2 - -static uint32_t s_nDesiredFrequency; - -static volatile uint8_t s_cCommunicationState = COMMUNICATION_STATE_NONE; - - -/** -* @brief Factor is: B/2 used in the formula for SYNTH word calculation -*/ -static const uint8_t s_vectcBHalfFactor[4]={(HIGH_BAND_FACTOR/2), (MIDDLE_BAND_FACTOR/2), (LOW_BAND_FACTOR/2), (VERY_LOW_BAND_FACTOR/2)}; - - -/** -* @defgroup SPIRIT_MANAGEMENT_FUNCTIONS SPIRIT Management Functions -* @{ -*/ - - -/** -* @defgroup WORKAROUND_FUNCTIONS SPIRIT Management Workaround Functions -* @{ -*/ - -/** -* @brief Private SpiritRadioSetFrequencyBase function only used in SpiritManagementWaVcoCalibration. -* @param lFBase the base carrier frequency expressed in Hz as unsigned word. -* @retval None. -*/ -void SpiritManagementSetFrequencyBase(uint32_t lFBase) -{ - uint32_t synthWord, Fc; - uint8_t band = 0, anaRadioRegArray[4], wcp; - - /* Check the parameter */ - s_assert_param(IS_FREQUENCY_BAND(lFBase)); - - /* Search the operating band */ - if(IS_FREQUENCY_BAND_HIGH(lFBase)) - { - band = HIGH_BAND; - } - else if(IS_FREQUENCY_BAND_MIDDLE(lFBase)) - { - band = MIDDLE_BAND; - } - else if(IS_FREQUENCY_BAND_LOW(lFBase)) - { - band = LOW_BAND; - } - else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase)) - { - band = VERY_LOW_BAND; - } - - int32_t FOffset = SpiritRadioGetFrequencyOffset(); - uint32_t lChannelSpace = SpiritRadioGetChannelSpace(); - uint8_t cChannelNum = SpiritRadioGetChannel(); - - /* Calculates the channel center frequency */ - Fc = lFBase + FOffset + lChannelSpace*cChannelNum; - - /* Reads the reference divider */ - uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1; - - switch(band) - { - case VERY_LOW_BAND: - if(Fc<161281250) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case LOW_BAND: - if(Fc<322562500) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case MIDDLE_BAND: - if(Fc<430083334) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case HIGH_BAND: - if(Fc<860166667) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - } - - /* Search the VCO charge pump word and set the corresponding register */ - wcp = SpiritRadioSearchWCP(Fc); - - synthWord = (uint32_t)(lFBase*(((double)(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band]))/SpiritRadioGetXtalFrequency())); - - /* Build the array of registers values for the analog part */ - anaRadioRegArray[0] = (uint8_t)(((synthWord>>21)&(0x0000001F))|(wcp<<5)); - anaRadioRegArray[1] = (uint8_t)((synthWord>>13)&(0x000000FF)); - anaRadioRegArray[2] = (uint8_t)((synthWord>>5)&(0x000000FF)); - anaRadioRegArray[3] = (uint8_t)(((synthWord&0x0000001F)<<3)| s_vectcBandRegValue[band]); - - /* Configures the needed Analog Radio registers */ - g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, anaRadioRegArray); -} - -uint8_t SpiritManagementWaVcoCalibration(void) -{ - uint8_t s_cVcoWordRx; - uint8_t s_cVcoWordTx; - uint32_t nFreq; - uint8_t cRestore = 0; - uint8_t cStandby = 0; - uint32_t xtal_frequency = SpiritRadioGetXtalFrequency(); - - /* Enable the reference divider if the XTAL is between 48 and 52 MHz */ - if(xtal_frequency>DOUBLE_XTAL_THR) - { - if(!SpiritRadioGetRefDiv()) - { - cRestore = 1; - nFreq = SpiritRadioGetFrequencyBase(); - SpiritRadioSetRefDiv(S_ENABLE); - SpiritManagementSetFrequencyBase(nFreq); - } - } - nFreq = SpiritRadioGetFrequencyBase(); - - /* Increase the VCO current */ - uint8_t tmp = 0x19; SpiritSpiWriteRegisters(0xA1,1,&tmp); - - SpiritCalibrationVco(S_ENABLE); - - SpiritRefreshStatus(); - if(g_xStatus.MC_STATE == MC_STATE_STANDBY) - { - cStandby = 1; - SpiritCmdStrobeReady(); - do{ - SpiritRefreshStatus(); - if(g_xStatus.MC_STATE == 0x13) - { - return 1; - } - }while(g_xStatus.MC_STATE != MC_STATE_READY); - } - - SpiritCmdStrobeLockTx(); - - do{ - SpiritRefreshStatus(); - if(g_xStatus.MC_STATE == 0x13) - { - return 1; - } - }while(g_xStatus.MC_STATE != MC_STATE_LOCK); - - s_cVcoWordTx = SpiritCalibrationGetVcoCalData(); - - SpiritCmdStrobeReady(); - - do{ - SpiritRefreshStatus(); - }while(g_xStatus.MC_STATE != MC_STATE_READY); - - - SpiritCmdStrobeLockRx(); - - do{ - SpiritRefreshStatus(); - if(g_xStatus.MC_STATE == 0x13) - { - return 1; - } - }while(g_xStatus.MC_STATE != MC_STATE_LOCK); - - s_cVcoWordRx = SpiritCalibrationGetVcoCalData(); - - SpiritCmdStrobeReady(); - - do{ - SpiritRefreshStatus(); - if(g_xStatus.MC_STATE == 0x13) - { - return 1; - } - }while(g_xStatus.MC_STATE != MC_STATE_READY); - - if(cStandby == 1) - { - SpiritCmdStrobeStandby(); - } - SpiritCalibrationVco(S_DISABLE); - - /* Disable the reference divider if the XTAL is between 48 and 52 MHz */ - if(cRestore) - { - SpiritRadioSetRefDiv(S_DISABLE); - SpiritManagementSetFrequencyBase(nFreq); - } - - /* Restore the VCO current */ - tmp = 0x11; SpiritSpiWriteRegisters(0xA1,1,&tmp); - - SpiritCalibrationSetVcoCalDataTx(s_cVcoWordTx); - SpiritCalibrationSetVcoCalDataRx(s_cVcoWordRx); - - return 0; -} - - -void SpiritManagementWaCmdStrobeTx(void) -{ - if(s_cCommunicationState != COMMUNICATION_STATE_TX) - { - //uint32_t xtal_frequency = SpiritRadioGetXtalFrequency(); - - /* To achive the max output power */ - if(s_nDesiredFrequency>=150000000 && s_nDesiredFrequency<=470000000) - { - /* Optimal setting for Tx mode only */ - SpiritRadioSetPACwc(LOAD_3_6_PF); - } - else - { - /* Optimal setting for Tx mode only */ - SpiritRadioSetPACwc(LOAD_0_PF); - } - - uint8_t tmp = 0x11; SpiritSpiWriteRegisters(0xa9, 1, &tmp); /* Enable VCO_L buffer */ - tmp = 0x20; SpiritSpiWriteRegisters(PM_CONFIG1_BASE, 1, &tmp); /* Set SMPS switching frequency */ - - s_cCommunicationState = COMMUNICATION_STATE_TX; - } -} - - -void SpiritManagementWaCmdStrobeRx(void) -{ - if(s_cCommunicationState != COMMUNICATION_STATE_RX) - { - uint8_t tmp = 0x98; SpiritSpiWriteRegisters(PM_CONFIG1_BASE, 1, &tmp); /* Set SMPS switching frequency */ - SpiritRadioSetPACwc(LOAD_0_PF); /* Set the correct CWC parameter */ - - s_cCommunicationState = COMMUNICATION_STATE_RX; - } -} - -void SpiritManagementWaTRxFcMem(uint32_t nDesiredFreq) -{ - s_cCommunicationState = COMMUNICATION_STATE_NONE; - s_nDesiredFrequency = nDesiredFreq; -} - - -void SpiritManagementWaExtraCurrent(void) -{ - uint8_t tmp= 0xCA;SpiritSpiWriteRegisters(0xB2, 1, &tmp); - tmp= 0x04;SpiritSpiWriteRegisters(0xA8, 1, &tmp); - /* just a read to loose some microsecs more */ - SpiritSpiReadRegisters(0xA8, 1, &tmp); - tmp= 0x00;SpiritSpiWriteRegisters(0xA8, 1, &tmp); -} - -/** -* @} -*/ - - - -/** -* @} -*/ - - -/** -* @} -*/ - -/** -* @} -*/ - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktBasic.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktBasic.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,615 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktBasic.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT Basic packets. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_PktBasic.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_PktBasic - * @{ - */ - - -/** - * @defgroup PktBasic_Private_TypesDefinitions Pkt Basic Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Private_Defines Pkt Basic Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Private_Macros Pkt Basic Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Private_Variables Pkt Basic Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup PktBasic_Private_FunctionPrototypes Pkt Basic Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktBasic_Private_Functions Pkt Basic Private Functions - * @{ - */ - -/** - * @brief Initializes the SPIRIT Basic packet according to the specified parameters in the PktBasicInit struct. - * Notice that this function sets the autofiltering option on CRC if it is set to any value different from BASIC_NO_CRC. - * @param pxPktBasicInit Basic packet init structure. - * This parameter is a pointer to @ref PktBasicInit. - * @retval None. - */ -void SpiritPktBasicInit(PktBasicInit* pxPktBasicInit) -{ - uint8_t tempRegValue[4], i; - - /* Check the parameters */ - s_assert_param(IS_BASIC_PREAMBLE_LENGTH(pxPktBasicInit->xPreambleLength)); - s_assert_param(IS_BASIC_SYNC_LENGTH(pxPktBasicInit->xSyncLength)); - s_assert_param(IS_BASIC_CRC_MODE(pxPktBasicInit->xCrcMode)); - s_assert_param(IS_BASIC_LENGTH_WIDTH_BITS(pxPktBasicInit->cPktLengthWidth)); - s_assert_param(IS_BASIC_FIX_VAR_LENGTH(pxPktBasicInit->xFixVarLength)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicInit->xAddressField)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicInit->xFec)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicInit->xDataWhitening)); - s_assert_param(IS_BASIC_CONTROL_LENGTH(pxPktBasicInit->xControlLength)); - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]); - - /* Mask a reserved bit */ - tempRegValue[0] &= ~0x20; - - /* Always set the automatic packet filtering */ - tempRegValue[0] |= PROTOCOL1_AUTO_PCKT_FLT_MASK; - - /* Writes the value on register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]); - - /* Reads the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Always reset the control and source filtering (also if it is not present in basic) */ - tempRegValue[0] &= ~(PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK | PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK); - - /* Writes the value on register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - if(pxPktBasicInit->xAddressField == S_ENABLE) - { - tempRegValue[0]=0x08; - } - else - { - tempRegValue[0]=0x00; - } - /* Address and control length setting */ - tempRegValue[0] |= ((uint8_t) pxPktBasicInit->xControlLength); - - /* Packet format and width length setting */ - pxPktBasicInit->cPktLengthWidth == 0 ? pxPktBasicInit->cPktLengthWidth=1 : pxPktBasicInit->cPktLengthWidth; - tempRegValue[1] = ((uint8_t) PCKTCTRL3_PCKT_FRMT_BASIC) | ((uint8_t)(pxPktBasicInit->cPktLengthWidth-1)); - - /* Preamble, sync and fixed or variable length setting */ - tempRegValue[2] = ((uint8_t) pxPktBasicInit->xPreambleLength) | ((uint8_t) pxPktBasicInit->xSyncLength) | - ((uint8_t) pxPktBasicInit->xFixVarLength); - - /* CRC length, whitening and FEC setting */ - tempRegValue[3] = (uint8_t) pxPktBasicInit->xCrcMode; - - if(pxPktBasicInit->xDataWhitening == S_ENABLE) - { - tempRegValue[3] |= PCKTCTRL1_WHIT_MASK; - } - - if(pxPktBasicInit->xFec == S_ENABLE) - { - tempRegValue[3] |= PCKTCTRL1_FEC_MASK; - } - - /* Writes registers */ - SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 4, tempRegValue); - - /* Sync words setting */ - for(i=0;i<4;i++) - { - if(i<3-(pxPktBasicInit->xSyncLength >>1)) - { - tempRegValue[i]=0; - } - else - { - tempRegValue[i] = (uint8_t)(pxPktBasicInit->lSyncWords>>(8*i)); - } - } - - /* Sets CRC check bit */ - if(pxPktBasicInit->xCrcMode == PKT_NO_CRC) - { - SpiritPktBasicFilterOnCrc(S_DISABLE); - } - else - { - SpiritPktBasicFilterOnCrc(S_ENABLE); - } - - - g_xStatus = SpiritSpiWriteRegisters(SYNC4_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns the SPIRIT Basic packet structure according to the specified parameters in the registers. - * @param pxPktBasicInit Basic packet init structure. - * This parameter is a pointer to @ref PktBasicInit. - * @retval None. - */ -void SpiritPktBasicGetInfo(PktBasicInit* pxPktBasicInit) -{ - uint8_t tempRegValue[10]; - - /* Reads registers */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 10, tempRegValue); - - /* Length width */ - pxPktBasicInit->cPktLengthWidth=(tempRegValue[1] & 0x0F)+1; - - /* Address field */ - pxPktBasicInit->xAddressField=(SpiritFunctionalState)((tempRegValue[0]>>3) & 0x01); - - /* Control length */ - pxPktBasicInit->xControlLength=(BasicControlLength)(tempRegValue[0] & 0x07); - - /* CRC mode */ - pxPktBasicInit->xCrcMode=(BasicCrcMode)(tempRegValue[3] & 0xE0); - - /* Whitening */ - pxPktBasicInit->xDataWhitening=(SpiritFunctionalState)((tempRegValue[3] >> 4) & 0x01); - - /* FEC */ - pxPktBasicInit->xFec=(SpiritFunctionalState)(tempRegValue[3] & 0x01); - - /* FIX or VAR bit */ - pxPktBasicInit->xFixVarLength=(BasicFixVarLength)(tempRegValue[2] & 0x01); - - /* Preamble length */ - pxPktBasicInit->xPreambleLength=(BasicPreambleLength)(tempRegValue[2] & 0xF8); - - /* Sync length */ - pxPktBasicInit->xSyncLength=(BasicSyncLength)(tempRegValue[2] & 0x06); - - /* sync Words */ - pxPktBasicInit->lSyncWords=0; - for(uint8_t i=0 ; i<4 ; i++) - { - if(i>2-(((uint8_t)pxPktBasicInit->xSyncLength) >>1)) - { - pxPktBasicInit->lSyncWords |= (uint32_t)(tempRegValue[i+6])<<(8*i); - } - } - -} - - -/** - * @brief Initializes the SPIRIT Basic packet addresses according to the specified - * parameters in the PktBasicAddressesInit struct. - * @param pxPktBasicAddresses Basic packet addresses init structure. - * This parameter is a pointer to @ref PktBasicAddresses. - * @retval None. - */ -void SpiritPktBasicAddressesInit(PktBasicAddressesInit* pxPktBasicAddresses) -{ - uint8_t tempRegValue[3]; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicAddresses->xFilterOnMyAddress)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicAddresses->xFilterOnMulticastAddress)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktBasicAddresses->xFilterOnBroadcastAddress)); - - - /* Reads the PCKT_FLT_OPTIONS ragister */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Enables or disables filtering on my address */ - if(pxPktBasicAddresses->xFilterOnMyAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - - /* Enables or disables filtering on multicast address */ - if(pxPktBasicAddresses->xFilterOnMulticastAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - - /* Enables or disables filtering on broadcast address */ - if(pxPktBasicAddresses->xFilterOnBroadcastAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Fills the array with the addresses passed in the structure */ - tempRegValue[0] = pxPktBasicAddresses->cBroadcastAddress; - tempRegValue[1] = pxPktBasicAddresses->cMulticastAddress; - tempRegValue[2] = pxPktBasicAddresses->cMyAddress; - - /* Writes values on the PCKT_FLT_GOALS registers */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue); - - -} - - -/** - * @brief Returns the SPIRIT Basic packet addresses structure according to the specified - * parameters in the registers. - * @param pxPktBasicAddresses Basic packet addresses init structure. - * This parameter is a pointer to @ref PktBasicAddresses. - * @retval None. - */ -void SpiritPktBasicGetAddressesInfo(PktBasicAddressesInit* pxPktBasicAddresses) -{ - uint8_t tempRegValue[3]; - - /* Reads values on the PCKT_FLT_GOALS registers */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue); - - /* Fit the structure with the read addresses */ - pxPktBasicAddresses->cBroadcastAddress = tempRegValue[0]; - pxPktBasicAddresses->cMulticastAddress = tempRegValue[1]; - pxPktBasicAddresses->cMyAddress = tempRegValue[2]; - - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Fit the structure with the read filtering bits */ - pxPktBasicAddresses->xFilterOnBroadcastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 1) & 0x01); - pxPktBasicAddresses->xFilterOnMulticastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 2) & 0x01); - pxPktBasicAddresses->xFilterOnMyAddress = (SpiritFunctionalState)((tempRegValue[0] >> 3) & 0x01); - -} - - -/** - * @brief Configures the Basic packet format as packet used by SPIRIT. - * @param None. - * @retval None. - */ -void SpiritPktBasicSetFormat(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Build the new value. Also set to 0 the direct RX mode bits */ - tempRegValue &= 0x0F; - tempRegValue |= (uint8_t)PCKTCTRL3_PCKT_FRMT_BASIC; - - /* Writes the value on the PCKTCTRL3 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Reads the PCKTCTRL1_BASE register */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build the new value. Set to 0 the direct TX mode bits */ - tempRegValue &= 0xF3; - - /* Writes the value on the PCKTCTRL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Mask a reserved bit */ - tempRegValue &= ~0x20; - - /* Writes the value on register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); -} - - -/** - * @brief Sets the address length for SPIRIT Basic packets. - * @param xAddressField length of ADDRESS in bytes. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktBasicAddressField(SpiritFunctionalState xAddressField) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xAddressField)); - - /* Reads the PCKTCTRL4 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - - /* Build the address length for the register */ - if(xAddressField==S_ENABLE) - { - tempRegValue |= 0x08; - } - else - { - tempRegValue &= 0x07; - } - - /* Writes the new value on the PCKTCTRL4 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Specifies if the Address field for SPIRIT Basic packets is enabled or disabled. - * @param None. - * @retval SpiritFunctionalState Notifies if the address field is enabled or disabled. - */ -SpiritFunctionalState SpiritPktBasicGetAddressField(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL4 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - - /* Returns the address field value */ - if(tempRegValue & PCKTCTRL4_ADDRESS_LEN_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - - -/** - * @brief Sets the payload length for SPIRIT Basic packets. Since the packet length - * depends from the address and the control field size, this - * function reads the correspondent registers in order to determine - * the correct packet length to be written. - * @param nPayloadLength payload length in bytes. - * This parameter is an uint16_t. - * @retval None. - */ -void SpiritPktBasicSetPayloadLength(uint16_t nPayloadLength) -{ - uint8_t tempRegValue[2]; - uint16_t overSize=0; - - /* Computes the oversize (address + control) size */ - if(SpiritPktBasicGetAddressField()) - { - overSize=1; - } - overSize += (uint16_t) SpiritPktBasicGetControlLength(); - - /* Computes PCKTLEN0 value from nPayloadLength */ - tempRegValue[1]=BASIC_BUILD_PCKTLEN0(nPayloadLength+overSize); - /* Computes PCKTLEN1 value from nPayloadLength */ - tempRegValue[0]=BASIC_BUILD_PCKTLEN1(nPayloadLength+overSize); - - /* Writes data on the PCKTLEN1/0 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTLEN1_BASE, 2, tempRegValue); - -} - - -/** - * @brief Returns the payload length for SPIRIT Basic packets. Since the - * packet length depends from the address and the control - * field size, this function reads the correspondent - * registers in order to determine the correct payload length - * to be returned. - * @param None. - * @retval uint16_t Payload length in bytes. - */ -uint16_t SpiritPktBasicGetPayloadLength(void) -{ - uint8_t tempRegValue[2]; - uint16_t overSize=0; - - /* Computes the oversize (address + control) size */ - if(SpiritPktBasicGetAddressField()) - { - overSize=1; - } - overSize += (uint16_t) SpiritPktBasicGetControlLength(); - - /* Reads the packet length registers */ - g_xStatus = SpiritSpiReadRegisters(PCKTLEN1_BASE, 2, tempRegValue); - - /* Returns the packet length */ - return ((((uint16_t)tempRegValue[0])<<8) + (uint16_t) tempRegValue[1]) - overSize; -} - -/** - * @brief Returns the packet length field of the received packet. - * @param None. - * @retval uint16_t Packet length. - */ -uint16_t SpiritPktBasicGetReceivedPktLength(void) -{ - uint8_t tempRegValue[2]; - uint16_t overSize=0; - - /* Computes the oversize (address + control) size */ - if(SpiritPktBasicGetAddressField()) - { - overSize=1; - } - overSize += (uint16_t) SpiritPktBasicGetControlLength(); - - /* Reads the RX_PCKT_LENx registers value */ - g_xStatus = SpiritSpiReadRegisters(RX_PCKT_LEN1_BASE, 2, tempRegValue); - - /* Rebuild and return the length field */ - return (((((uint16_t) tempRegValue[0]) << 8) + (uint16_t) tempRegValue[1]) - overSize); -} - -/** - * @brief Computes and sets the variable payload length for SPIRIT Basic packets. - * @param nMaxPayloadLength payload length in bytes. - * This parameter is an uint16_t. - * @param xAddressField Enable or Disable Address Field. - * This parameter can be S_ENABLE or S_DISABLE. - * @param xControlLength Control length in bytes. - * This parameter can be any value of @ref BasicControlLength. - * @retval None. - */ -void SpiritPktBasicSetVarLengthWidth(uint16_t nMaxPayloadLength, SpiritFunctionalState xAddressField, BasicControlLength xControlLength) -{ - uint8_t tempRegValue, - addressLength, - i; - uint32_t packetLength; - - /* Sets the address length according to xAddressField */ - if(xAddressField == S_ENABLE) - { - addressLength=1; - } - else - { - addressLength=0; - } - - /* packet length = payload length + address length + control length */ - packetLength=nMaxPayloadLength+addressLength+xControlLength; - - /* Computes the number of bits */ - for(i=0;i<16;i++) - { - if(packetLength == 0) break; - { - packetLength >>= 1; - } - } - i==0 ? i=1 : i; - - /* Reads the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Build value for the length width */ - tempRegValue &= ~PCKTCTRL3_LEN_WID_MASK; - tempRegValue |= (uint8_t)(i-1); - - /* Writes the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - -} - - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktCommon.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktCommon.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1453 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktCommon.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of the common features of SPIRIT packets. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_PktCommon.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_PktCommon - * @{ - */ - - -/** - * @defgroup PktCommon_Private_TypesDefinitions Pkt Common Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Private_Defines Pkt Common Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Private_Macros Pkt Common Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Private_Variables Pkt Common Private Variables - * @{ - */ - -/** - *@} - */ - - - -/** - * @defgroup PktCommon_Private_FunctionPrototypes Pkt Common Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktCommon_Private_Functions Pkt Common Private Functions - * @{ - */ - -/** - * @brief Sets the CONTROL field length for SPIRIT packets. - * @param xControlLength length of CONTROL field in bytes. - * This parameter can be any value of @ref PktControlLength. - * @retval None. - */ -void SpiritPktCommonSetControlLength(PktControlLength xControlLength) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_CONTROL_LENGTH(xControlLength)); - - /* Reads the PCKTCTRL4 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - - /* Set the control length */ - tempRegValue &= ~PCKTCTRL4_CONTROL_LEN_MASK; - tempRegValue |= (uint8_t)xControlLength; - - /* Writes the new value on the PCKTCTRL4 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); -} - - -/** - * @brief Returns the CONTROL field length for SPIRIT packets. - * @param None. - * @retval uint8_t Control field length. - */ -uint8_t SpiritPktCommonGetControlLength(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL4 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - - /* Rebuild and return value */ - return (tempRegValue & PCKTCTRL4_CONTROL_LEN_MASK); -} - - -/** - * @brief Sets the PREAMBLE field Length mode for SPIRIT packets. - * @param xPreambleLength length of PREAMBLE field in bytes. - * This parameter can be any value of @ref PktPreambleLength. - * @retval None. - */ -void SpiritPktCommonSetPreambleLength(PktPreambleLength xPreambleLength) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_PREAMBLE_LENGTH(xPreambleLength)); - - /* Reads the PCKTCTRL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - - /* Set the preamble length */ - tempRegValue &= ~PCKTCTRL2_PREAMBLE_LENGTH_MASK; - tempRegValue |= (uint8_t)xPreambleLength; - - /* Writes the new value on the PCKTCTRL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); -} - - -/** - * @brief Returns the PREAMBLE field Length mode for SPIRIT packets. - * @param None. - * @retval uint8_t Preamble field length in bytes. - */ -uint8_t SpiritPktCommonGetPreambleLength(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - - /* Rebuild and return value */ - return ((tempRegValue & PCKTCTRL2_PREAMBLE_LENGTH_MASK)>>3) + 1; - -} - - -/** - * @brief Sets the SYNC field Length for SPIRIT packets. - * @param xSyncLength length of SYNC field in bytes. - * This parameter can be any value of @ref PktSyncLength. - * @retval None. - */ -void SpiritPktCommonSetSyncLength(PktSyncLength xSyncLength) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_SYNC_LENGTH(xSyncLength)); - - /* Reads the PCKTCTRL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - - /* Set the sync length */ - tempRegValue &= ~PCKTCTRL2_SYNC_LENGTH_MASK; - tempRegValue |= (uint8_t)xSyncLength; - - /* Writes the new value on the PCKTCTRL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the SYNC field Length for SPIRIT packets. - * @param None. - * @retval uint8_t Sync field length in bytes. - */ -uint8_t SpiritPktCommonGetSyncLength(void) -{ - uint8_t tempRetValue; - - /* Reads the PCKTCTRL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL2_BASE, 1, &tempRetValue); - - /* Rebuild and return value */ - return ((tempRetValue & PCKTCTRL2_SYNC_LENGTH_MASK)>>1) + 1; - -} - - -/** - * @brief Sets fixed or variable payload length mode for SPIRIT packets. - * @param xFixVarLength variable or fixed length. - * PKT_FIXED_LENGTH_VAR -> variable (the length is extracted from the received packet). - * PKT_FIXED_LENGTH_FIX -> fix (the length is set by PCKTLEN0 and PCKTLEN1). - * @retval None. - */ -void SpiritPktCommonSetFixVarLength(PktFixVarLength xFixVarLength) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_FIX_VAR_LENGTH(xFixVarLength)); - - /* Reads the PCKTCTRL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - - /* Set fixed or variable address mode */ - tempRegValue &= ~PCKTCTRL2_FIX_VAR_LEN_MASK; - tempRegValue |= (uint8_t)xFixVarLength; - - /* Writes the new value on the PCKTCTRL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables or Disables the filtering on CRC. - * @param xNewState new state for CRC_CHECK. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonFilterOnCrc(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PCKT_FLT_OPTIONS register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Modify the register value: enable or disable the CRC filtering */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_CRC_CHECK_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_CRC_CHECK_MASK; - } - - /* Writes the PCKT_FLT_OPTIONS register value */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the CRC filtering enable bit. - * @param None. - * @retval SpiritFunctionalState CRC filtering. - */ -SpiritFunctionalState SpiritPktCommonGetFilterOnCrc(void) -{ - uint8_t tempRegValue; - - - /* Reads the PCKT_FLT_OPTIONS register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Check the CRC filtering bit */ - if(tempRegValue & PCKT_FLT_OPTIONS_CRC_CHECK_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - - -/** - * @brief Sets the CRC mode for SPIRIT packets. - * @param xCrcMode length of CRC field in bytes. - * This parameter can be any value of @ref PktCrcMode. - * @retval None. - */ -void SpiritPktCommonSetCrcMode(PktCrcMode xCrcMode) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_CRC_MODE(xCrcMode)); - - /* Reads the PCKTCTRL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build data to write setting the CRC mode */ - tempRegValue &= ~PCKTCTRL1_CRC_MODE_MASK; - tempRegValue |= (uint8_t)xCrcMode; - - /* Writes the new value on the PCKTCTRL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the CRC mode for SPIRIT packets. - * @param None. - * @retval PktCrcMode Crc mode. - */ -PktCrcMode SpiritPktCommonGetCrcMode(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL1 register */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Rebuild and return value */ - return (PktCrcMode)(tempRegValue & 0xE0); - -} - - -/** - * @brief Enables or Disables WHITENING for SPIRIT packets. - * @param xNewState new state for WHITENING mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonWhitening(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PCKTCTRL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build data to write: set or reset the whitening enable bit */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKTCTRL1_WHIT_MASK; - } - else - { - tempRegValue &= ~PCKTCTRL1_WHIT_MASK; - } - - /* Writes the new value on the PCKTCTRL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables or Disables FEC for SPIRIT packets. - * @param xNewState new state for FEC mode. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonFec(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PCKTCTRL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build data to write: set or reset the FEC enable bit */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKTCTRL1_FEC_MASK; - } - else - { - tempRegValue &= ~PCKTCTRL1_FEC_MASK; - } - - /* Writes data on the PCKTCTRL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets a specific SYNC word for SPIRIT packets. - * @param xSyncX SYNC word number to be set. - * This parameter can be any value of @ref PktSyncX. - * @param cSyncWord SYNC word. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktCommonSetSyncxWord(PktSyncX xSyncX , uint8_t cSyncWord) -{ - uint8_t tempRegAddress; - - /* Check the parameters */ - s_assert_param(IS_PKT_SYNCx(xSyncX)); - - /* Set the specified address */ - switch(xSyncX) - { - case PKT_SYNC_WORD_1: - tempRegAddress=SYNC1_BASE; - break; - case PKT_SYNC_WORD_2: - tempRegAddress=SYNC2_BASE; - break; - case PKT_SYNC_WORD_3: - tempRegAddress=SYNC3_BASE; - break; - default: - tempRegAddress=SYNC4_BASE; - break; - } - - /* Writes value on the selected register */ - g_xStatus = SpiritSpiWriteRegisters(tempRegAddress, 1, &cSyncWord); - -} - - -/** - * @brief Returns a specific SYNC word for SPIRIT packets. - * @param xSyncX SYNC word number to be get. - * This parameter can be any value of @ref PktSyncX. - * @retval uint8_t Sync word x. - */ -uint8_t SpiritPktCommonGetSyncxWord(PktSyncX xSyncX) -{ - uint8_t tempRegAddress, tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_SYNCx(xSyncX)); - - /* Set the specified address */ - switch(xSyncX) - { - case PKT_SYNC_WORD_1: - tempRegAddress=SYNC1_BASE; - break; - case PKT_SYNC_WORD_2: - tempRegAddress=SYNC2_BASE; - break; - case PKT_SYNC_WORD_3: - tempRegAddress=SYNC3_BASE; - break; - default: - tempRegAddress=SYNC4_BASE; - break; - } - - /* Reads the selected register value */ - g_xStatus = SpiritSpiReadRegisters(tempRegAddress, 1, &tempRegValue); - - /* Returns the read value */ - return tempRegValue; - -} - - -/** - * @brief Sets multiple SYNC words for SPIRIT packets. - * @param lSyncWords SYNC words to be set with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - * This parameter is a uint32_t. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a @ref PktSyncLength. - * @retval None. - */ -void SpiritPktCommonSetSyncWords(uint32_t lSyncWords, PktSyncLength xSyncLength) -{ - uint8_t tempRegValue[4]; - - /* Split the 32-bit value in 4 8-bit values */ - for(uint8_t i=0 ; i<4 ; i++) - { - if(i< ((3-xSyncLength) >>1) ) - { - tempRegValue[i]=0; - } - else - { - tempRegValue[i]=(uint8_t)(lSyncWords>>(8*i)); - } - } - - /* Writes SYNC value on the SYNCx registers */ - g_xStatus = SpiritSpiWriteRegisters(SYNC4_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns multiple SYNC words for SPIRIT packets. - * @param xSyncLength SYNC length in bytes. The 32bit word passed will be stored in the SYNCx registers from the MSb - * until the number of bytes in xSyncLength has been stored. - * This parameter is a pointer to @ref PktSyncLength. - * @retval uint32_t Sync words. The format of the read 32 bit word is 0x|SYNC1|SYNC2|SYNC3|SYNC4|. - */ -uint32_t SpiritPktCommonGetSyncWords(PktSyncLength xSyncLength) -{ - uint8_t tempRegValue[4]; - uint32_t tempRetValue=0; - - /* Reads the SYNCx registers value */ - g_xStatus = SpiritSpiReadRegisters(SYNC4_BASE, 4, tempRegValue); - - /* Rebuild the SYNC words */ - for(uint8_t i=0 ; i<4 ; i++) - { - if(i>2-(xSyncLength >>1)) - { - tempRetValue |= tempRegValue[i]<<(8*i); - } - } - - /* Return SYNC words */ - return tempRetValue; - -} - - -/** - * @brief Returns the variable length width (in number of bits). - * @param None. - * @retval uint8_t Variable length width in bits. - */ -uint8_t SpiritPktCommonGetVarLengthWidth(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Rebuild and return value */ - return (tempRegValue & PCKTCTRL3_LEN_WID_MASK)+1; - -} - - -/** - * @brief Sets the destination address for the Tx packet. - * @param cAddress Destination address. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktCommonSetDestinationAddress(uint8_t cAddress) -{ - /* Writes value on PCKT_FLT_GOALS_SOURCE_ADDR register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_SOURCE_ADDR_BASE, 1, &cAddress); - -} - - -/** - * @brief Returns the settled destination address. - * @param None. - * @retval uint8_t Transmitted destination address. - */ -uint8_t SpiritPktCommonGetTransmittedDestAddress(void) -{ - uint8_t tempRegValue; - - /* Reads value on the PCKT_FLT_GOALS_SOURCE_ADDR register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_SOURCE_ADDR_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Sets the node my address. When the filtering on my address is on, if the destination address extracted from the received packet is equal to the content of the - * my address, then the packet is accepted (this is the address of the node). - * @param cAddress Address of the present node. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktCommonSetMyAddress(uint8_t cAddress) -{ - /* Writes value on the PCKT_FLT_GOALS_TX_ADDR register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_TX_ADDR_BASE, 1, &cAddress); - -} - - -/** - * @brief Returns the address of the present node. - * @param None. - * @retval uint8_t My address (address of this node). - */ -uint8_t SpiritPktCommonGetMyAddress(void) -{ - uint8_t tempRegValue; - - /* Reads value on the PCKT_FLT_GOALS_TX_ADDR register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_TX_ADDR_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Sets the broadcast address. If the destination address extracted from the received packet is equal to the content of the - * BROADCAST_ADDR register, then the packet is accepted. - * @param cAddress Broadcast address. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktCommonSetBroadcastAddress(uint8_t cAddress) -{ - /* Writes value on the PCKT_FLT_GOALS_BROADCAST register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 1, &cAddress); - -} - - -/** - * @brief Returns the broadcast address. - * @param None. - * @retval uint8_t Broadcast address. - */ -uint8_t SpiritPktCommonGetBroadcastAddress(void) -{ - uint8_t tempRegValue; - - /* Reads value on the PCKT_FLT_GOALS_BROADCAST register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Sets the multicast address. When the multicast filtering is on, if the destination address extracted from the received packet is equal to the content of the - * MULTICAST_ADDR register, then the packet is accepted. - * @param cAddress Multicast address. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktCommonSetMulticastAddress(uint8_t cAddress) -{ - /* Writes value on the PCKT_FLT_GOALS_MULTICAST register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_MULTICAST_BASE, 1, &cAddress); - -} - - -/** - * @brief Returns the multicast address. - * @param None. - * @retval uint8_t Multicast address. - */ -uint8_t SpiritPktCommonGetMulticastAddress(void) -{ - uint8_t tempRegValue; - - /* Reads value on the PCKT_FLT_GOALS_MULTICAST register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_MULTICAST_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Sets the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param lMask Control mask. - * This parameter is an uint32_t. - * @retval None. - */ -void SpiritPktCommonSetCtrlMask(uint32_t lMask) -{ - uint8_t tempRegValue[4]; - - /* Split the 32-bit value in 4 8-bit values */ - tempRegValue[0] = (uint8_t) lMask; - tempRegValue[1] = (uint8_t)(lMask >> 8); - tempRegValue[2] = (uint8_t)(lMask >> 16); - tempRegValue[3] = (uint8_t)(lMask >> 24); - - /* Writes values on the CKT_FLT_GOALS_CONTROLx_MASK registers */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_CONTROL0_MASK_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns the control mask. The 1 bits of the CONTROL_MASK indicate the - * bits to be used in filtering. (All 0s no filtering) - * @param None. - * @retval uint32_t Control mask. - */ -uint32_t SpiritPktCommonGetCtrlMask(void) -{ - uint8_t tempRegValue[4]; - uint32_t tempRetValue=0; - - /* Reads the PCKT_FLT_GOALS_CONTROLx_MASK registers */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_CONTROL0_MASK_BASE, 4, tempRegValue); - - /* Rebuild the control mask value on a 32-bit integer variable */ - for(uint8_t i=0 ; i<4 ; i++) - { - tempRetValue |= ((uint32_t)tempRegValue[i])<<(8*i); - } - - /* Return value */ - return tempRetValue; -} - -/** - * @brief Sets the control field reference. If the bits enabled by the CONTROL_MASK - * match the ones of the control fields extracted from the received packet - * then the packet is accepted. - * @param lReference Control reference. - * This parameter is an uint32_t. - * @retval None. - */ -void SpiritPktCommonSetCtrlReference(uint32_t lReference) -{ - uint8_t tempRegValue[4]; - - /* Split the 32-bit value in 4 8-bit values */ - tempRegValue[0] = (uint8_t) lReference; - tempRegValue[1] = (uint8_t)(lReference >> 8); - tempRegValue[2] = (uint8_t)(lReference >> 16); - tempRegValue[3] = (uint8_t)(lReference >> 24); - - /* Writes values on the CKT_FLT_GOALS_CONTROLx_FIELD registers */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_CONTROL0_FIELD_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns the control field reference. - * @param None. - * @retval uint32_t Control reference. - */ -uint32_t SpiritPktCommonGetCtrlReference(void) -{ - uint8_t tempRegValue[4]; - uint32_t tempRetValue=0; - - /* Reads the PCKT_FLT_GOALS_CONTROLx_FIELD registers */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_CONTROL0_FIELD_BASE, 4, tempRegValue); - - /* Rebuild the control mask value on a 32-bit integer variable */ - for(uint8_t i=0 ; i<4 ; i++) - { - tempRetValue |= ((uint32_t)tempRegValue[i])<<(8*i); - } - - /* Return value */ - return tempRetValue; -} - - -/** - * @brief Sets the TX control field. - * @param lField Tx contro field. - * This parameter is an uint32_t. - * @retval None. - */ -void SpiritPktCommonSetTransmittedCtrlField(uint32_t lField) -{ - uint8_t tempRegValue[4]; - - /* Split the 32-bit value in 4 8-bit values */ - tempRegValue[3] = (uint8_t) lField; - tempRegValue[2] = (uint8_t)(lField >> 8); - tempRegValue[1] = (uint8_t)(lField >> 16); - tempRegValue[0] = (uint8_t)(lField >> 24); - - /* Writes value on the TX_CTRL_FIELDx register */ - g_xStatus = SpiritSpiWriteRegisters(TX_CTRL_FIELD3_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns the Tx control field. - * @param None. - * @retval uint32_t Control field of the transmitted packet. - */ -uint32_t SpiritPktCommonGetTransmittedCtrlField(void) -{ - uint8_t tempRegValue[4]; - uint32_t tempRetValue=0; - - /* Reads the TX_CTRL_FIELDx registers */ - g_xStatus = SpiritSpiReadRegisters(TX_CTRL_FIELD3_BASE, 4, tempRegValue); - - /* Rebuild value: build a 32-bit value from the read bytes */ - for(uint8_t i=0 ; i<4 ; i++) - { - tempRetValue |= ((uint32_t)tempRegValue[i])<<(8*(3-i)); - } - - /* Return value */ - return tempRetValue; - -} - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with My address. - * @param xNewState new state for DEST_VS_SOURCE_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonFilterOnMyAddress(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - - /* Modify the register value: set or reset the TX source address control */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Set or reset the DESTINATION vs TX enabling bit */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with multicast address. - * @param xNewState new state for DEST_VS_MULTICAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonFilterOnMulticastAddress(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PCKT_FLT_OPTIONS register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Enable or disable the filtering option */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - - -/** - * @brief If enabled RX packet is accepted if its destination address matches with broadcast address. - * @param xNewState new state for DEST_VS_BROADCAST_ADDRESS. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonFilterOnBroadcastAddress(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Enable or disable the filtering option */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the enable bit of the my address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -SpiritFunctionalState SpiritPktCommonGetFilterOnMyAddress(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Gets the enable/disable bit in form of SpiritFunctionalState type */ - if(tempRegValue & 0x08) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - -/** - * @brief Returns the enable bit of the multicast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -SpiritFunctionalState SpiritPktCommonGetFilterOnMulticastAddress(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Get the enable/disable bit in form of SpiritFunctionalState type */ - if(tempRegValue & 0x04) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - -/** - * @brief Returns the enable bit of the broadcast address filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -SpiritFunctionalState SpiritPktCommonGetFilterOnBroadcastAddress(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Get the enable/disable bit in form of SpiritFunctionalState type */ - if(tempRegValue & 0x02) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - - -/** - * @brief Returns the destination address of the received packet. - * @param None. - * @retval uint8_t Destination address of the received address. - */ -uint8_t SpiritPktCommonGetReceivedDestAddress(void) -{ - uint8_t tempRegValue; - - /* Reads the RX_ADDR_FIELD0 register value */ - g_xStatus = SpiritSpiReadRegisters(RX_ADDR_FIELD0_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Returns the control field of the received packet. - * @param None. - * @retval uint32_t Received control field. - */ -uint32_t SpiritPktCommonGetReceivedCtrlField(void) -{ - uint8_t tempRegValue[4]; - uint32_t tempRetValue=0; - - /* Reads the PCKT_FLT_GOALS_CONTROLx_MASK registers */ - g_xStatus = SpiritSpiReadRegisters(RX_CTRL_FIELD0_BASE, 4, tempRegValue); - - /* Rebuild the control mask value on a 32-bit integer variable */ - for(uint8_t i=0 ; i<4 ; i++) - { - tempRetValue |= ((uint32_t)tempRegValue[i])<<(8*i); - } - - /* Returns value */ - return tempRetValue; -} - - -/** - * @brief Returns the CRC field of the received packet. - * @param cCrcFieldVect array in which the CRC field has to be stored. - * This parameter is an uint8_t array of 3 elements. - * @retval None. - */ -void SpiritPktCommonGetReceivedCrcField(uint8_t* cCrcFieldVect) -{ - uint8_t tempRegValue[3],crcLength; - PktCrcMode crcMode; - - /* Gets the CRC mode in PktCrcMode enum */ - crcMode=SpiritPktCommonGetCrcMode(); - - /* Cast to uint8_t */ - crcLength = (uint8_t)crcMode; - - /* Obtains the real length: see the @ref PktCrcMode enumeration */ - crcLength >>= 5; - if(crcLength>=3) crcLength--; - - /* Reads the CRC_FIELDx registers value */ - g_xStatus = SpiritSpiReadRegisters(CRC_FIELD2_BASE, 3,tempRegValue); - - /* Sets the array to be returned */ - for(uint8_t i=0 ; i<3 ; i++) - { - if(i<crcLength) - { - cCrcFieldVect[i]=tempRegValue[2-i]; - } - else - { - cCrcFieldVect[i]=0; - } - } - -} - - -/** - * @brief Sets the AUTO ACKNOLEDGEMENT mechanism on the receiver. When the feature is enabled and - * a data packet has been correctly received, then an acknowledgement packet is sent back to the originator of the received - * packet. If the PIGGYBACKING bit is also set, payload data will be read from the FIFO; otherwise an empty packet is sent - * only containing the source and destination addresses and the sequence number of the packet being acknowledged. - * @param xAutoAck new state for autoack. - * This parameter can be: S_ENABLE or S_DISABLE. - * @param xPiggybacking new state for autoack. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonAutoAck(SpiritFunctionalState xAutoAck , SpiritFunctionalState xPiggybacking) -{ - uint8_t tempRegValue[2]; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xAutoAck)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xPiggybacking)); - /* Check if piggybacking is enabled and autoack is disabled */ - s_assert_param(!(xPiggybacking==S_ENABLE && xAutoAck==S_DISABLE)); - - /* Reads the PROTOCOL[1:0] registers value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 2, tempRegValue); - - /* Sets the specified LLP option */ - /* Autoack setting */ - if(xAutoAck == S_ENABLE) - { - tempRegValue[1] |= PROTOCOL0_AUTO_ACK_MASK; - } - else - { - tempRegValue[1] &= (~PROTOCOL0_AUTO_ACK_MASK); - } - - /* Piggybacking setting */ - if(xPiggybacking == S_ENABLE) - { - tempRegValue[0] |= PROTOCOL1_PIGGYBACKING_MASK; - } - else - { - tempRegValue[0] &= (~PROTOCOL1_PIGGYBACKING_MASK); - } - - /* Writes data on the PROTOCOL[1:0] registers */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the AUTO ACKNOLEDGEMENT mechanism on the transmitter. On the transmitter side, the NACK_TX field can be used to require or not an acknowledgment for each individual packet: if - * NACK_TX is set to "1" then acknowledgment will not be required; if NACK_TX is set to "0" then acknowledgment will be - * required. - * @param xNewState new state for TX_AUTOACK. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonRequireAck(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads value on the PROTOCOL0 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - - /* Enables or disables the ack requirement option */ - if(xNewState == S_DISABLE) - { - tempRegValue |= PROTOCOL0_NACK_TX_MASK; - } - else - { - tempRegValue &= ~PROTOCOL0_NACK_TX_MASK; - } - - /* Writes value on the PROTOCOL0 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the TX sequence number to be used to start counting. - * @param cSeqNumberReload new value for Tx seq number reload. - * @retval None. - */ -void SpiritPktCommonSetTransmittedSeqNumberReload(uint8_t cSeqNumberReload){ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_SEQ_NUMBER_RELOAD(cSeqNumberReload)); - - /* Reads value on the PROTOCOL2 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - tempRegValue &= 0xE7; - tempRegValue |= (cSeqNumberReload << 3); - - /* Writes value on the PROTOCOL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the TX sequence number to be used to start counting. - * @param cSeqNumberReload new value for Tx seq number reload. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritPktCommonSetNMaxReTx(PktNMaxReTx xNMaxReTx) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PKT_NMAX_RETX(xNMaxReTx)); - - /* Reads the PROTOCOL0 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - - /* Build the value to be written */ - tempRegValue &= ~PROTOCOL0_NMAX_RETX_MASK; - tempRegValue |= xNMaxReTx; - - /* Writes value on the PROTOCOL0 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the max number of automatic retransmission. - * @param None. - * @retval uint8_t Max number of retransmissions. - * This parameter is an uint8_t. - */ -uint8_t SpiritPktCommonGetNMaxReTx(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL0 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - - /* Build the value to be written */ - return ((tempRegValue & PROTOCOL0_NMAX_RETX_MASK)>>4); - -} - -/** - * @brief Returns the TX ACK request - * @param None. - * @retval uint8_t Max number of retransmissions. - * This parameter is an uint8_t. - */ -SpiritFunctionalState SpiritPktCommonGetTxAckRequest(void) -{ - uint8_t tempRegValue; - - /* Reads the PROTOCOL0 register value */ - g_xStatus = SpiritSpiReadRegisters(RX_PCKT_INFO_BASE, 1, &tempRegValue); - - /* Build the value to be written */ - return (SpiritFunctionalState)((tempRegValue & TX_PCKT_INFO_NACK_RX)>>2); - -} - - -/** - * @brief Returns the source address of the received packet. - * @param None. - * @retval uint8_t Source address of the received packet. - */ -uint8_t SpiritPktCommonGetReceivedSourceAddress(void) -{ - uint8_t tempRegValue; - - /* Reads the RX_ADDR_FIELD1 register value */ - g_xStatus = SpiritSpiReadRegisters(RX_ADDR_FIELD1_BASE, 1, &tempRegValue); - - /* Returns value */ - return tempRegValue; - -} - - -/** - * @brief Returns the sequence number of the received packet. - * @param None. - * @retval uint8_t Received Sequence number. - */ -uint8_t SpiritPktCommonGetReceivedSeqNumber(void) -{ - uint8_t tempRegValue; - - /* Reads the RX_PCKT_INFO register value */ - g_xStatus = SpiritSpiReadRegisters(RX_PCKT_INFO_BASE, 1, &tempRegValue); - - /* Obtains and returns the sequence number */ - return tempRegValue & 0x03; - -} - - -/** - * @brief Returns the Nack bit of the received packet - * @param None. - * @retval uint8_t Value of the Nack bit. - */ -uint8_t SpiritPktCommonGetReceivedNackRx(void) -{ - uint8_t tempRegValue; - - /* Reads the RX_PCKT_INFO register value */ - g_xStatus = SpiritSpiReadRegisters(RX_PCKT_INFO_BASE, 1, &tempRegValue); - - /* Obtains and returns the RX nack bit */ - return (tempRegValue >> 2) & 0x01; - -} - - -/** - * @brief Returns the sequence number of the transmitted packet. - * @param None. - * @retval uint8_t Sequence number of the transmitted packet. - */ -uint8_t SpiritPktCommonGetTransmittedSeqNumber(void) -{ - uint8_t tempRegValue; - - /* Reads the TX_PCKT_INFO register value */ - g_xStatus = SpiritSpiReadRegisters(TX_PCKT_INFO_BASE, 1, &tempRegValue); - - /* Obtains and returns the TX sequence number */ - return (tempRegValue >> 4) & 0x07; - -} - - -/** - * @brief Returns the number of retransmission done on the transmitted packet. - * @param None. - * @retval uint8_t Number of retransmissions done until now. - */ -uint8_t SpiritPktCommonGetNReTx(void) -{ - uint8_t tempRetValue; - - /* Reads the TX_PCKT_INFO register value */ - g_xStatus = SpiritSpiReadRegisters(TX_PCKT_INFO_BASE, 1, &tempRetValue); - - /* Obtains and returns the number of retransmission done */ - return (tempRetValue & 0x0F); - -} - - -/** - * @brief If enabled RX packet is accepted only if the masked control field matches the - * masked control field reference (CONTROL_MASK & CONTROL_FIELD_REF == CONTROL_MASK & RX_CONTROL_FIELD). - * @param xNewState new state for Control filtering enable bit. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - * @note This filtering control is enabled by default but the control mask is by default set to 0. - * As a matter of fact the user has to enable the control filtering bit after the packet initialization - * because the PktInit routine disables it. - */ -void SpiritPktCommonFilterOnControlField(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - - /* Modify the register value: set or reset the control bit filtering */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Set or reset the CONTROL filtering enabling bit */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the enable bit of the control field filtering. - * @param None. - * @retval SpiritFunctionalState This parameter can be S_ENABLE or S_DISABLE. - */ -SpiritFunctionalState SpiritPktCommonGetFilterOnControlField(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Gets the enable/disable bit in form of SpiritFunctionalState type */ - if(tempRegValue & PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktMbus.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktMbus.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,354 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktMbus.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT MBUS packets. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_PktMbus.h" -#include "SPIRIT_Radio.h" -#include "MCU_Interface.h" - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_PktMbus - * @{ - */ - - -/** - * @defgroup PktMbus_Private_TypesDefinitions Pkt MBUS Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Private_Defines Pkt MBUS Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Private_Macros Pkt MBUS Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Private_Variables Pkt MBUS Private Variables - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Private_FunctionPrototypes Pkt MBUS Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktMbus_Private_Functions Pkt MBUS Private Functions - * @{ - */ - - -/** - * @brief Initializes the SPIRIT MBUS packet according to the specified parameters in the PktMbusInit struct. - * @param pxPktMbusInit pointer to a PktMbusInit structure that contains the configuration information for the specified SPIRIT MBUS PACKET FORMAT. - * This parameter is a pointer to @ref PktMbusInit. - * @retval None. - */ -void SpiritPktMbusInit(PktMbusInit* pxPktMbusInit) -{ - uint8_t tempRegValue[3]; - - /* Check the parameters */ - s_assert_param(IS_MBUS_SUBMODE(pxPktMbusInit->xMbusSubmode)); - - /* Packet format config */ - SpiritPktMbusSetFormat(); - SpiritPktCommonFilterOnCrc(S_DISABLE); - SpiritRadioCsBlanking(S_ENABLE); - - /* Preamble, postamble and submode config */ - tempRegValue[0] = pxPktMbusInit->cPreambleLength; - tempRegValue[1] = pxPktMbusInit->cPostambleLength; - tempRegValue[2] = (uint8_t) pxPktMbusInit->xMbusSubmode; - - /* Writes the new values on the MBUS_PRMBL registers */ - g_xStatus = SpiritSpiWriteRegisters(MBUS_PRMBL_BASE, 3, tempRegValue); - -} - -/** - * @brief Returns the SPIRIT MBUS packet structure according to the specified parameters in the registers. - * @param pxPktMbusInit MBUS packet init structure. - * This parameter is a pointer to @ref PktMbusInit. - * @retval None. - */ -void SpiritPktMbusGetInfo(PktMbusInit* pxPktMbusInit) -{ - uint8_t tempRegValue[3]; - - /* Reads the MBUS regs value */ - g_xStatus = SpiritSpiReadRegisters(MBUS_PRMBL_BASE, 3, tempRegValue); - - /* Fit the structure */ - pxPktMbusInit->cPreambleLength = tempRegValue[0]; - pxPktMbusInit->cPostambleLength = tempRegValue[1]; - pxPktMbusInit->xMbusSubmode = (MbusSubmode) (tempRegValue[2]&0x0E); - -} - - -/** - * @brief Configures the MBUS packet format as the one used by SPIRIT. - * @param None. - * @retval None. - */ -void SpiritPktMbusSetFormat(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Sets format bits. Also set to 0 the direct RX mode bits */ - tempRegValue &= 0x0F; - tempRegValue |= ((uint8_t)PCKTCTRL3_PCKT_FRMT_MBUS); - - /* Writes value on the PCKTCTRL3 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Reads the PCKTCTRL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build the new value. Set to 0 the direct TX mode bits */ - tempRegValue &= 0xF3; - - /* Writes the value on the PCKTCTRL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Mask a reserved bit */ - tempRegValue &= ~0x20; - - /* Writes the value on the PROTOCOL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets how many chip sequence 01 shall be added in the preamble - * respect to the minimum value as defined according to the specified sub-mode. - * @param cPreamble the number of chip sequence. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktMbusSetPreamble(uint8_t cPreamble) -{ - /* Modifies the MBUS_PRMBL register value */ - g_xStatus = SpiritSpiWriteRegisters(MBUS_PRMBL_BASE, 1, &cPreamble); - -} - - -/** - * @brief Returns how many chip sequence "01" are added in the preamble - * respect to the minimum value as defined according to the specified sub-mode. - * @param None. - * @retval uint8_t Preable in number of "01" chip sequences. - */ -uint8_t SpiritPktMbusGetPreamble(void) -{ - uint8_t tempRegValue; - - /* Modifies the MBUS_PRMBL register value */ - g_xStatus = SpiritSpiReadRegisters(MBUS_PRMBL_BASE, 1, &tempRegValue); - - /* Return value */ - return tempRegValue; - -} - - -/** - * @brief Sets how many chip sequence 01 will be used in postamble - * @param cPostamble the number of chip sequence. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktMbusSetPostamble(uint8_t cPostamble) -{ - /* Modifies the MBUS_PSTMBL register value */ - g_xStatus = SpiritSpiWriteRegisters(MBUS_PSTMBL_BASE, 1, &cPostamble); - -} - - -/** - * @brief Returns how many chip sequence "01" are used in the postamble - * @param None. - * @retval uint8_t Postamble in number of "01" chip sequences. - */ -uint8_t SpiritPktMbusGetPostamble(void) -{ - uint8_t tempRegValue; - - /* Reads the MBUS_PSTMBL register */ - g_xStatus = SpiritSpiReadRegisters(MBUS_PSTMBL_BASE, 1, &tempRegValue); - - /* Returns value */ - return tempRegValue; - -} - - -/** - * @brief Sets the MBUS submode used. - * @param xMbusSubmode the submode used. - * This parameter can be any value of @ref MbusSubmode. - * @retval None. - */ -void SpiritPktMbusSetSubmode(MbusSubmode xMbusSubmode) -{ - /* Modifies the MBUS_CTRL register value */ - g_xStatus = SpiritSpiWriteRegisters(MBUS_CTRL_BASE, 1, (uint8_t*)xMbusSubmode); - -} - - -/** - * @brief Returns the MBUS submode used. - * @param None. - * @retval MbusSubmode MBUS submode. - */ -MbusSubmode SpiritPktMbusGetSubmode(void) -{ - uint8_t tempRegValue; - - /* Reads the MBUS_CTRL register value */ - g_xStatus = SpiritSpiReadRegisters(MBUS_CTRL_BASE, 1, &tempRegValue); - - /* Returns value */ - return (MbusSubmode) tempRegValue; - -} - - -/** - * @brief Sets the payload length for SPIRIT MBUS packets. - * @param nPayloadLength payload length in bytes. - * This parameter is an uint16_t. - * @retval None. - */ -void SpiritPktMbusSetPayloadLength(uint16_t nPayloadLength) -{ - uint8_t tempRegValue[2]; - - /* Computes PCKTLEN0 value from nPayloadLength */ - tempRegValue[1]=BUILD_PCKTLEN0(nPayloadLength);//(uint8_t)nPayloadLength; - /* Computes PCKTLEN1 value from nPayloadLength */ - tempRegValue[0]=BUILD_PCKTLEN1(nPayloadLength);//(uint8_t)(nPayloadLength>>8); - - /* Writes data on the PCKTLEN1/0 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTLEN1_BASE, 2, tempRegValue); - -} - - -/** - * @brief Returns the payload length for SPIRIT MBUS packets. - * @param None. - * @retval uint16_t Payload length in bytes. - */ -uint16_t SpiritPktMbusGetPayloadLength(void) -{ - uint8_t tempRegValue[2]; - - /* Reads the packet length registers */ - g_xStatus = SpiritSpiReadRegisters(PCKTLEN1_BASE, 2, tempRegValue); - - /* Returns the packet length */ - return ((((uint16_t)tempRegValue[0])<<8) + (uint16_t) tempRegValue[1]); - -} - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktStack.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_PktStack.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,687 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_PktStack.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT STack packets. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_PktStack.h" -#include "MCU_Interface.h" - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_PktStack - * @{ - */ - - -/** - * @defgroup PktStack_Private_TypesDefinitions Pkt STack Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktStack_Private_Defines Pkt STack Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktStack_Private_Macros Pkt STack Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktStack_Private_Variables Pkt STack Private Variables - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktStack_Private_FunctionPrototypes Pkt STack Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup PktStack_Private_Functions Pkt STack Private Functions - * @{ - */ - - -/** - * @brief Initializes the SPIRIT STack packet according to the specified - * parameters in the PktStackInit. - * @param pxPktStackInit STack packet init structure. - * This parameter is a pointer to @ref PktStackInit. - * @retval None. - */ -void SpiritPktStackInit(PktStackInit* pxPktStackInit) -{ - uint8_t tempRegValue[4], i; - - /* Check the parameters */ - s_assert_param(IS_STACK_PREAMBLE_LENGTH(pxPktStackInit->xPreambleLength)); - s_assert_param(IS_STACK_SYNC_LENGTH(pxPktStackInit->xSyncLength)); - s_assert_param(IS_STACK_CRC_MODE(pxPktStackInit->xCrcMode)); - s_assert_param(IS_STACK_LENGTH_WIDTH_BITS(pxPktStackInit->cPktLengthWidth)); - s_assert_param(IS_STACK_FIX_VAR_LENGTH(pxPktStackInit->xFixVarLength)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackInit->xFec)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackInit->xDataWhitening)); - s_assert_param(IS_STACK_CONTROL_LENGTH(pxPktStackInit->xControlLength)); - - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]); - - /* Mask a reserved bit */ - tempRegValue[0] &= ~0x20; - - /* Always (!) set the automatic packet filtering */ - tempRegValue[0] |= PROTOCOL1_AUTO_PCKT_FLT_MASK; - - /* Writes the value on register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue[0]); - - /* Reads the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Always reset the control and source filtering */ - tempRegValue[0] &= ~(PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK | PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK); - - /* Writes the value on register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - - /* Address and control length setting: source and destination address are always present so ADDRESS_LENGTH=2 */ - tempRegValue[0] = 0x10 | ((uint8_t) pxPktStackInit->xControlLength); - - - /* Packet format and width length setting */ - pxPktStackInit->cPktLengthWidth == 0 ? pxPktStackInit->cPktLengthWidth=1 : pxPktStackInit->cPktLengthWidth; - tempRegValue[1] = ((uint8_t) PCKTCTRL3_PCKT_FRMT_STACK) | ((uint8_t)(pxPktStackInit->cPktLengthWidth-1)); - - /* Preamble, sync and fixed or variable length setting */ - tempRegValue[2] = ((uint8_t) pxPktStackInit->xPreambleLength) | ((uint8_t) pxPktStackInit->xSyncLength) | - ((uint8_t) pxPktStackInit->xFixVarLength); - - /* CRC length, whitening and FEC setting */ - tempRegValue[3] = (uint8_t) pxPktStackInit->xCrcMode; - - if(pxPktStackInit->xDataWhitening == S_ENABLE) - { - tempRegValue[3] |= PCKTCTRL1_WHIT_MASK; - } - - if(pxPktStackInit->xFec == S_ENABLE) - { - tempRegValue[3] |= PCKTCTRL1_FEC_MASK; - } - - /* Writes registers */ - SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 4, tempRegValue); - - /* Sync words setting */ - for(i=0;i<4;i++) - { - if(i<3-(pxPktStackInit->xSyncLength >>1)) - { - tempRegValue[i]=0; - } - else - { - tempRegValue[i] = (uint8_t)(pxPktStackInit->lSyncWords>>(8*i)); - } - } - - /* Enables or disables the CRC check */ - if(pxPktStackInit->xCrcMode == PKT_NO_CRC) - { - SpiritPktStackFilterOnCrc(S_DISABLE); - } - else - { - SpiritPktStackFilterOnCrc(S_ENABLE); - } - - /* Writes registers */ - g_xStatus = SpiritSpiWriteRegisters(SYNC4_BASE, 4, tempRegValue); - -} - - -/** - * @brief Returns the SPIRIT STack packet structure according to the specified parameters in the registers. - * @param pxPktStackInit STack packet init structure. - * This parameter is a pointer to @ref PktStackInit. - * @retval None. - */ -void SpiritPktStackGetInfo(PktStackInit* pxPktStackInit) -{ - uint8_t tempRegValue[10]; - - /* Reads registers */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 10, tempRegValue); - - /* Length width */ - pxPktStackInit->cPktLengthWidth=(tempRegValue[1] & 0x0F)+1; - - /* Control length */ - pxPktStackInit->xControlLength=(StackControlLength)(tempRegValue[0] & 0x07); - - /* CRC mode */ - pxPktStackInit->xCrcMode=(StackCrcMode)(tempRegValue[3] & 0xE0); - - /* Whitening */ - pxPktStackInit->xDataWhitening=(SpiritFunctionalState)((tempRegValue[3] >> 4) & 0x01); - - /* FEC */ - pxPktStackInit->xFec=(SpiritFunctionalState)(tempRegValue[3] & 0x01); - - /* FIX or VAR bit */ - pxPktStackInit->xFixVarLength=(StackFixVarLength)(tempRegValue[2] & 0x01); - - /* Preamble length */ - pxPktStackInit->xPreambleLength=(StackPreambleLength)(tempRegValue[2] & 0xF8); - - /* Sync length */ - pxPktStackInit->xSyncLength=(StackSyncLength)(tempRegValue[2] & 0x06); - - /* sync Words */ - pxPktStackInit->lSyncWords=0; - for(uint8_t i=0 ; i<4 ; i++) - { - if(i>2-(pxPktStackInit->xSyncLength >>1)) - { - pxPktStackInit->lSyncWords |= tempRegValue[i+6]<<(8*i); - } - } - -} - - -/** - * @brief Initializes the SPIRIT STack packet addresses according to the specified - * parameters in the PktStackAddresses struct. - * @param pxPktStackAddresses STack packet addresses init structure. - * This parameter is a pointer to @ref PktStackAddressesInit . - * @retval None. - */ -void SpiritPktStackAddressesInit(PktStackAddressesInit* pxPktStackAddresses) -{ - uint8_t tempRegValue[3]; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnMyAddress)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnMulticastAddress)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackAddresses->xFilterOnBroadcastAddress)); - - /* Reads the filtering options ragister */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Enables or disables filtering on my address */ - if(pxPktStackAddresses->xFilterOnMyAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; - } - - /* Enables or disables filtering on multicast address */ - if(pxPktStackAddresses->xFilterOnMulticastAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; - } - - /* Enables or disables filtering on broadcast address */ - if(pxPktStackAddresses->xFilterOnBroadcastAddress == S_ENABLE) - { - tempRegValue[0] |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - else - { - tempRegValue[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; - } - - /* Writes value on the register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Fills array with the addresses passed in the structure */ - tempRegValue[0] = pxPktStackAddresses->cBroadcastAddress; - tempRegValue[1] = pxPktStackAddresses->cMulticastAddress; - tempRegValue[2] = pxPktStackAddresses->cMyAddress; - - /* Writes them on the addresses registers */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue); - -} - - -/** -* @brief Returns the SPIRIT STack packet addresses structure according to the specified -* parameters in the registers. -* @param pxPktStackAddresses STack packet addresses init structure. -* This parameter is a pointer to @ref PktStackAddresses. -* @retval None. -*/ -void SpiritPktStackGetAddressesInfo(PktStackAddressesInit* pxPktStackAddresses) -{ - uint8_t tempRegValue[3]; - - /* Reads values on the PCKT_FLT_GOALS registers */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_BROADCAST_BASE, 3, tempRegValue); - - /* Fit the structure with the read addresses */ - pxPktStackAddresses->cBroadcastAddress = tempRegValue[0]; - pxPktStackAddresses->cMulticastAddress = tempRegValue[1]; - pxPktStackAddresses->cMyAddress = tempRegValue[2]; - - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue[0]); - - /* Fit the structure with the read filtering bits */ - pxPktStackAddresses->xFilterOnBroadcastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 1) & 0x01); - pxPktStackAddresses->xFilterOnMulticastAddress = (SpiritFunctionalState)((tempRegValue[0] >> 2) & 0x01); - pxPktStackAddresses->xFilterOnMyAddress = (SpiritFunctionalState)((tempRegValue[0] >> 3) & 0x01); - -} - - -/** -* @brief Initializes the SPIRIT STack packet LLP options according to the specified -* parameters in the PktStackLlpInit struct. -* @param pxPktStackLlpInit STack packet LLP init structure. -* This parameter is a pointer to @ref PktStackLlpInit. -* @retval None. -*/ -void SpiritPktStackLlpInit(PktStackLlpInit* pxPktStackLlpInit) -{ - uint8_t tempRegValue[2]; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackLlpInit->xPiggybacking)); - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(pxPktStackLlpInit->xAutoAck)); - s_assert_param(IS_STACK_NMAX_RETX(pxPktStackLlpInit->xNMaxRetx)); - /* check if piggybacking is enabled and autoack is disabled */ - s_assert_param(!(pxPktStackLlpInit->xPiggybacking==S_ENABLE && pxPktStackLlpInit->xAutoAck==S_DISABLE)); - - /* Piggybacking mechanism setting on the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 2, tempRegValue); - if(pxPktStackLlpInit->xPiggybacking == S_ENABLE) - { - tempRegValue[0] |= PROTOCOL1_PIGGYBACKING_MASK; - } - else - { - tempRegValue[0] &= ~PROTOCOL1_PIGGYBACKING_MASK; - } - - /* RX and TX autoack mechanisms setting on the PROTOCOL0 register */ - if(pxPktStackLlpInit->xAutoAck == S_ENABLE) - { - tempRegValue[1] |= PROTOCOL0_AUTO_ACK_MASK; - } - else - { - tempRegValue[1] &= ~PROTOCOL0_AUTO_ACK_MASK; - } - - /* Max number of retransmission setting */ - tempRegValue[1] &= ~PROTOCOL0_NMAX_RETX_MASK; - tempRegValue[1] |= pxPktStackLlpInit->xNMaxRetx; - - /* Writes registers */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 2, tempRegValue); - -} - - -/** - * @brief Returns the SPIRIT STack packet LLP options according to the specified - * values in the registers. - * @param pxPktStackLlpInit STack packet LLP structure. - * This parameter is a pointer to @ref PktStackLlpInit. - * @retval None. - */ -void SpiritPktStackLlpGetInfo(PktStackLlpInit* pxPktStackLlpInit) -{ - uint8_t tempRegValue[2]; - - /* Piggybacking mechanism setting on the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 2, tempRegValue); - - /* Fit the structure with the read values */ - pxPktStackLlpInit->xPiggybacking = (SpiritFunctionalState)((tempRegValue[0] >> 6) & 0x01); - pxPktStackLlpInit->xAutoAck = (SpiritFunctionalState)((tempRegValue[1] >> 2) & 0x01); - pxPktStackLlpInit->xNMaxRetx = (StackNMaxReTx)(tempRegValue[1] & PROTOCOL0_NMAX_RETX_MASK); - -} - - -/** - * @brief Configures the STack packet format for SPIRIT. - * @param None. - * @retval None. - */ -void SpiritPktStackSetFormat(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Build value to be written. Also set to 0 the direct RX mode bits */ - tempRegValue &= 0x0F; - tempRegValue |= ((uint8_t)PCKTCTRL3_PCKT_FRMT_STACK); - - /* Writes the value on the PCKTCTRL3 register. */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Reads the PCKTCTRL1 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Build the new value. Set to 0 the direct TX mode bits */ - tempRegValue &= 0xF3; - - /* Writes the PCKTCTRL1 value on register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL1_BASE, 1, &tempRegValue); - - /* Reads the PROTOCOL1 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Mask a reserved bit */ - tempRegValue &= ~0x20; - - /* Writes the value on the PROTOCOL1 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the address length for SPIRIT STack packets (always 2). - * @param None. - * @retval None. - */ -void SpiritPktStackSetAddressLength(void) -{ - uint8_t tempRegValue; - - /* Reads the PCKTCTRL4 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - - /* Build the new value */ - tempRegValue &= ~PCKTCTRL4_ADDRESS_LEN_MASK; - tempRegValue |= ((uint8_t)0x10); - - /* Writes the value on the PCKTCTRL4 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL4_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the payload length for SPIRIT STack packets. Since the packet length - * depends from the address (always 2 for this packet format) - * and the control field size, this function reads the control length register - * content in order to determine the correct packet length to be written. - * @param nPayloadLength payload length in bytes. - * This parameter can be any value of uint16_t. - * @retval None. - */ -void SpiritPktStackSetPayloadLength(uint16_t nPayloadLength) -{ - uint8_t tempRegValue[2]; - - /* Computes the oversize (address + control) size */ - uint16_t overSize = 2 + (uint16_t) SpiritPktStackGetControlLength(); - - /* Computes PCKTLEN0 value from lPayloadLength */ - tempRegValue[1]=STACK_BUILD_PCKTLEN0(nPayloadLength+overSize); - /* Computes PCKTLEN1 value from lPayloadLength */ - tempRegValue[0]=STACK_BUILD_PCKTLEN1(nPayloadLength+overSize); - - /* Writes the value on the PCKTLENx registers */ - g_xStatus = SpiritSpiWriteRegisters(PCKTLEN1_BASE, 2, tempRegValue); - -} - - -/** - * @brief Returns the payload length for SPIRIT STack packets. Since the - * packet length depends from the address and the control - * field size, this function reads the correspondent - * registers in order to determine the correct payload length - * to be returned. - * @param None. - * @retval uint16_t Payload length. - */ -uint16_t SpiritPktStackGetPayloadLength(void) -{ - uint8_t tempRegValue[2]; - /* Computes the oversize (address + control) size */ - uint16_t overSize = 2 + (uint16_t) SpiritPktStackGetControlLength(); - - /* Reads the PCKTLEN1 registers value */ - g_xStatus = SpiritSpiReadRegisters(PCKTLEN1_BASE, 2, tempRegValue); - - /* Rebuild and return the payload length value */ - return ((((uint16_t) tempRegValue[1])<<8) + (uint16_t) tempRegValue[0] - overSize); - -} - - -/** - * @brief Computes and sets the variable payload length for SPIRIT STack packets. - * @param nMaxPayloadLength payload length in bytes. - * This parameter is an uint16_t. - * @param xControlLength control length in bytes. - * This parameter can be any value of @ref StackControlLength. - * @retval None. - */ -void SpiritPktStackSetVarLengthWidth(uint16_t nMaxPayloadLength, StackControlLength xControlLength) -{ - uint8_t tempRegValue, - i; - uint32_t packetLength; - - - /* packet length = payload length + address length (2) + control length */ - packetLength=nMaxPayloadLength+2+xControlLength; - - /* Computes the number of bits */ - for(i=0;i<16;i++) - { - if(packetLength == 0) - { - break; - } - packetLength >>= 1; - } - i==0 ? i=1 : i; - - /* Reads the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiReadRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - - /* Build the register value */ - tempRegValue &= ~PCKTCTRL3_LEN_WID_MASK; - tempRegValue |= ((uint8_t)(i-1)); - - /* Writes the PCKTCTRL3 register value */ - g_xStatus = SpiritSpiWriteRegisters(PCKTCTRL3_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Rx packet source mask. Used to mask the address of the accepted packets. If 0 -> no filtering. - * @param cMask Rx source mask. - * This parameter is an uint8_t. - * @retval None. - */ -void SpiritPktStackSetRxSourceMask(uint8_t cMask) -{ - /* Writes value on the register PCKT_FLT_GOALS_SOURCE_MASK */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_GOALS_SOURCE_MASK_BASE, 1, &cMask); - -} - - -/** - * @brief Returns the Rx packet source mask. Used to mask the address of the accepted packets. If 0 -> no filtering. - * @param None. - * @retval uint8_t Rx source mask. - */ -uint8_t SpiritPktStackGetRxSourceMask(void) -{ - uint8_t tempRegValue; - - /* Writes value on the PCKT_FLT_GOALS_SOURCE_MASK register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_GOALS_SOURCE_MASK_BASE, 1, &tempRegValue); - - /* Return the read value */ - return tempRegValue; - -} - -/** - * @brief Returns the packet length field of the received packet. - * @param None. - * @retval uint16_t Packet length. - */ -uint16_t SpiritPktStackGetReceivedPktLength(void) -{ - uint8_t tempRegValue[2]; - uint16_t tempLength; - - /* Reads the RX_PCKT_LENx registers value */ - g_xStatus = SpiritSpiReadRegisters(RX_PCKT_LEN1_BASE, 2, tempRegValue); - - /* Rebuild and return the the length field */ - tempLength = ((((uint16_t) tempRegValue[0]) << 8) + (uint16_t) tempRegValue[1]); - - /* Computes the oversize (address + control) size */ - tempLength -= 2 + (uint16_t) SpiritPktStackGetControlLength(); - - return tempLength; - -} - - -/** - * @brief If enabled RX packet is accepted only if the masked source address field matches the - * masked source address field reference (SOURCE_MASK & SOURCE_FIELD_REF == SOURCE_MASK & RX_SOURCE_FIELD). - * @param xNewState new state for Source address filtering enable bit. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - * @note This filtering control is enabled by default but the source address mask is by default set to 0. - * As a matter of fact the user has to enable the source filtering bit after the packet initialization - * because the PktInit routine disables it. - */ -void SpiritPktStackFilterOnSourceAddress(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - - /* Modify the register value: set or reset the source bit filtering */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - - /* Set or reset the SOURCE ADDRESS filtering enabling bit */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK; - } - else - { - tempRegValue &= ~PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK; - } - - /* Writes the new value on the PCKT_FLT_OPTIONS register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 1, &tempRegValue); - -} - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Qi.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Qi.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,636 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Qi.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT QI. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Qi.h" -#include "MCU_Interface.h" - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Qi - * @{ - */ - - -/** - * @defgroup Qi_Private_TypesDefinitions QI Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Qi_Private_Defines QI Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Qi_Private_Macros QI Private Macros - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Qi_Private_Variables QI Private Variables - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Qi_Private_FunctionPrototypes QI Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Qi_Private_Functions QI Private Functions - * @{ - */ - -/** - * @brief Enables/Disables the PQI Preamble Quality Indicator check. The running peak PQI is - * compared to a threshold value and the preamble valid IRQ is asserted as soon as the threshold is passed. - * @param xNewState new state for PQI check. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritQiPqiCheck(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Enables or disables the PQI Check bit on the QI_BASE register */ - if(xNewState == S_ENABLE) - { - tempRegValue |= QI_PQI_MASK; - } - else - { - tempRegValue &= ~QI_PQI_MASK; - } - - /* Writes value on the QI register */ - g_xStatus = SpiritSpiWriteRegisters(QI_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables/Disables the Synchronization Quality Indicator check. The running peak SQI is - * compared to a threshold value and the sync valid IRQ is asserted as soon as the threshold is passed. - * @param xNewState new state for SQI check. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritQiSqiCheck(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Enables or disables the SQI Check bit on the QI_BASE register */ - if(xNewState == S_ENABLE) - { - tempRegValue |= QI_SQI_MASK; - } - else - { - tempRegValue &= ~QI_SQI_MASK; - } - - /* Writes value on the QI register */ - g_xStatus = SpiritSpiWriteRegisters(QI_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Sets the PQI threshold. The preamble quality threshold is 4*PQI_TH (PQI_TH = 0..15). - * @param xPqiThr parameter of the formula above. - * This variable is a @ref PqiThreshold. - * @retval None. - */ -void SpiritQiSetPqiThreshold(PqiThreshold xPqiThr) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PQI_THR(xPqiThr)); - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Build the PQI threshold value to be written */ - tempRegValue &= 0xC3; - tempRegValue |= ((uint8_t)xPqiThr); - - /* Writes value on the QI register */ - g_xStatus = SpiritSpiWriteRegisters(QI_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the PQI threshold. The preamble quality threshold is 4*PQI_TH (PQI_TH = 0..15). - * @param None. - * @retval PqiThreshold PQI threshold (PQI_TH of the formula above). - */ -PqiThreshold SpiritQiGetPqiThreshold(void) -{ - uint8_t tempRegValue; - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Rebuild and return the PQI threshold value */ - return (PqiThreshold)(tempRegValue & 0x3C); - -} - - -/** - * @brief Sets the SQI threshold. The synchronization quality - * threshold is equal to 8 * SYNC_LEN - 2 * SQI_TH with SQI_TH = 0..3. When SQI_TH is 0 perfect match is required; when - * SQI_TH = 1, 2, 3 then 1, 2, or 3 bit errors are respectively accepted. It is recommended that the SQI check is always - * enabled. - * @param xSqiThr parameter of the formula above. - * This parameter is a @ref SqiThreshold. - * @retval None. - */ -void SpiritQiSetSqiThreshold(SqiThreshold xSqiThr) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SQI_THR(xSqiThr)); - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Build the SQI threshold value to be written */ - tempRegValue &= 0x3F; - tempRegValue |= ((uint8_t)xSqiThr); - - /* Writes the new value on the QI register */ - g_xStatus = SpiritSpiWriteRegisters(QI_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the SQI threshold. The synchronization quality threshold is equal to 8 * SYNC_LEN - 2 * SQI_TH with SQI_TH = 0..3. - * @param None. - * @retval SqiThreshold SQI threshold (SQI_TH of the formula above). - */ -SqiThreshold SpiritQiGetSqiThreshold(void) -{ - uint8_t tempRegValue; - - /* Reads the QI register value */ - g_xStatus = SpiritSpiReadRegisters(QI_BASE, 1, &tempRegValue); - - /* Rebuild and return the SQI threshold value */ - return (SqiThreshold)(tempRegValue & 0xC0); - -} - - -/** - * @brief Returns the PQI value. - * @param None. - * @retval uint8_t PQI value. - */ -uint8_t SpiritQiGetPqi(void) -{ - uint8_t tempRegValue; - - /* Reads the LINK_QUALIF2 register value */ - g_xStatus = SpiritSpiReadRegisters(LINK_QUALIF2_BASE, 1, &tempRegValue); - - /* Returns the PQI value */ - return tempRegValue; - -} - - -/** - * @brief Returns the SQI value. - * @param None. - * @retval uint8_t SQI value. - */ -uint8_t SpiritQiGetSqi(void) -{ - uint8_t tempRegValue; - - /* Reads the register LINK_QUALIF1 value */ - g_xStatus = SpiritSpiReadRegisters(LINK_QUALIF1_BASE, 1, &tempRegValue); - - /* Rebuild and return the SQI value */ - return (tempRegValue & 0x7F); - -} - - -/** - * @brief Returns the LQI value. - * @param None. - * @retval uint8_t LQI value. - */ -uint8_t SpiritQiGetLqi(void) -{ - uint8_t tempRegValue; - - /* Reads the LINK_QUALIF0 register value */ - g_xStatus = SpiritSpiReadRegisters(LINK_QUALIF0_BASE, 1, &tempRegValue); - - /* Rebuild and return the LQI value */ - return ((tempRegValue & 0xF0)>> 4); - -} - - -/** - * @brief Returns the CS status. - * @param None. - * @retval SpiritFlagStatus CS value (S_SET or S_RESET). - */ -SpiritFlagStatus SpiritQiGetCs(void) -{ - uint8_t tempRegValue; - - /* Reads the LINK_QUALIF1 register value */ - g_xStatus = SpiritSpiReadRegisters(LINK_QUALIF1_BASE, 1, &tempRegValue); - - /* Rebuild and returns the CS status value */ - if((tempRegValue & 0x80) == 0) - { - return S_RESET; - } - else - { - return S_SET; - } - -} - - -/** - * @brief Returns the RSSI value. The measured power is reported in steps of half a dB from 0 to 255 and is offset in such a way that -120 dBm corresponds - * to 20. - * @param None. - * @retval uint8_t RSSI value. - */ -uint8_t SpiritQiGetRssi(void) -{ - uint8_t tempRegValue; - - /* Reads the RSSI_LEVEL register value */ - g_xStatus = SpiritSpiReadRegisters(RSSI_LEVEL_BASE, 1, &tempRegValue); - - /* Returns the RSSI value */ - return tempRegValue; - -} - - -/** - * @brief Sets the RSSI threshold. - * @param cRssiThr RSSI threshold reported in steps of half a dBm with a -130 dBm offset. - * This parameter must be a uint8_t. - * @retval None. - */ -void SpiritQiSetRssiThreshold(uint8_t cRssiThr) -{ - /* Writes the new value on the RSSI_TH register */ - g_xStatus = SpiritSpiWriteRegisters(RSSI_TH_BASE, 1, &cRssiThr); - -} - - -/** - * @brief Returns the RSSI threshold. - * @param None. - * @retval uint8_t RSSI threshold. - */ -uint8_t SpiritQiGetRssiThreshold(void) -{ - uint8_t tempRegValue; - - /* Reads the RSSI_TH register value */ - g_xStatus = SpiritSpiReadRegisters(RSSI_TH_BASE, 1, &tempRegValue); - - /* Returns RSSI threshold */ - return tempRegValue; - -} - - -/** - * @brief Computes the RSSI threshold from its dBm value according to the formula: (RSSI[Dbm] + 130)/0.5 - * @param nDbmValue RSSI threshold reported in dBm. - * This parameter must be a sint16_t. - * @retval uint8_t RSSI threshold corresponding to dBm value. - */ -uint8_t SpiritQiComputeRssiThreshold(int nDbmValue) -{ - /* Check the parameters */ - s_assert_param(IS_RSSI_THR_DBM(nDbmValue)); - - /* Computes the RSSI threshold for register */ - return 2*(nDbmValue+130); - -} - -/** - * @brief Sets the RSSI threshold from its dBm value according to the formula: (RSSI[Dbm] + 130)/0.5. - * @param nDbmValue RSSI threshold reported in dBm. - * This parameter must be a sint16_t. - * @retval None. - */ -void SpiritQiSetRssiThresholddBm(int nDbmValue) -{ - uint8_t tempRegValue=2*(nDbmValue+130); - - /* Check the parameters */ - s_assert_param(IS_RSSI_THR_DBM(nDbmValue)); - - /* Writes the new value on the RSSI_TH register */ - g_xStatus = SpiritSpiWriteRegisters(RSSI_TH_BASE, 1, &tempRegValue); - -} - -/** - * @brief Sets the RSSI filter gain. This parameter sets the bandwidth of a low pass IIR filter (RSSI_FLT register, allowed values 0..15), a - * lower values gives a faster settling of the measurements but lower precision. The recommended value for such parameter is 14. - * @param xRssiFg RSSI filter gain value. - * This parameter can be any value of @ref RssiFilterGain. - * @retval None. - */ -void SpiritQiSetRssiFilterGain(RssiFilterGain xRssiFg) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_RSSI_FILTER_GAIN(xRssiFg)); - - /* Reads the RSSI_FLT register */ - g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Sets the specified filter gain */ - tempRegValue &= 0x0F; - tempRegValue |= ((uint8_t)xRssiFg); - - /* Writes the new value on the RSSI_FLT register */ - g_xStatus = SpiritSpiWriteRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the RSSI filter gain. - * @param None. - * @retval RssiFilterGain RSSI filter gain. - */ -RssiFilterGain SpiritQiGetRssiFilterGain(void) -{ - uint8_t tempRegValue; - - /* Reads the RSSI_FLT register */ - g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Rebuild and returns the filter gain value */ - return (RssiFilterGain)(tempRegValue & 0xF0); - -} - - -/** - * @brief Sets the CS Mode. When static carrier sensing is used (cs_mode = 0), the carrier sense signal is asserted when the measured RSSI is above the - * value specified in the RSSI_TH register and is deasserted when the RSSI falls 3 dB below the same threshold. - * When dynamic carrier sense is used (cs_mode = 1, 2, 3), the carrier sense signal is asserted if the signal is above the - * threshold and a fast power increase of 6, 12 or 18 dB is detected; it is deasserted if a power fall of the same amplitude is - * detected. - * @param xCsMode CS mode selector. - * This parameter can be any value of @ref CSMode. - * @retval None. - */ -void SpiritQiSetCsMode(CSMode xCsMode) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_CS_MODE(xCsMode)); - - /* Reads the RSSI_FLT register */ - g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Sets bit to select the CS mode */ - tempRegValue &= ~0x0C; - tempRegValue |= ((uint8_t)xCsMode); - - /* Writes the new value on the RSSI_FLT register */ - g_xStatus = SpiritSpiWriteRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the CS Mode. - * @param None. - * @retval CSMode CS mode. - */ -CSMode SpiritQiGetCsMode(void) -{ - uint8_t tempRegValue; - - /* Reads the RSSI_FLT register */ - g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Rebuild and returns the CS mode value */ - return (CSMode)(tempRegValue & 0x0C); - -} - -/** - * @brief Enables/Disables the CS Timeout Mask. If enabled CS value contributes to timeout disabling. - * @param xNewState new state for CS Timeout Mask. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritQiCsTimeoutMask(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL2 register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Enables or disables the CS timeout mask */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PROTOCOL2_CS_TIMEOUT_MASK; - } - else - { - tempRegValue &= ~PROTOCOL2_CS_TIMEOUT_MASK; - } - - /* Writes the new value on the PROTOCOL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables/Disables the PQI Timeout Mask. If enabled PQI value contributes to timeout disabling. - * @param xNewState new state for PQI Timeout Mask. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritQiPqiTimeoutMask(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL2 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Enables or disables the PQI timeout mask */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PROTOCOL2_PQI_TIMEOUT_MASK; - } - else - { - tempRegValue &= ~PROTOCOL2_PQI_TIMEOUT_MASK; - } - - /* Writes the new value on the PROTOCOL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables/Disables the SQI Timeout Mask. If enabled SQI value contributes to timeout disabling. - * @param xNewState new state for SQI Timeout Mask. - * This parameter can be S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritQiSqiTimeoutMask(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL2 register */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Enables or disables the SQI timeout mask */ - if(xNewState == S_ENABLE) - { - tempRegValue |= PROTOCOL2_SQI_TIMEOUT_MASK; - } - else - { - tempRegValue &= ~PROTOCOL2_SQI_TIMEOUT_MASK; - } - - /* Writes the new value on the PROTOCOL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - *@} - */ - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Radio.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Radio.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3144 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Radio.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief This file provides all the low level API to manage Analog and Digital - * radio part of SPIRIT. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Radio.h" -#include "MCU_Interface.h" -#include <math.h> - -/** @addtogroup SPIRIT_Libraries -* @{ -*/ - - -/** @addtogroup SPIRIT_Radio -* @{ -*/ - - -/** @defgroup Radio_Private_TypesDefinitions Radio Private Types Definitions -* @{ -*/ - - -/** -* @} -*/ - - -/** @defgroup Radio_Private_Defines Radio Private Defines -* @{ -*/ - - - - -/** -* @} -*/ - - -/** @defgroup Radio_Private_Macros Radio Private Macros -* @{ -*/ -#define XTAL_FLAG(xtalFrequency) (xtalFrequency>=25e6) ? XTAL_FLAG_26_MHz:XTAL_FLAG_24_MHz - -#define ROUND(A) (((A-(uint32_t)A)> 0.5)? (uint32_t)A+1:(uint32_t)A) -/** -* @} -*/ - - -/** @defgroup Radio_Private_Variables Radio Private Variables -* @{ -*/ -/** -* @brief The Xtal frequency. To be set by the user (see SetXtalFreq() function) -*/ -static uint32_t s_lXtalFrequency; - -/** -* @brief Factor is: B/2 used in the formula for SYNTH word calculation -*/ -static const uint8_t s_vectcBHalfFactor[4]={(HIGH_BAND_FACTOR/2), (MIDDLE_BAND_FACTOR/2), (LOW_BAND_FACTOR/2), (VERY_LOW_BAND_FACTOR/2)}; - -/** -* @brief BS value to write in the SYNT0 register according to the selected band -*/ -static const uint8_t s_vectcBandRegValue[4]={SYNT0_BS_6, SYNT0_BS_12, SYNT0_BS_16, SYNT0_BS_32}; - - -/** -* @brief It represents the available channel bandwidth times 10 for 26 Mhz xtal. -* @note The channel bandwidth for others xtal frequencies can be computed since this table -* multiplying the current table by a factor xtal_frequency/26e6. -*/ -static const uint16_t s_vectnBandwidth26M[90]= -{ - 8001, 7951, 7684, 7368, 7051, 6709, 6423, 5867, 5414, \ - 4509, 4259, 4032, 3808, 3621, 3417, 3254, 2945, 2703, \ - 2247, 2124, 2015, 1900, 1807, 1706, 1624, 1471, 1350, \ - 1123, 1062, 1005, 950, 903, 853, 812, 735, 675, \ - 561, 530, 502, 474, 451, 426, 406, 367, 337, \ - 280, 265, 251, 237, 226, 213, 203, 184, 169, \ - 140, 133, 126, 119, 113, 106, 101, 92, 84, \ - 70, 66, 63, 59, 56, 53, 51, 46, 42, \ - 35, 33, 31, 30, 28, 27, 25, 23, 21, \ - 18, 17, 16, 15, 14, 13, 13, 12, 11 -}; - -/** -* @brief It represents the available VCO frequencies -*/ -static const uint16_t s_vectnVCOFreq[16]= -{ - 4644, 4708, 4772, 4836, 4902, 4966, 5030, 5095, \ - 5161, 5232, 5303, 5375, 5448, 5519, 5592, 5663 -}; - -/** -* @brief This variable is used to enable or disable -* the VCO calibration WA called at the end of the SpiritRadioSetFrequencyBase fcn. -* Default is enabled. -*/ -static SpiritFunctionalState xDoVcoCalibrationWA=S_ENABLE; - - -/** -* @brief These values are used to interpolate the power curves. -* Interpolation curves are linear in the following 3 regions: -* - reg value: 1 to 13 (up region) -* - reg value: 13 to 40 (mid region) -* - reg value: 41 to 90 (low region) -* power_reg = m*power_dBm + q -* For each band the order is: {m-up, q-up, m-mid, q-mid, m-low, q-low}. -* @note The power interpolation curves have been extracted -* by measurements done on the divisional evaluation boards. -*/ -static const float fPowerFactors[5][6]={ - {-2.11,25.66,-2.11,25.66,-2.00,31.28}, /* 915 */ - {-2.04,23.45,-2.04,23.45,-1.95,27.66}, /* 868 */ - {-3.48,38.45,-1.89,27.66,-1.92,30.23}, /* 433 */ - {-3.27,35.43,-1.80,26.31,-1.89,29.61}, /* 315 */ - {-4.18,50.66,-1.80,30.04,-1.86,32.22}, /* 169 */ -}; - -/** -* @} -*/ - - -/** @defgroup Radio_Private_FunctionPrototypes Radio Private Function Prototypes -* @{ -*/ - - -/** -* @} -*/ - - -/** @defgroup Radio_Private_Functions Radio Private Functions -* @{ -*/ - -/** -* @brief Initializes the SPIRIT analog and digital radio part according to the specified -* parameters in the pxSRadioInitStruct. -* @param pxSRadioInitStruct pointer to a SRadioInit structure that -* contains the configuration information for the analog radio part of SPIRIT. -* @retval Error code: 0=no error, 1=error during calibration of VCO. -*/ -uint8_t SpiritRadioInit(SRadioInit* pxSRadioInitStruct) -{ - int32_t FOffsetTmp; - uint8_t anaRadioRegArray[8], digRadioRegArray[4]; - int16_t xtalOffsetFactor; - uint8_t drM, drE, FdevM, FdevE, bwM, bwE; - - /* Workaround for Vtune */ - uint8_t value = 0xA0; SpiritSpiWriteRegisters(0x9F, 1, &value); - - /* Calculates the offset respect to RF frequency and according to xtal_ppm parameter: (xtal_ppm*FBase)/10^6 */ - FOffsetTmp = (int32_t)(((float)pxSRadioInitStruct->nXtalOffsetPpm*pxSRadioInitStruct->lFrequencyBase)/PPM_FACTOR); - - /* Check the parameters */ - s_assert_param(IS_FREQUENCY_BAND(pxSRadioInitStruct->lFrequencyBase)); - s_assert_param(IS_MODULATION_SELECTED(pxSRadioInitStruct->xModulationSelect)); - s_assert_param(IS_DATARATE(pxSRadioInitStruct->lDatarate)); - s_assert_param(IS_FREQUENCY_OFFSET(FOffsetTmp,s_lXtalFrequency)); - s_assert_param(IS_CHANNEL_SPACE(pxSRadioInitStruct->nChannelSpace,s_lXtalFrequency)); - s_assert_param(IS_F_DEV(pxSRadioInitStruct->lFreqDev,s_lXtalFrequency)); - - /* Disable the digital, ADC, SMPS reference clock divider if fXO>24MHz or fXO<26MHz */ - SpiritSpiCommandStrobes(COMMAND_STANDBY); - do{ - /* Delay for state transition */ - for(volatile uint8_t i=0; i!=0xFF; i++); - - /* Reads the MC_STATUS register */ - SpiritRefreshStatus(); - }while(g_xStatus.MC_STATE!=MC_STATE_STANDBY); - - if(s_lXtalFrequency<DOUBLE_XTAL_THR) - { - SpiritRadioSetDigDiv(S_DISABLE); - s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,s_lXtalFrequency)); - } - else - { - SpiritRadioSetDigDiv(S_ENABLE); - s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,(s_lXtalFrequency>>1))); - } - - /* Goes in READY state */ - SpiritSpiCommandStrobes(COMMAND_READY); - do{ - /* Delay for state transition */ - for(volatile uint8_t i=0; i!=0xFF; i++); - - /* Reads the MC_STATUS register */ - SpiritRefreshStatus(); - }while(g_xStatus.MC_STATE!=MC_STATE_READY); - - /* Calculates the FC_OFFSET parameter and cast as signed int: FOffsetTmp = (Fxtal/2^18)*FC_OFFSET */ - xtalOffsetFactor = (int16_t)(((float)FOffsetTmp*FBASE_DIVIDER)/s_lXtalFrequency); - anaRadioRegArray[2] = (uint8_t)((((uint16_t)xtalOffsetFactor)>>8)&0x0F); - anaRadioRegArray[3] = (uint8_t)(xtalOffsetFactor); - - /* Calculates the channel space factor */ - anaRadioRegArray[0] =((uint32_t)pxSRadioInitStruct->nChannelSpace<<9)/(s_lXtalFrequency>>6)+1; - - SpiritManagementWaTRxFcMem(pxSRadioInitStruct->lFrequencyBase); - - /* 2nd order DEM algorithm enabling */ - uint8_t tmpreg; SpiritSpiReadRegisters(0xA3, 1, &tmpreg); - tmpreg &= ~0x02; SpiritSpiWriteRegisters(0xA3, 1, &tmpreg); - - /* Check the channel center frequency is in one of the possible range */ - s_assert_param(IS_FREQUENCY_BAND((pxSRadioInitStruct->lFrequencyBase + ((xtalOffsetFactor*s_lXtalFrequency)/FBASE_DIVIDER) + pxSRadioInitStruct->nChannelSpace * pxSRadioInitStruct->cChannelNumber))); - - /* Calculates the datarate mantissa and exponent */ - SpiritRadioSearchDatarateME(pxSRadioInitStruct->lDatarate, &drM, &drE); - digRadioRegArray[0] = (uint8_t)(drM); - digRadioRegArray[1] = (uint8_t)(0x00 | pxSRadioInitStruct->xModulationSelect |drE); - - /* Read the fdev register to preserve the clock recovery algo bit */ - SpiritSpiReadRegisters(0x1C, 1, &tmpreg); - - /* Calculates the frequency deviation mantissa and exponent */ - SpiritRadioSearchFreqDevME(pxSRadioInitStruct->lFreqDev, &FdevM, &FdevE); - digRadioRegArray[2] = (uint8_t)((FdevE<<4) | (tmpreg&0x08) | FdevM); - - /* Calculates the channel filter mantissa and exponent */ - SpiritRadioSearchChannelBwME(pxSRadioInitStruct->lBandwidth, &bwM, &bwE); - - digRadioRegArray[3] = (uint8_t)((bwM<<4) | bwE); - - float if_off=(3.0*480140)/(s_lXtalFrequency>>12)-64; - - uint8_t ifOffsetAna = ROUND(if_off); - - if(s_lXtalFrequency<DOUBLE_XTAL_THR) - { - /* if offset digital is the same in case of single xtal */ - anaRadioRegArray[1] = ifOffsetAna; - } - else - { - if_off=(3.0*480140)/(s_lXtalFrequency>>13)-64; - - /* ... otherwise recompute it */ - anaRadioRegArray[1] = ROUND(if_off); - } -// if(s_lXtalFrequency==24000000) { -// ifOffsetAna = 0xB6; -// anaRadioRegArray[1] = 0xB6; -// } -// if(s_lXtalFrequency==25000000) { -// ifOffsetAna = 0xAC; -// anaRadioRegArray[1] = 0xAC; -// } -// if(s_lXtalFrequency==26000000) { -// ifOffsetAna = 0xA3; -// anaRadioRegArray[1] = 0xA3; -// } -// if(s_lXtalFrequency==48000000) { -// ifOffsetAna = 0x3B; -// anaRadioRegArray[1] = 0xB6; -// } -// if(s_lXtalFrequency==50000000) { -// ifOffsetAna = 0x36; -// anaRadioRegArray[1] = 0xAC; -// } -// if(s_lXtalFrequency==52000000) { -// ifOffsetAna = 0x31; -// anaRadioRegArray[1] = 0xA3; -// } - - g_xStatus = SpiritSpiWriteRegisters(IF_OFFSET_ANA_BASE, 1, &ifOffsetAna); - - - /* Sets Xtal configuration */ - if(s_lXtalFrequency>DOUBLE_XTAL_THR) - { - SpiritRadioSetXtalFlag(XTAL_FLAG((s_lXtalFrequency/2))); - } - else - { - SpiritRadioSetXtalFlag(XTAL_FLAG(s_lXtalFrequency)); - } - - /* Sets the channel number in the corresponding register */ - SpiritSpiWriteRegisters(CHNUM_BASE, 1, &pxSRadioInitStruct->cChannelNumber); - - /* Configures the Analog Radio registers */ - SpiritSpiWriteRegisters(CHSPACE_BASE, 4, anaRadioRegArray); - - /* Configures the Digital Radio registers */ - g_xStatus = SpiritSpiWriteRegisters(MOD1_BASE, 4, digRadioRegArray); - - /* Enable the freeze option of the AFC on the SYNC word */ - SpiritRadioAFCFreezeOnSync(S_ENABLE); - - /* Set the IQC correction optimal value */ - anaRadioRegArray[0]=0x80; - anaRadioRegArray[1]=0xE3; - g_xStatus = SpiritSpiWriteRegisters(0x99, 2, anaRadioRegArray); - - return SpiritRadioSetFrequencyBase(pxSRadioInitStruct->lFrequencyBase); - -} - - -/** -* @brief Returns the SPIRIT analog and digital radio structure according to the registers value. -* @param pxSRadioInitStruct pointer to a SRadioInit structure that -* contains the configuration information for the analog radio part of SPIRIT. -* @retval None. -*/ -void SpiritRadioGetInfo(SRadioInit* pxSRadioInitStruct) -{ - uint8_t anaRadioRegArray[8], digRadioRegArray[4]; - BandSelect band; - int16_t xtalOffsetFactor; - - /* Get the RF board version */ - //SpiritVersion xSpiritVersion = SpiritGeneralGetSpiritVersion(); - - /* Reads the Analog Radio registers */ - SpiritSpiReadRegisters(SYNT3_BASE, 8, anaRadioRegArray); - - /* Reads the Digital Radio registers */ - g_xStatus = SpiritSpiReadRegisters(MOD1_BASE, 4, digRadioRegArray); - - /* Reads the operating band masking the Band selected field */ - if((anaRadioRegArray[3] & 0x07) == SYNT0_BS_6) - { - band = HIGH_BAND; - } - else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_12) - { - band = MIDDLE_BAND; - } - else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_16) - { - band = LOW_BAND; - } - else if ((anaRadioRegArray[3] & 0x07) == SYNT0_BS_32) - { - band = VERY_LOW_BAND; - } - else - { - /* if it is another value, set it to a valid one in order to avoid access violation */ - uint8_t tmp=(anaRadioRegArray[3]&0xF8)|SYNT0_BS_6; - SpiritSpiWriteRegisters(SYNT0_BASE,1,&tmp); - band = HIGH_BAND; - } - - /* Computes the synth word */ - uint32_t synthWord = (uint32_t)((((uint32_t)(anaRadioRegArray[0]&0x1F))<<21)+(((uint32_t)(anaRadioRegArray[1]))<<13)+\ - (((uint32_t)(anaRadioRegArray[2]))<<5)+(((uint32_t)(anaRadioRegArray[3]))>>3)); - - /* Calculates the frequency base */ - uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1; - pxSRadioInitStruct->lFrequencyBase = (uint32_t)round(synthWord*(((double)s_lXtalFrequency)/(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band]))); - - /* Calculates the Offset Factor */ - uint16_t xtalOffTemp = ((((uint16_t)anaRadioRegArray[6])<<8)+((uint16_t)anaRadioRegArray[7])); - - /* If a negative number then convert the 12 bit 2-complement in a 16 bit number */ - if(xtalOffTemp & 0x0800) - { - xtalOffTemp = xtalOffTemp | 0xF000; - } - else - { - xtalOffTemp = xtalOffTemp & 0x0FFF; - } - - xtalOffsetFactor = *((int16_t*)(&xtalOffTemp)); - - /* Calculates the frequency offset in ppm */ - pxSRadioInitStruct->nXtalOffsetPpm =(int16_t)((uint32_t)xtalOffsetFactor*s_lXtalFrequency*PPM_FACTOR)/((uint32_t)FBASE_DIVIDER*pxSRadioInitStruct->lFrequencyBase); - - /* Channel space */ - pxSRadioInitStruct->nChannelSpace = anaRadioRegArray[4]*(s_lXtalFrequency>>15); - - /* Channel number */ - pxSRadioInitStruct->cChannelNumber = SpiritRadioGetChannel(); - - /* Modulation select */ - pxSRadioInitStruct->xModulationSelect = (ModulationSelect)(digRadioRegArray[1] & 0x70); - - /* Reads the frequency deviation for mantissa and exponent */ - uint8_t FDevM = digRadioRegArray[2]&0x07; - uint8_t FDevE = (digRadioRegArray[2]&0xF0)>>4; - - /* Reads the channel filter register for mantissa and exponent */ - uint8_t bwM = (digRadioRegArray[3]&0xF0)>>4; - uint8_t bwE = digRadioRegArray[3]&0x0F; - - uint8_t cDivider = 0; - cDivider = SpiritRadioGetDigDiv(); - - /* Calculates the datarate */ - pxSRadioInitStruct->lDatarate = ((s_lXtalFrequency>>(5+cDivider))*(256+digRadioRegArray[0]))>>(23-(digRadioRegArray[1]&0x0F)); - - /* Calculates the frequency deviation */ - // (((s_lXtalFrequency>>6)*(8+FDevM))>>(12-FDevE+cCorrection)); - pxSRadioInitStruct->lFreqDev =(uint32_t)((float)s_lXtalFrequency/(((uint32_t)1)<<18)*(uint32_t)((8.0+FDevM)/2*(1<<FDevE))); - - /* Reads the channel filter bandwidth from the look-up table and return it */ - pxSRadioInitStruct->lBandwidth = (uint32_t)(100.0*s_vectnBandwidth26M[bwM+(bwE*9)]*((s_lXtalFrequency>>cDivider)/26e6)); - -} - - -/** -* @brief Sets the Xtal configuration in the ANA_FUNC_CONF0 register. -* @param xXtal one of the possible value of the enum type XtalFrequency. -* @arg XTAL_FLAG_24_MHz: in case of 24 MHz crystal -* @arg XTAL_FLAG_26_MHz: in case of 26 MHz crystal -* @retval None. -*/ -void SpiritRadioSetXtalFlag(XtalFlag xXtal) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_XTAL_FLAG(xXtal)); - - /* Reads the ANA_FUNC_CONF_0 register */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - if(xXtal == XTAL_FLAG_26_MHz) - { - tempRegValue|=SELECT_24_26_MHZ_MASK; - } - else - { - tempRegValue &= (~SELECT_24_26_MHZ_MASK); - } - - /* Sets the 24_26MHz_SELECT field in the ANA_FUNC_CONF_0 register */ - g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the Xtal configuration in the ANA_FUNC_CONF0 register. -* @param None. -* @retval XtalFrequency Settled Xtal configuration. -*/ -XtalFlag SpiritRadioGetXtalFlag(void) -{ - uint8_t tempRegValue; - - /* Reads the Xtal configuration in the ANA_FUNC_CONF_0 register and return the value */ - g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); - - return (XtalFlag)((tempRegValue & 0x40)>>6); - -} - - -/** -* @brief Returns the charge pump word for a given VCO frequency. -* @param lFc channel center frequency expressed in Hz. -* This parameter can be a value in one of the following ranges:<ul> -* <li> High_Band: from 779 MHz to 915 MHz </li> -* <li> Middle Band: from 387 MHz to 470 MHz </li> -* <li> Low Band: from 300 MHz to 348 MHz </li> -* <li> Very low Band: from 150 MHz to 174 MHz </li> </ul> -* @retval uint8_t Charge pump word. -*/ -uint8_t SpiritRadioSearchWCP(uint32_t lFc) -{ - int8_t i; - uint32_t vcofreq; - uint8_t BFactor; - - /* Check the channel center frequency is in one of the possible range */ - s_assert_param(IS_FREQUENCY_BAND(lFc)); - - /* Search the operating band */ - if(IS_FREQUENCY_BAND_HIGH(lFc)) - { - BFactor = HIGH_BAND_FACTOR; - } - else if(IS_FREQUENCY_BAND_MIDDLE(lFc)) - { - BFactor = MIDDLE_BAND_FACTOR; - } - else if(IS_FREQUENCY_BAND_LOW(lFc)) - { - BFactor = LOW_BAND_FACTOR; - } - else - { - BFactor = VERY_LOW_BAND_FACTOR; - } - - /* Calculates the VCO frequency VCOFreq = lFc*B */ - vcofreq = (lFc/1000000)*BFactor; - - /* Search in the vco frequency array the charge pump word */ - if(vcofreq>=s_vectnVCOFreq[15]) - { - i=15; - } - else - { - /* Search the value */ - for(i=0 ; i<15 && vcofreq>s_vectnVCOFreq[i] ; i++); - - /* Be sure that it is the best approssimation */ - if (i!=0 && s_vectnVCOFreq[i]-vcofreq>vcofreq-s_vectnVCOFreq[i-1]) - i--; - } - - /* Return index */ - return (i%8); - -} - -/** -* @brief Returns the synth word. -* @param None. -* @retval uint32_t Synth word. -*/ -uint32_t SpiritRadioGetSynthWord(void) -{ - uint8_t regArray[4]; - - /* Reads the SYNTH registers, build the synth word and return it */ - g_xStatus = SpiritSpiReadRegisters(SYNT3_BASE, 4, regArray); - return ((((uint32_t)(regArray[0]&0x1F))<<21)+(((uint32_t)(regArray[1]))<<13)+\ - (((uint32_t)(regArray[2]))<<5)+(((uint32_t)(regArray[3]))>>3)); - -} - - -/** -* @brief Sets the SYNTH registers. -* @param lSynthWord the synth word to write in the SYNTH[3:0] registers. -* @retval None. -*/ -void SpiritRadioSetSynthWord(uint32_t lSynthWord) -{ - uint8_t tempArray[4]; - uint8_t tempRegValue; - - /* Reads the SYNT0 register */ - g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue); - - /* Mask the Band selected field */ - tempRegValue &= 0x07; - - /* Build the array for SYNTH registers */ - tempArray[0] = (uint8_t)((lSynthWord>>21)&(0x0000001F)); - tempArray[1] = (uint8_t)((lSynthWord>>13)&(0x000000FF)); - tempArray[2] = (uint8_t)((lSynthWord>>5)&(0x000000FF)); - tempArray[3] = (uint8_t)(((lSynthWord&0x0000001F)<<3)| tempRegValue); - - /* Writes the synth word in the SYNTH registers */ - g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, tempArray); - -} - - -/** -* @brief Sets the operating band. -* @param xBand the band to set. -* This parameter can be one of following parameters: -* @arg HIGH_BAND High_Band selected: from 779 MHz to 915 MHz -* @arg MIDDLE_BAND: Middle Band selected: from 387 MHz to 470 MHz -* @arg LOW_BAND: Low Band selected: from 300 MHz to 348 MHz -* @arg VERY_LOW_BAND: Very low Band selected: from 150 MHz to 174 MHz -* @retval None. -*/ -void SpiritRadioSetBand(BandSelect xBand) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_BAND_SELECTED(xBand)); - - /* Reads the SYNT0 register*/ - g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue); - - /* Mask the SYNTH[4;0] field and write the BS value */ - tempRegValue &= 0xF8; - tempRegValue |= s_vectcBandRegValue[xBand]; - - /* Configures the SYNT0 register setting the operating band */ - g_xStatus = SpiritSpiWriteRegisters(SYNT0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the operating band. -* @param None. -* @retval BandSelect Settled band. -* This returned value can be one of the following parameters: -* @arg HIGH_BAND High_Band selected: from 779 MHz to 915 MHz -* @arg MIDDLE_BAND: Middle Band selected: from 387 MHz to 470 MHz -* @arg LOW_BAND: Low Band selected: from 300 MHz to 348 MHz -* @arg VERY_LOW_BAND: Very low Band selected: from 150 MHz to 174 MHz -*/ -BandSelect SpiritRadioGetBand(void) -{ - uint8_t tempRegValue; - - /* Reads the SYNT0 register */ - g_xStatus = SpiritSpiReadRegisters(SYNT0_BASE, 1, &tempRegValue); - - /* Mask the Band selected field */ - if((tempRegValue & 0x07) == SYNT0_BS_6) - { - return HIGH_BAND; - } - else if ((tempRegValue & 0x07) == SYNT0_BS_12) - { - return MIDDLE_BAND; - } - else if ((tempRegValue & 0x07) == SYNT0_BS_16) - { - return LOW_BAND; - } - else - { - return VERY_LOW_BAND; - } - -} - - -/** -* @brief Sets the channel number. -* @param cChannel the channel number. -* @retval None. -*/ -void SpiritRadioSetChannel(uint8_t cChannel) -{ - /* Writes the CHNUM register */ - g_xStatus = SpiritSpiWriteRegisters(CHNUM_BASE, 1, &cChannel); - -} - - -/** -* @brief Returns the actual channel number. -* @param None. -* @retval uint8_t Actual channel number. -*/ -uint8_t SpiritRadioGetChannel(void) -{ - uint8_t tempRegValue; - - /* Reads the CHNUM register and return the value */ - g_xStatus = SpiritSpiReadRegisters(CHNUM_BASE, 1, &tempRegValue); - - return tempRegValue; - -} - - -/** -* @brief Sets the channel space factor in channel space register. -* The channel spacing step is computed as F_Xo/32768. -* @param fChannelSpace the channel space expressed in Hz. -* @retval None. -*/ -void SpiritRadioSetChannelSpace(uint32_t fChannelSpace) -{ - uint8_t cChannelSpaceFactor; - - /* Round to the nearest integer */ - cChannelSpaceFactor = ((uint32_t)fChannelSpace*CHSPACE_DIVIDER)/s_lXtalFrequency; - - /* Write value into the register */ - g_xStatus = SpiritSpiWriteRegisters(CHSPACE_BASE, 1, &cChannelSpaceFactor); - -} - - -/** -* @brief Returns the channel space register. -* @param None. -* @retval uint32_t Channel space. The channel space is: CS = channel_space_factor x XtalFrequency/2^15 -* where channel_space_factor is the CHSPACE register value. -*/ -uint32_t SpiritRadioGetChannelSpace(void) -{ - uint8_t channelSpaceFactor; - - /* Reads the CHSPACE register, calculate the channel space and return it */ - g_xStatus = SpiritSpiReadRegisters(CHSPACE_BASE, 1, &channelSpaceFactor); - - /* Compute the Hertz value and return it */ - return ((channelSpaceFactor*s_lXtalFrequency)/CHSPACE_DIVIDER); - -} - - -/** -* @brief Sets the FC OFFSET register starting from xtal ppm value. -* @param nXtalPpm the xtal offset expressed in ppm. -* @retval None. -*/ -void SpiritRadioSetFrequencyOffsetPpm(int16_t nXtalPpm) -{ - uint8_t tempArray[2]; - int16_t xtalOffsetFactor; - uint32_t synthWord, fBase; - int32_t FOffsetTmp; - BandSelect band; - - /* Reads the synth word */ - synthWord = SpiritRadioGetSynthWord(); - - /* Reads the operating band */ - band = SpiritRadioGetBand(); - - /* Calculates the frequency base */ - uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1; - fBase = synthWord*(s_lXtalFrequency/(s_vectcBHalfFactor[band]*cRefDiv)/FBASE_DIVIDER); - - /* Calculates the offset respect to RF frequency and according to xtal_ppm parameter */ - FOffsetTmp = (int32_t)(((float)nXtalPpm*fBase)/PPM_FACTOR); - - /* Check the Offset is in the correct range */ - s_assert_param(IS_FREQUENCY_OFFSET(FOffsetTmp,s_lXtalFrequency)); - - /* Calculates the FC_OFFSET value to write in the corresponding register */ - xtalOffsetFactor = (int16_t)(((float)FOffsetTmp*FBASE_DIVIDER)/s_lXtalFrequency); - - /* Build the array related to the FC_OFFSET_1 and FC_OFFSET_0 register */ - tempArray[0]=(uint8_t)((((uint16_t)xtalOffsetFactor)>>8)&0x0F); - tempArray[1]=(uint8_t)(xtalOffsetFactor); - - /* Writes the FC_OFFSET registers */ - g_xStatus = SpiritSpiWriteRegisters(FC_OFFSET1_BASE, 2, tempArray); - -} - - -/** -* @brief Sets the FC OFFSET register starting from frequency offset expressed in Hz. -* @param lFOffset frequency offset expressed in Hz as signed word. -* @retval None. -*/ -void SpiritRadioSetFrequencyOffset(int32_t lFOffset) -{ - uint8_t tempArray[2]; - int16_t offset; - - /* Check that the Offset is in the correct range */ - s_assert_param(IS_FREQUENCY_OFFSET(lFOffset,s_lXtalFrequency)); - - /* Calculates the offset value to write in the FC_OFFSET register */ - offset = (int16_t)(((float)lFOffset*FBASE_DIVIDER)/s_lXtalFrequency); - - /* Build the array related to the FC_OFFSET_1 and FC_OFFSET_0 register */ - tempArray[0]=(uint8_t)((((uint16_t)offset)>>8)&0x0F); - tempArray[1]=(uint8_t)(offset); - - /* Writes the FC_OFFSET registers */ - g_xStatus = SpiritSpiWriteRegisters(FC_OFFSET1_BASE, 2, tempArray); - -} - - -/** -* @brief Returns the actual frequency offset. -* @param None. -* @retval int32_t Frequency offset expressed in Hz as signed word. -*/ -int32_t SpiritRadioGetFrequencyOffset(void) -{ - uint8_t tempArray[2]; - int16_t xtalOffsetFactor; - - /* Reads the FC_OFFSET registers */ - g_xStatus = SpiritSpiReadRegisters(FC_OFFSET1_BASE, 2, tempArray); - - /* Calculates the Offset Factor */ - uint16_t xtalOffTemp = ((((uint16_t)tempArray[0])<<8)+((uint16_t)tempArray[1])); - - if(xtalOffTemp & 0x0800) - { - xtalOffTemp = xtalOffTemp | 0xF000; - } - else - { - xtalOffTemp = xtalOffTemp & 0x0FFF; - } - - xtalOffsetFactor = *((int16_t*)(&xtalOffTemp)); - - /* Calculates the frequency offset and return it */ - return ((int32_t)(xtalOffsetFactor*s_lXtalFrequency)/FBASE_DIVIDER); - -} - - - -/** -* @brief Sets the Synth word and the Band Select register according to desired base carrier frequency. -* In this API the Xtal configuration is read out from -* the corresponding register. The user shall fix it before call this API. -* @param lFBase the base carrier frequency expressed in Hz as unsigned word. -* @retval Error code: 0=no error, 1=error during calibration of VCO. -*/ -uint8_t SpiritRadioSetFrequencyBase(uint32_t lFBase) -{ - uint32_t synthWord, Fc; - uint8_t band, anaRadioRegArray[4], wcp; - - /* Check the parameter */ - s_assert_param(IS_FREQUENCY_BAND(lFBase)); - - /* Search the operating band */ - if(IS_FREQUENCY_BAND_HIGH(lFBase)) - { - band = HIGH_BAND; - } - else if(IS_FREQUENCY_BAND_MIDDLE(lFBase)) - { - band = MIDDLE_BAND; - } - else if(IS_FREQUENCY_BAND_LOW(lFBase)) - { - band = LOW_BAND; - } - else - { - band = VERY_LOW_BAND; - } - - int32_t FOffset = SpiritRadioGetFrequencyOffset(); - uint32_t lChannelSpace = SpiritRadioGetChannelSpace(); - uint8_t cChannelNum = SpiritRadioGetChannel(); - - /* Calculates the channel center frequency */ - Fc = lFBase + FOffset + lChannelSpace*cChannelNum; - - /* Reads the reference divider */ - uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1; - - /* Selects the VCO */ - switch(band) - { - case VERY_LOW_BAND: - if(Fc<161281250) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case LOW_BAND: - if(Fc<322562500) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case MIDDLE_BAND: - if(Fc<430083334) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - break; - - case HIGH_BAND: - if(Fc<860166667) - { - SpiritCalibrationSelectVco(VCO_L); - } - else - { - SpiritCalibrationSelectVco(VCO_H); - } - } - - /* Search the VCO charge pump word and set the corresponding register */ - wcp = SpiritRadioSearchWCP(Fc); - - synthWord = (uint32_t)(lFBase*s_vectcBHalfFactor[band]*(((double)(FBASE_DIVIDER*cRefDiv))/s_lXtalFrequency)); - - /* Build the array of registers values for the analog part */ - anaRadioRegArray[0] = (uint8_t)(((synthWord>>21)&(0x0000001F))|(wcp<<5)); - anaRadioRegArray[1] = (uint8_t)((synthWord>>13)&(0x000000FF)); - anaRadioRegArray[2] = (uint8_t)((synthWord>>5)&(0x000000FF)); - anaRadioRegArray[3] = (uint8_t)(((synthWord&0x0000001F)<<3)| s_vectcBandRegValue[band]); - - /* Configures the needed Analog Radio registers */ - g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, anaRadioRegArray); - - if(xDoVcoCalibrationWA==S_ENABLE) - return SpiritManagementWaVcoCalibration(); - - return 0; -} - -/** -* @brief To say to the set frequency base if do or not the VCO calibration WA. -* @param S_ENABLE or S_DISABLE the WA procedure. -* @retval None. -*/ -void SpiritRadioVcoCalibrationWAFB(SpiritFunctionalState xNewstate) -{ - xDoVcoCalibrationWA=xNewstate; -} - -/** -* @brief Returns the base carrier frequency. -* @param None. -* @retval uint32_t Base carrier frequency expressed in Hz as unsigned word. -*/ -uint32_t SpiritRadioGetFrequencyBase(void) -{ - uint32_t synthWord; - BandSelect band; - - /* Reads the synth word */ - synthWord = SpiritRadioGetSynthWord(); - - /* Reads the operating band */ - band = SpiritRadioGetBand(); - - uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv() + 1; - - /* Calculates the frequency base and return it */ - return (uint32_t)round(synthWord*(((double)s_lXtalFrequency)/(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band]))); -} - - -/** -* @brief Returns the actual channel center frequency. -* @param None. -* @retval uint32_t Actual channel center frequency expressed in Hz. -*/ -uint32_t SpiritRadioGetCenterFrequency(void) -{ - int32_t offset; - uint8_t channel; - uint32_t fBase; - uint32_t channelSpace; - - /* Reads the frequency base */ - fBase = SpiritRadioGetFrequencyBase(); - - /* Reads the frequency offset */ - offset = SpiritRadioGetFrequencyOffset(); - - /* Reads the channel space */ - channelSpace = SpiritRadioGetChannelSpace(); - - /* Reads the channel number */ - channel = SpiritRadioGetChannel(); - - /* Calculates the channel center frequency and return it */ - return (uint32_t)(fBase + offset + (uint32_t)(channelSpace*channel)); - -} - - -/** -* @brief Returns the mantissa and exponent, whose value used in the datarate formula -* will give the datarate value closer to the given datarate. -* @param fDatarate datarate expressed in bps. This parameter ranging between 100 and 500000. -* @param pcM pointer to the returned mantissa value. -* @param pcE pointer to the returned exponent value. -* @retval None. -*/ -void SpiritRadioSearchDatarateME(uint32_t lDatarate, uint8_t* pcM, uint8_t* pcE) -{ - volatile SpiritBool find = S_FALSE; - int8_t i=15; - uint8_t cMantissaTmp; - uint8_t cDivider = 0; - - /* Check the parameters */ - s_assert_param(IS_DATARATE(lDatarate)); - - cDivider = (uint8_t)SpiritRadioGetDigDiv(); - - /* Search in the datarate array the exponent value */ - while(!find && i>=0) - { - if(lDatarate>=(s_lXtalFrequency>>(20-i+cDivider))) - { - find = S_TRUE; - } - else - { - i--; - } - } - i<0 ? i=0 : i; - *pcE = i; - - /* Calculates the mantissa value according to the datarate formula */ - cMantissaTmp = (lDatarate*((uint32_t)1<<(23-i)))/(s_lXtalFrequency>>(5+cDivider))-256; - - /* Finds the mantissa value with less approximation */ - int16_t mantissaCalculation[3]; - for(uint8_t j=0;j<3;j++) - { - if((cMantissaTmp+j-1)) - { - mantissaCalculation[j]=lDatarate-(((256+cMantissaTmp+j-1)*(s_lXtalFrequency>>(5+cDivider)))>>(23-i)); - } - else - { - mantissaCalculation[j]=0x7FFF; - } - } - uint16_t mantissaCalculationDelta = 0xFFFF; - for(uint8_t j=0;j<3;j++) - { - if(S_ABS(mantissaCalculation[j])<mantissaCalculationDelta) - { - mantissaCalculationDelta = S_ABS(mantissaCalculation[j]); - *pcM = cMantissaTmp+j-1; - } - } - -} - - -/** -* @brief Returns the mantissa and exponent for a given bandwidth. -* Even if it is possible to pass as parameter any value in the below mentioned range, -* the API will search the closer value according to a fixed table of channel -* bandwidth values (@ref s_vectnBandwidth), as defined in the datasheet, returning the corresponding mantissa -* and exponent value. -* @param lBandwidth bandwidth expressed in Hz. This parameter ranging between 1100 and 800100. -* @param pcM pointer to the returned mantissa value. -* @param pcE pointer to the returned exponent value. -* @retval None. -*/ -void SpiritRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t* pcM, uint8_t* pcE) -{ - int8_t i, i_tmp; - uint8_t cDivider = 1; - - /* Search in the channel filter bandwidth table the exponent value */ - if(SpiritRadioGetDigDiv()) - { - cDivider = 2; - } - else - { - cDivider = 1; - } - - s_assert_param(IS_CH_BW(lBandwidth,s_lXtalFrequency/cDivider)); - - uint32_t lChfltFactor = (s_lXtalFrequency/cDivider)/100; - - for(i=0;i<90 && (lBandwidth<(uint32_t)((s_vectnBandwidth26M[i]*lChfltFactor)/2600));i++); - - if(i!=0) - { - /* Finds the mantissa value with less approximation */ - i_tmp=i; - int16_t chfltCalculation[3]; - for(uint8_t j=0;j<3;j++) - { - if(((i_tmp+j-1)>=0) || ((i_tmp+j-1)<=89)) - { - chfltCalculation[j] = lBandwidth - (uint32_t)((s_vectnBandwidth26M[i_tmp+j-1]*lChfltFactor)/2600); - } - else - { - chfltCalculation[j] = 0x7FFF; - } - } - uint16_t chfltDelta = 0xFFFF; - - for(uint8_t j=0;j<3;j++) - { - if(S_ABS(chfltCalculation[j])<chfltDelta) - { - chfltDelta = S_ABS(chfltCalculation[j]); - i=i_tmp+j-1; - } - } - } - (*pcE) = (uint8_t)(i/9); - (*pcM) = (uint8_t)(i%9); - -} - -/** -* @brief Returns the mantissa and exponent, whose value used in the frequency deviation formula -* will give a frequency deviation value most closer to the given frequency deviation. -* @param fFDev frequency deviation expressed in Hz. This parameter can be a value in the range [F_Xo*8/2^18, F_Xo*7680/2^18]. -* @param pcM pointer to the returned mantissa value. -* @param pcE pointer to the returned exponent value. -* @retval None. -*/ -void SpiritRadioSearchFreqDevME(uint32_t lFDev, uint8_t* pcM, uint8_t* pcE) -{ - uint8_t i; - uint32_t a,bp,b=0; - float xtalDivtmp=(float)s_lXtalFrequency/(((uint32_t)1)<<18); - - /* Check the parameters */ - s_assert_param(IS_F_DEV(lFDev,s_lXtalFrequency)); - - for(i=0;i<10;i++) - { - a=(uint32_t)(xtalDivtmp*(uint32_t)(7.5*(1<<i))); - if(lFDev<a) - break; - } - (*pcE) = i; - - for(i=0;i<8;i++) - { - bp=b; - b=(uint32_t)(xtalDivtmp*(uint32_t)((8.0+i)/2*(1<<(*pcE)))); - if(lFDev<b) - break; - } - - (*pcM)=i; - if((lFDev-bp)<(b-lFDev)) - (*pcM)--; - -} - - -/** -* @brief Sets the datarate. -* @param fDatarate datarate expressed in bps. This value shall be in the range -* [100 500000]. -* @retval None. -*/ -void SpiritRadioSetDatarate(uint32_t lDatarate) -{ - uint8_t drE, tempRegValue[2]; - - /* Check the parameters */ - s_assert_param(IS_DATARATE(lDatarate)); - - /* Calculates the datarate mantissa and exponent */ - SpiritRadioSearchDatarateME(lDatarate, &tempRegValue[0], &drE); - - /* Reads the MOD_O register*/ - SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue[1]); - - /* Mask the other fields and set the datarate exponent */ - tempRegValue[1] &= 0xF0; - tempRegValue[1] |= drE; - - /* Writes the Datarate registers */ - g_xStatus = SpiritSpiWriteRegisters(MOD1_BASE, 2, tempRegValue); - -} - - -/** -* @brief Returns the datarate. -* @param None. -* @retval uint32_t Settled datarate expressed in bps. -*/ -uint32_t SpiritRadioGetDatarate(void) -{ - uint8_t tempRegValue[2]; - uint8_t cDivider=0; - - /* Reads the datarate registers for mantissa and exponent */ - g_xStatus = SpiritSpiReadRegisters(MOD1_BASE, 2, tempRegValue); - - /* Calculates the datarate */ - cDivider = (uint8_t)SpiritRadioGetDigDiv(); - - return (((s_lXtalFrequency>>(5+cDivider))*(256+tempRegValue[0]))>>(23-(tempRegValue[1]&0x0F))); -} - - -/** -* @brief Sets the frequency deviation. -* @param fFDev frequency deviation expressed in Hz. Be sure that this value -* is in the correct range [F_Xo*8/2^18, F_Xo*7680/2^18] Hz. -* @retval None. -*/ -void SpiritRadioSetFrequencyDev(uint32_t lFDev) -{ - uint8_t FDevM, FDevE, tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_F_DEV(lFDev, s_lXtalFrequency)); - - /* Calculates the frequency deviation mantissa and exponent */ - SpiritRadioSearchFreqDevME(lFDev, &FDevM, &FDevE); - - /* Reads the FDEV0 register */ - SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue); - - /* Mask the other fields and set the frequency deviation mantissa and exponent */ - tempRegValue &= 0x08; - tempRegValue |= ((FDevE<<4)|(FDevM)); - - /* Writes the Frequency deviation register */ - g_xStatus = SpiritSpiWriteRegisters(FDEV0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the frequency deviation. -* @param None. -* @retval uint32_t Frequency deviation value expressed in Hz. -* This value will be in the range [F_Xo*8/2^18, F_Xo*7680/2^18] Hz. -*/ -uint32_t SpiritRadioGetFrequencyDev(void) -{ - uint8_t tempRegValue, FDevM, FDevE; - - - /* Reads the frequency deviation register for mantissa and exponent */ - g_xStatus = SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue); - FDevM = tempRegValue&0x07; - FDevE = (tempRegValue&0xF0)>>4; - - /* Calculates the frequency deviation and return it */ - //return (((s_lXtalFrequency>>6)*(8+FDevM))>>(13-FDevE)); - - return (uint32_t)((float)s_lXtalFrequency/(((uint32_t)1)<<18)*(uint32_t)((8.0+FDevM)/2*(1<<FDevE))); - -} - - -/** -* @brief Sets the channel filter bandwidth. -* @param lBandwidth channel filter bandwidth expressed in Hz. This parameter shall be in the range [1100 800100] -* Even if it is possible to pass as parameter any value in the above mentioned range, -* the API will search the most closer value according to a fixed table of channel -* bandwidth values (@ref s_vectnBandwidth), as defined in the datasheet. To verify the settled channel bandwidth -* it is possible to use the SpiritRadioGetChannelBW() API. -* @retval None. -*/ -void SpiritRadioSetChannelBW(uint32_t lBandwidth) -{ - uint8_t bwM, bwE, tempRegValue; - - /* Search in the channel filter bandwidth table the exponent value */ - if(SpiritRadioGetDigDiv()) - { - s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency/2))); - } - else - { - s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency))); - } - - /* Calculates the channel bandwidth mantissa and exponent */ - SpiritRadioSearchChannelBwME(lBandwidth, &bwM, &bwE); - tempRegValue = (bwM<<4)|(bwE); - - /* Writes the Channel filter register */ - g_xStatus = SpiritSpiWriteRegisters(CHFLT_BASE, 1, &tempRegValue); - -} - -/** -* @brief Returns the channel filter bandwidth. -* @param None. -* @retval uint32_t Channel filter bandwidth expressed in Hz. -*/ -uint32_t SpiritRadioGetChannelBW(void) -{ - uint8_t tempRegValue, bwM, bwE; - - /* Reads the channel filter register for mantissa and exponent */ - g_xStatus = SpiritSpiReadRegisters(CHFLT_BASE, 1, &tempRegValue); - bwM = (tempRegValue&0xF0)>>4; - bwE = tempRegValue&0x0F; - - /* Reads the channel filter bandwidth from the look-up table and return it */ - return (uint32_t)(100.0*s_vectnBandwidth26M[bwM+(bwE*9)]*s_lXtalFrequency/26e6); - -} - - -/** -* @brief Sets the modulation type. -* @param xModulation modulation to set. -* This parameter shall be of type @ref ModulationSelect . -* @retval None. -*/ -void SpiritRadioSetModulation(ModulationSelect xModulation) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_MODULATION_SELECTED(xModulation)); - - /* Reads the modulation register */ - SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue); - - /* Mask the other fields and set the modulation type */ - tempRegValue &=0x8F; - tempRegValue |= xModulation; - - /* Writes the modulation register */ - g_xStatus = SpiritSpiWriteRegisters(MOD0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the modulation type used. -* @param None. -* @retval ModulationSelect Settled modulation type. -*/ -ModulationSelect SpiritRadioGetModulation(void) -{ - uint8_t tempRegValue; - - /* Reads the modulation register MOD0*/ - g_xStatus = SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue); - - /* Return the modulation type */ - return (ModulationSelect)(tempRegValue&0x70); - -} - - -/** -* @brief Enables or Disables the Continuous Wave transmit mode. -* @param xNewState new state for power ramping. -* This parameter can be: S_ENABLE or S_DISABLE . -* @retval None. -*/ -void SpiritRadioCWTransmitMode(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the modulation register MOD0 and mask the CW field */ - SpiritSpiReadRegisters(MOD0_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |=MOD0_CW; - } - else - { - tempRegValue &= (~MOD0_CW); - } - - /* Writes the new value in the MOD0 register */ - g_xStatus = SpiritSpiWriteRegisters(MOD0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Sets the OOK Peak Decay. -* @param xOokDecay Peak decay control for OOK. -* This parameter shall be of type @ref OokPeakDecay . -* @retval None. -*/ -void SpiritRadioSetOokPeakDecay(OokPeakDecay xOokDecay) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_OOK_PEAK_DECAY(xOokDecay)); - - /* Reads the RSSI_FLT register */ - SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Mask the other fields and set OOK Peak Decay */ - tempRegValue &= 0xFC; - tempRegValue |= xOokDecay; - - /* Writes the RSSI_FLT register to set the new OOK peak dacay value */ - g_xStatus = SpiritSpiWriteRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the OOK Peak Decay. -* @param None -* @retval OokPeakDecay Ook peak decay value. -*/ -OokPeakDecay SpiritRadioGetOokPeakDecay(void) -{ - uint8_t tempRegValue; - - /* Reads the OOK peak decay register RSSI_FLT_BASE*/ - g_xStatus = SpiritSpiReadRegisters(RSSI_FLT_BASE, 1, &tempRegValue); - - /* Returns the OOK peak decay */ - return (OokPeakDecay) (tempRegValue & 0x03); - -} - -/** -* @brief Returns the PA register value that corresponds to the passed dBm power. -* @param lFbase Frequency base expressed in Hz. -* @param fPowerdBm Desired power in dBm. -* @retval Register value as byte. -* @note The power interpolation curves used by this function have been extracted -* by measurements done on the divisional evaluation boards. -*/ -uint8_t SpiritRadioGetdBm2Reg(uint32_t lFBase, float fPowerdBm) -{ - uint8_t i=0; - uint8_t j=0; - float fReg; - - if(IS_FREQUENCY_BAND_HIGH(lFBase)) - { - i=0; - if(lFBase<900000000) i=1;// 868 - } - else if(IS_FREQUENCY_BAND_MIDDLE(lFBase)) - { - i=2; - } - else if(IS_FREQUENCY_BAND_LOW(lFBase)) - { - i=3; - } - else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase)) - { - i=4; - } - - j=1; - if(fPowerdBm>0 && 13.0/fPowerFactors[i][2]-fPowerFactors[i][3]/fPowerFactors[i][2]<fPowerdBm) - j=0; - else if(fPowerdBm<=0 && 40.0/fPowerFactors[i][2]-fPowerFactors[i][3]/fPowerFactors[i][2]>fPowerdBm) - j=2; - - fReg=fPowerFactors[i][2*j]*fPowerdBm+fPowerFactors[i][2*j+1]; - - if(fReg<1) - fReg=1; - else if(fReg>90) - fReg=90; - - return ((uint8_t)fReg); -} - - -/** -* @brief Returns the dBm power that corresponds to the value of PA register. -* @param lFbase Frequency base expressed in Hz. -* @param cPowerReg Register value of the PA. -* @retval Power in dBm as float. -* @note The power interpolation curves used by this function have been extracted -* by measurements done on the divisional evaluation boards. -*/ -float SpiritRadioGetReg2dBm(uint32_t lFBase, uint8_t cPowerReg) -{ - uint8_t i=0; - uint8_t j=0; - float fPower; - - if(cPowerReg==0 || cPowerReg>90) - return (-130.0); - - if(IS_FREQUENCY_BAND_HIGH(lFBase)) - { - i=0; - if(lFBase<900000000) i=1;// 868 - } - else if(IS_FREQUENCY_BAND_MIDDLE(lFBase)) - { - i=2; - } - else if(IS_FREQUENCY_BAND_LOW(lFBase)) - { - i=3; - } - else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase)) - { - i=4; - } - - j=1; - if(cPowerReg<13) j=0; - else if(cPowerReg>40) j=2; - - fPower=(((float)cPowerReg)/fPowerFactors[i][2*j]-fPowerFactors[i][2*j+1]/fPowerFactors[i][2*j]); - - return fPower; -} - -/** -* @brief Configures the Power Amplifier Table and registers with value expressed in dBm. -* @param cPALevelMaxIndex number of levels to set. This parameter shall be in the range [0:7]. -* @param cWidth step width expressed in terms of bit period units Tb/8. -* This parameter shall be in the range [1:4]. -* @param xCLoad one of the possible value of the enum type PALoadCapacitor. -* @arg LOAD_0_PF No additional PA load capacitor -* @arg LOAD_1_2_PF 1.2pF additional PA load capacitor -* @arg LOAD_2_4_PF 2.4pF additional PA load capacitor -* @arg LOAD_3_6_PF 3.6pF additional PA load capacitor -* @param pfPAtabledBm pointer to an array of PA values in dbm between [-PA_LOWER_LIMIT: PA_UPPER_LIMIT] dbm. -* The first element shall be the lower level (PA_LEVEL[0]) value and the last element -* the higher level one (PA_LEVEL[paLevelMaxIndex]). -* @retval None. -*/ -void SpiritRadioSetPATabledBm(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, float* pfPAtabledBm) -{ - uint8_t palevel[9], address, paLevelValue; - uint32_t lFBase=SpiritRadioGetFrequencyBase(); - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cPALevelMaxIndex)); - s_assert_param(IS_PA_STEP_WIDTH(cWidth)); - s_assert_param(IS_PA_LOAD_CAP(xCLoad)); - - /* Check the PA level in dBm is in the range and calculate the PA_LEVEL value - to write in the corresponding register using the linearization formula */ - for(int i=0; i<=cPALevelMaxIndex; i++) - { - s_assert_param(IS_PAPOWER_DBM(*pfPAtabledBm)); - paLevelValue=SpiritRadioGetdBm2Reg(lFBase,(*pfPAtabledBm)); - palevel[cPALevelMaxIndex-i]=paLevelValue; - pfPAtabledBm++; - } - - /* Sets the PA_POWER[0] register */ - palevel[cPALevelMaxIndex+1]=xCLoad|(cWidth-1)<<3|cPALevelMaxIndex; - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cPALevelMaxIndex; - - /* Configures the PA_POWER registers */ - g_xStatus = SpiritSpiWriteRegisters(address, cPALevelMaxIndex+2, palevel); - -} - - -/** -* @brief Returns the Power Amplifier Table and registers, returning values in dBm. -* @param pcPALevelMaxIndex pointer to the number of levels settled. -* This parameter will be in the range [0:7]. -* @param pfPAtabledBm pointer to an array of 8 elements containing the PA value in dbm. -* The first element will be the PA_LEVEL_0 and the last element -* will be PA_LEVEL_7. Any value higher than PA_UPPER_LIMIT implies no output -* power (output stage is in high impedance). -* @retval None. -*/ -void SpiritRadioGetPATabledBm(uint8_t* pcPALevelMaxIndex, float* pfPAtabledBm) -{ - uint8_t palevelvect[9]; - uint32_t lFBase=SpiritRadioGetFrequencyBase(); - - /* Reads the PA_LEVEL_x registers and the PA_POWER_0 register */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER8_BASE, 9, palevelvect); - - /* Fill the PAtable */ - for(int i=7; i>=0; i--) - { - (*pfPAtabledBm)=SpiritRadioGetReg2dBm(lFBase,palevelvect[i]); - pfPAtabledBm++; - } - - /* Return the settled index */ - *pcPALevelMaxIndex = palevelvect[8]&0x07; - -} - - - - - - -/** -* @brief Sets a specific PA_LEVEL register, with a value given in dBm. -* @param cIndex PA_LEVEL to set. This parameter shall be in the range [0:7]. -* @param fPowerdBm PA value to write expressed in dBm . Be sure that this values is in the -* correct range [-PA_LOWER_LIMIT: PA_UPPER_LIMIT] dBm. -* @retval None. -* @note This function makes use of the @ref SpiritRadioGetdBm2Reg fcn to interpolate the -* power value. -*/ -void SpiritRadioSetPALeveldBm(uint8_t cIndex, float fPowerdBm) -{ - uint8_t address, paLevelValue; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cIndex)); - s_assert_param(IS_PAPOWER_DBM(fPowerdBm)); - - /* interpolate the power level */ - paLevelValue=SpiritRadioGetdBm2Reg(SpiritRadioGetFrequencyBase(),fPowerdBm); - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cIndex; - - /* Configures the PA_LEVEL register */ - g_xStatus = SpiritSpiWriteRegisters(address, 1, &paLevelValue); - -} - - -/** -* @brief Returns a specific PA_LEVEL register, returning a value in dBm. -* @param cIndex PA_LEVEL to read. This parameter shall be in the range [0:7] -* @retval float Settled power level expressed in dBm. A value -* higher than PA_UPPER_LIMIT dBm implies no output power -* (output stage is in high impedance). -* @note This function makes use of the @ref SpiritRadioGetReg2dBm fcn to interpolate the -* power value. -*/ -float SpiritRadioGetPALeveldBm(uint8_t cIndex) -{ - uint8_t address, paLevelValue; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cIndex)); - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cIndex; - - /* Reads the PA_LEVEL[cIndex] register */ - g_xStatus = SpiritSpiReadRegisters(address, 1, &paLevelValue); - - return SpiritRadioGetReg2dBm(SpiritRadioGetFrequencyBase(),paLevelValue); -} - - -/** -* @brief Configures the Power Amplifier Table and registers. -* @param cPALevelMaxIndex number of levels to set. This parameter shall be in the range [0:7]. -* @param cWidth step width expressed in terms of bit period units Tb/8. -* This parameter shall be in the range [1:4]. -* @param xCLoad one of the possible value of the enum type PALoadCapacitor. -* @arg LOAD_0_PF No additional PA load capacitor -* @arg LOAD_1_2_PF 1.2pF additional PA load capacitor -* @arg LOAD_2_4_PF 2.4pF additional PA load capacitor -* @arg LOAD_3_6_PF 3.6pF additional PA load capacitor -* @param pcPAtable pointer to an array of PA values in the range [0: 90], where 0 implies no -* output power, 1 will be the maximum level and 90 the minimum one -* The first element shall be the lower level (PA_LEVEL[0]) value and the last element -* the higher level one (PA_LEVEL[paLevelMaxIndex]). -* @retval None. -*/ -void SpiritRadioSetPATable(uint8_t cPALevelMaxIndex, uint8_t cWidth, PALoadCapacitor xCLoad, uint8_t* pcPAtable) -{ - uint8_t palevel[9], address; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cPALevelMaxIndex)); - s_assert_param(IS_PA_STEP_WIDTH(cWidth)); - s_assert_param(IS_PA_LOAD_CAP(xCLoad)); - - /* Check the PA levels are in the range */ - for(int i=0; i<=cPALevelMaxIndex; i++) - { - s_assert_param(IS_PAPOWER(*pcPAtable)); - palevel[cPALevelMaxIndex-i]=*pcPAtable; - pcPAtable++; - } - - /* Sets the PA_POWER[0] register */ - palevel[cPALevelMaxIndex+1]=xCLoad|((cWidth-1)<<3)|cPALevelMaxIndex; - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cPALevelMaxIndex; - - /* Configures the PA_POWER registers */ - g_xStatus = SpiritSpiWriteRegisters(address, cPALevelMaxIndex+2, palevel); - -} - - -/** -* @brief Returns the Power Amplifier Table and registers. -* @param pcPALevelMaxIndex pointer to the number of levels settled. -* This parameter shall be in the range [0:7]. -* @param pcPAtable pointer to an array of 8 elements containing the PA value. -* The first element will be the PA_LEVEL_0 and the last element -* will be PA_LEVEL_7. Any value equals to 0 implies that level has -* no output power (output stage is in high impedance). -* @retval None -*/ -void SpiritRadioGetPATable(uint8_t* pcPALevelMaxIndex, uint8_t* pcPAtable) -{ - uint8_t palevelvect[9]; - - /* Reads the PA_LEVEL_x registers and the PA_POWER_0 register */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER8_BASE, 9, palevelvect); - - /* Fill the PAtable */ - for(int i=7; i>=0; i--) - { - *pcPAtable = palevelvect[i]; - pcPAtable++; - } - - /* Return the settled index */ - *pcPALevelMaxIndex = palevelvect[8]&0x07; - -} - - -/** -* @brief Sets a specific PA_LEVEL register. -* @param cIndex PA_LEVEL to set. This parameter shall be in the range [0:7]. -* @param cPower PA value to write in the register. Be sure that this values is in the -* correct range [0 : 90]. -* @retval None. -*/ -void SpiritRadioSetPALevel(uint8_t cIndex, uint8_t cPower) -{ - uint8_t address; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cIndex)); - s_assert_param(IS_PAPOWER(cPower)); - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cIndex; - - /* Configures the PA_LEVEL register */ - g_xStatus = SpiritSpiWriteRegisters(address, 1, &cPower); - -} - - -/** -* @brief Returns a specific PA_LEVEL register. -* @param cIndex PA_LEVEL to read. This parameter shall be in the range [0:7]. -* @retval uint8_t PA_LEVEL value. A value equal to zero -* implies no output power (output stage is in high impedance). -*/ -uint8_t SpiritRadioGetPALevel(uint8_t cIndex) -{ - uint8_t address, tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cIndex)); - - /* Sets the base address */ - address=PA_POWER8_BASE+7-cIndex; - - /* Reads the PA_LEVEL[cIndex] register and return the value */ - g_xStatus = SpiritSpiReadRegisters(address, 1, &tempRegValue); - return tempRegValue; - -} - - -/** -* @brief Sets the output stage additional load capacitor bank. -* @param xCLoad one of the possible value of the enum type PALoadCapacitor. -* @arg LOAD_0_PF No additional PA load capacitor -* @arg LOAD_1_2_PF 1.2pF additional PA load capacitor -* @arg LOAD_2_4_PF 2.4pF additional PA load capacitor -* @arg LOAD_3_6_PF 3.6pF additional PA load capacitor -* @retval None. -*/ -void SpiritRadioSetPACwc(PALoadCapacitor xCLoad) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PA_LOAD_CAP(xCLoad)); - - /* Reads the PA_POWER_0 register */ - SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the CWC[1:0] field and write the new value */ - tempRegValue &= 0x3F; - tempRegValue |= xCLoad; - - /* Configures the PA_POWER_0 register */ - g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the output stage additional load capacitor bank. -* @param None. -* @retval PALoadCapacitor Output stage additional load capacitor bank. -* This parameter can be: -* @arg LOAD_0_PF No additional PA load capacitor -* @arg LOAD_1_2_PF 1.2pF additional PA load capacitor -* @arg LOAD_2_4_PF 2.4pF additional PA load capacitor -* @arg LOAD_3_6_PF 3.6pF additional PA load capacitor -*/ -PALoadCapacitor SpiritRadioGetPACwc(void) -{ - uint8_t tempRegValue; - - /* Reads the PA_POWER_0 register */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the CWC[1:0] field and return the value*/ - return (PALoadCapacitor)(tempRegValue & 0xC0); - -} - - -/** -* @brief Sets a specific PA_LEVEL_MAX_INDEX. -* @param cIndex PA_LEVEL_MAX_INDEX to set. This parameter shall be in the range [0:7]. -* @retval None -*/ -void SpiritRadioSetPALevelMaxIndex(uint8_t cIndex) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PA_MAX_INDEX(cIndex)); - - /* Reads the PA_POWER_0 register */ - SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the PA_LEVEL_MAX_INDEX[1:0] field and write the new value */ - tempRegValue &= 0xF8; - tempRegValue |= cIndex; - - /* Configures the PA_POWER_0 register */ - g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the actual PA_LEVEL_MAX_INDEX. -* @param None. -* @retval uint8_t Actual PA_LEVEL_MAX_INDEX. This parameter will be in the range [0:7]. -*/ -uint8_t SpiritRadioGetPALevelMaxIndex(void) -{ - uint8_t tempRegValue; - - /* Reads the PA_POWER_0 register */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the PA_LEVEL_MAX_INDEX[1:0] field and return the value */ - return (tempRegValue & 0x07); - -} - - -/** -* @brief Sets a specific PA_RAMP_STEP_WIDTH. -* @param cWidth step width expressed in terms of bit period units Tb/8. -* This parameter shall be in the range [1:4]. -* @retval None. -*/ -void SpiritRadioSetPAStepWidth(uint8_t cWidth) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_PA_STEP_WIDTH(cWidth)); - - /* Reads the PA_POWER_0 register */ - SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the PA_RAMP_STEP_WIDTH[1:0] field and write the new value */ - tempRegValue &= 0xE7; - tempRegValue |= (cWidth-1)<<3; - - /* Configures the PA_POWER_0 register */ - g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the actual PA_RAMP_STEP_WIDTH. -* @param None. -* @retval uint8_t Step width value expressed in terms of bit period units Tb/8. -* This parameter will be in the range [1:4]. -*/ -uint8_t SpiritRadioGetPAStepWidth(void) -{ - uint8_t tempRegValue; - - /* Reads the PA_POWER_0 register */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask the PA_RAMP_STEP_WIDTH[1:0] field and return the value */ - tempRegValue &= 0x18; - return ((tempRegValue>>3)+1); - -} - - -/** -* @brief Enables or Disables the Power Ramping. -* @param xNewState new state for power ramping. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioPARamping(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PA_POWER_0 register and configure the PA_RAMP_ENABLE field */ - SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= PA_POWER0_PA_RAMP_MASK; - } - else - { - tempRegValue &= (~PA_POWER0_PA_RAMP_MASK); - } - - /* Sets the PA_POWER_0 register */ - g_xStatus = SpiritSpiWriteRegisters(PA_POWER0_BASE, 1, &tempRegValue); - -} - -/** -* @brief Returns the Power Ramping enable bit. -* @param xNewState new state for power ramping. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -SpiritFunctionalState SpiritRadioGetPARamping(void) -{ - uint8_t tempRegValue; - - /* Reads the PA_POWER_0 register and configure the PA_RAMP_ENABLE field */ - g_xStatus = SpiritSpiReadRegisters(PA_POWER0_BASE, 1, &tempRegValue); - - /* Mask and return data */ - return (SpiritFunctionalState)((tempRegValue>>5) & 0x01); - -} - - -/** -* @brief Enables or Disables the AFC. -* @param xNewState new state for AFC. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioAFC(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AFC_2 register and configure the AFC Enabled field */ - SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AFC2_AFC_MASK; - } - else - { - tempRegValue &= (~AFC2_AFC_MASK); - } - - /* Sets the AFC_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Enables or Disables the AFC freeze on sync word detection. -* @param xNewState new state for AFC freeze on sync word detection. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioAFCFreezeOnSync(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AFC_2 register and configure the AFC Freeze on Sync field */ - SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AFC2_AFC_FREEZE_ON_SYNC_MASK; - } - else - { - tempRegValue &= (~AFC2_AFC_FREEZE_ON_SYNC_MASK); - } - - /* Sets the AFC_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Sets the AFC working mode. -* @param xMode the AFC mode. This parameter can be one of the values defined in @ref AFCMode : -* @arg AFC_SLICER_CORRECTION AFC loop closed on slicer -* @arg AFC_2ND_IF_CORRECTION AFC loop closed on 2nd conversion stage -* @retval None. -*/ -void SpiritRadioSetAFCMode(AFCMode xMode) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_AFC_MODE(xMode)); - - /* Reads the AFC_2 register and configure the AFC Mode field */ - SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - if(xMode == AFC_2ND_IF_CORRECTION) - { - tempRegValue |= AFC_2ND_IF_CORRECTION; - } - else - { - tempRegValue &= (~AFC_2ND_IF_CORRECTION); - } - - /* Sets the AFC_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AFC working mode. -* @param None. -* @retval AFCMode Settled AFC mode. This parameter will be one of the values defined in @ref AFCMode : -* @arg AFC_SLICER_CORRECTION AFC loop closed on slicer -* @arg AFC_2ND_IF_CORRECTION AFC loop closed on 2nd conversion stage -*/ -AFCMode SpiritRadioGetAFCMode(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC_2 register */ - g_xStatus = SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - - /* Mask the AFC Mode field and returns the value */ - return (AFCMode)(tempRegValue & 0x20); - -} - - -/** -* @brief Sets the AFC peak detector leakage. -* @param cLeakage the peak detector leakage. This parameter shall be in the range: -* [0:31]. -* @retval None. -*/ -void SpiritRadioSetAFCPDLeakage(uint8_t cLeakage) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_AFC_PD_LEAKAGE(cLeakage)); - - /* Reads the AFC_2 register and configure the AFC PD leakage field */ - SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - tempRegValue &= 0xE0; - tempRegValue |= cLeakage; - - /* Sets the AFC_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AFC peak detector leakage. -* @param None. -* @retval uint8_t Peak detector leakage value. This parameter will be in the range: -* [0:31]. -*/ -uint8_t SpiritRadioGetAFCPDLeakage(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC_2 register */ - g_xStatus = SpiritSpiReadRegisters(AFC2_BASE, 1, &tempRegValue); - - /* Mask the AFC PD leakage field and return the value */ - return (tempRegValue & 0x1F); - -} - - -/** -* @brief Sets the length of the AFC fast period expressed as number of samples. -* @param cLength length of the fast period in number of samples. -* @retval None. -*/ -void SpiritRadioSetAFCFastPeriod(uint8_t cLength) -{ - /* Sets the AFC_1 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC1_BASE, 1, &cLength); - -} - - -/** -* @brief Returns the AFC fast period expressed as number of samples. -* @param None. -* @retval uint8_t Length of the fast period in number of samples. -*/ -uint8_t SpiritRadioGetAFCFastPeriod(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC 1 register and return the value */ - g_xStatus = SpiritSpiReadRegisters(AFC1_BASE, 1, &tempRegValue); - - return tempRegValue; - -} - - -/** -* @brief Sets the AFC loop gain in fast mode. -* @param cGain AFC loop gain in fast mode. This parameter shall be in the range: -* [0:15]. -* @retval None. -*/ -void SpiritRadioSetAFCFastGain(uint8_t cGain) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_AFC_FAST_GAIN(cGain)); - - /* Reads the AFC_0 register and configure the AFC Fast Gain field */ - SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue); - tempRegValue &= 0x0F; - tempRegValue |= cGain<<4; - - /* Sets the AFC_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AFC loop gain in fast mode. -* @param None. -* @retval uint8_t AFC loop gain in fast mode. This parameter will be in the range: -* [0:15]. -*/ -uint8_t SpiritRadioGetAFCFastGain(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC_0 register, mask the AFC Fast Gain field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue); - - return ((tempRegValue & 0xF0)>>4); - -} - - -/** -* @brief Sets the AFC loop gain in slow mode. -* @param cGain AFC loop gain in slow mode. This parameter shall be in the range: -* [0:15]. -* @retval None. -*/ -void SpiritRadioSetAFCSlowGain(uint8_t cGain) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_AFC_SLOW_GAIN(cGain)); - - /* Reads the AFC_0 register and configure the AFC Slow Gain field */ - SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue); - tempRegValue &= 0xF0; - tempRegValue |= cGain; - - /* Sets the AFC_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AFC0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AFC loop gain in slow mode. -* @param None. -* @retval uint8_t AFC loop gain in slow mode. This parameter will be in the range: -* [0:15]. -*/ -uint8_t SpiritRadioGetAFCSlowGain(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC_0 register, mask the AFC Slow Gain field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AFC0_BASE, 1, &tempRegValue); - - return (tempRegValue & 0x0F); - -} - - -/** -* @brief Returns the AFC correction from the corresponding register. -* @param None. -* @retval int8_t AFC correction, read from the corresponding register. -* This parameter will be in the range [-128:127]. -*/ -int8_t SpiritRadioGetAFCCorrectionReg(void) -{ - uint8_t tempRegValue; - - /* Reads the AFC_CORR register, cast the read value as signed char and return it */ - g_xStatus = SpiritSpiReadRegisters(AFC_CORR_BASE, 1, &tempRegValue); - - return (int8_t)tempRegValue; - -} - - -/** -* @brief Returns the AFC correction expressed in Hz. -* @param None. -* @retval int32_t AFC correction expressed in Hz -* according to the following formula:<ul> -* <li> Fafc[Hz]= (Fdig/(12*2^10))*AFC_CORR where </li> -* <li> AFC_CORR is the value read in the AFC_CORR register </li> </ul> -*/ -int32_t SpiritRadioGetAFCCorrectionHz(void) -{ - int8_t correction; - uint32_t xtal = s_lXtalFrequency; - - /* Reads the AFC correction register */ - correction = SpiritRadioGetAFCCorrectionReg(); - - if(xtal>DOUBLE_XTAL_THR) - { - xtal /= 2; - } - - /* Calculates and return the Frequency Correction */ - return (int32_t)(xtal/(12*pow(2,10))*correction); - -} - - -/** -* @brief Enables or Disables the AGC. -* @param xNewState new state for AGC. -* This parameter can be: S_ENABLE or S_DISABLE -* @retval None. -*/ -void SpiritRadioAGC(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AGCCTRL_0 register and configure the AGC Enabled field */ - SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AGCCTRL0_AGC_MASK; - } - else - { - tempRegValue &= (~AGCCTRL0_AGC_MASK); - } - - /* Sets the AGCCTRL_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Sets the AGC working mode. -* @param xMode the AGC mode. This parameter can be one of the values defined in @ref AGCMode : -* @arg AGC_LINEAR_MODE AGC works in linear mode -* @arg AGC_BINARY_MODE AGC works in binary mode -* @retval None. -*/ -void SpiritRadioSetAGCMode(AGCMode xMode) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_AGC_MODE(xMode)); - - /* Reads the AGCCTRL_0 register and configure the AGC Mode field */ - SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - if(xMode == AGC_BINARY_MODE) - { - tempRegValue |= AGC_BINARY_MODE; - } - else - { - tempRegValue &= (~AGC_BINARY_MODE); - } - - /* Sets the AGCCTRL_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC working mode. -* @param None. -* @retval AGCMode Settled AGC mode. This parameter can be one of the values defined in @ref AGCMode : -* @arg AGC_LINEAR_MODE AGC works in linear mode -* @arg AGC_BINARY_MODE AGC works in binary mode -*/ -AGCMode SpiritRadioGetAGCMode(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_0 register, mask the AGC Mode field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - - return (AGCMode)(tempRegValue & 0x40); - -} - - -/** -* @brief Enables or Disables the AGC freeze on steady state. -* @param xNewState new state for AGC freeze on steady state. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioAGCFreezeOnSteady(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AGCCTRL_2 register and configure the AGC Freeze On Steady field */ - SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AGCCTRL2_FREEZE_ON_STEADY_MASK; - } - else - { - tempRegValue &= (~AGCCTRL2_FREEZE_ON_STEADY_MASK); - } - - /* Sets the AGCCTRL_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Enable or Disable the AGC freeze on sync detection. -* @param xNewState new state for AGC freeze on sync detection. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioAGCFreezeOnSync(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AGCCTRL_2 register and configure the AGC Freeze On Sync field */ - SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AGCCTRL2_FREEZE_ON_SYNC_MASK; - } - else - { - tempRegValue &= (~AGCCTRL2_FREEZE_ON_SYNC_MASK); - } - - /* Sets the AGCCTRL_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Enable or Disable the AGC to start with max attenuation. -* @param xNewState new state for AGC start with max attenuation mode. -* This parameter can be: S_ENABLE or S_DISABLE. -* @retval None. -*/ -void SpiritRadioAGCStartMaxAttenuation(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue = 0x00; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the AGCCTRL_2 register and configure the AGC Start Max Attenuation field */ - SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - if(xNewState == S_ENABLE) - { - tempRegValue |= AGCCTRL2_START_MAX_ATTENUATION_MASK; - } - else - { - tempRegValue &= (~AGCCTRL2_START_MAX_ATTENUATION_MASK); - } - - /* Sets the AGCCTRL_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Sets the AGC measure time. -* @param nTime AGC measure time expressed in us. This parameter shall be in the range [0, 393216/F_Xo]. -* @retval None. -*/ -void SpiritRadioSetAGCMeasureTimeUs(uint16_t nTime) -{ - uint8_t tempRegValue, measure; - - /* Check the parameter */ - s_assert_param(IS_AGC_MEASURE_TIME_US(nTime,s_lXtalFrequency)); - - /* Reads the AGCCTRL_2 register */ - SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - - /* Calculates the measure time value to write in the register */ - measure = (uint8_t)lroundf(log2((float)nTime/1e6 * s_lXtalFrequency/12)); - (measure>15) ? (measure=15):(measure); - - /* Mask the MEAS_TIME field and write the new value */ - tempRegValue &= 0xF0; - tempRegValue |= measure; - - /* Sets the AGCCTRL_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC measure time. -* @param None. -* @retval uint16_t AGC measure time expressed in us. This parameter will be in the range [0, 393216/F_Xo]. -*/ -uint16_t SpiritRadioGetAGCMeasureTimeUs(void) -{ - uint8_t measure; - - /* Reads the AGCCTRL_2 register */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &measure); - - /* Mask the MEAS_TIME field */ - measure &= 0x0F; - - /* Calculates the measure time value to write in the register */ - return (uint16_t)((12.0/s_lXtalFrequency)*(float)pow(2,measure)*1e6); - -} - - -/** -* @brief Sets the AGC measure time. -* @param cTime AGC measure time to write in the MEAS_TIME field of AGCCTRL_2 register. -* This parameter shall be in the range [0:15]. -* @retval None. -*/ -void SpiritRadioSetAGCMeasureTime(uint8_t cTime) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_AGC_MEASURE_TIME(cTime)); - - /* Reads the AGCCTRL_2 register */ - SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - - /* Mask the MEAS_TIME field and write the new value */ - tempRegValue &= 0xF0; - tempRegValue |= cTime; - - /* Sets the AGCCTRL_2 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC measure time. -* @param None. -* @retval uint8_t AGC measure time read from the MEAS_TIME field of AGCCTRL_2 register. -* This parameter will be in the range [0:15]. -*/ -uint8_t SpiritRadioGetAGCMeasureTime(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_2 register, mask the MEAS_TIME field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL2_BASE, 1, &tempRegValue); - - return (tempRegValue & 0x0F); - -} - - -/** -* @brief Sets the AGC hold time. -* @param cTime AGC hold time expressed in us. This parameter shall be in the range[0, 756/F_Xo]. -* @retval None. -*/ -void SpiritRadioSetAGCHoldTimeUs(uint8_t cTime) -{ - uint8_t tempRegValue, hold; - - /* Check the parameter */ - s_assert_param(IS_AGC_HOLD_TIME_US(cTime,s_lXtalFrequency)); - - /* Reads the AGCCTRL_0 register */ - SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - - /* Calculates the hold time value to write in the register */ - hold = (uint8_t)lroundf(((float)cTime/1e6 * s_lXtalFrequency)/12); - (hold>63) ? (hold=63):(hold); - - /* Mask the HOLD_TIME field and write the new value */ - tempRegValue &= 0xC0; - tempRegValue |= hold; - - /* Sets the AGCCTRL_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC hold time. -* @param None. -* @retval uint8_t AGC hold time expressed in us. This parameter will be in the range: -* [0, 756/F_Xo]. -*/ -uint8_t SpiritRadioGetAGCHoldTimeUs(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_0 register */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - - /* Mask the HOLD_TIME field */ - tempRegValue &= 0x3F; - - /* Calculates the hold time value and return it */ - return (uint8_t)lroundf ((12.0/s_lXtalFrequency)*(tempRegValue*1e6)); - -} - - -/** -* @brief Sets the AGC hold time. -* @param cTime AGC hold time to write in the HOLD_TIME field of AGCCTRL_0 register. -* This parameter shall be in the range [0:63]. -* @retval None. -*/ -void SpiritRadioSetAGCHoldTime(uint8_t cTime) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_AGC_HOLD_TIME(cTime)); - - /* Reads the AGCCTRL_0 register */ - SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - - /* Mask the HOLD_TIME field and write the new value */ - tempRegValue &= 0xC0; - tempRegValue |= cTime; - - /* Sets the AGCCTRL_0 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC hold time. -* @param None. -* @retval uint8_t AGC hold time read from the HOLD_TIME field of AGCCTRL_0 register. -* This parameter will be in the range [0:63]. -*/ -uint8_t SpiritRadioGetAGCHoldTime(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_0 register, mask the MEAS_TIME field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL0_BASE, 1, &tempRegValue); - - return (tempRegValue & 0x3F); - -} - - -/** -* @brief Sets the AGC high threshold. -* @param cHighThreshold AGC high threshold to write in the THRESHOLD_HIGH field of AGCCTRL_1 register. -* This parameter shall be in the range [0:15]. -* @retval None. -*/ -void SpiritRadioSetAGCHighThreshold(uint8_t cHighThreshold) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_AGC_THRESHOLD(cHighThreshold)); - - /* Reads the AGCCTRL_1 register */ - SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - - /* Mask the THRESHOLD_HIGH field and write the new value */ - tempRegValue &= 0x0F; - tempRegValue |= cHighThreshold<<4; - - /* Sets the AGCCTRL_1 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC high threshold. -* @param None. -* @retval uint8_t AGC high threshold read from the THRESHOLD_HIGH field of AGCCTRL_1 register. -* This parameter will be in the range [0:15]. -*/ -uint8_t SpiritRadioGetAGCHighThreshold(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_1 register, mask the THRESHOLD_HIGH field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - - return ((tempRegValue & 0xF0)>>4); - -} - - -/** -* @brief Sets the AGC low threshold. -* @param cLowThreshold AGC low threshold to write in the THRESHOLD_LOW field of AGCCTRL_1 register. -* This parameter shall be in the range [0:15]. -* @retval None. -*/ -void SpiritRadioSetAGCLowThreshold(uint8_t cLowThreshold) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_AGC_THRESHOLD(cLowThreshold)); - - /* Reads the AGCCTRL_1 register */ - SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - - /* Mask the THRESHOLD_LOW field and write the new value */ - tempRegValue &= 0xF0; - tempRegValue |= cLowThreshold; - - /* Sets the AGCCTRL_1 register */ - g_xStatus = SpiritSpiWriteRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the AGC low threshold. -* @param None. -* @retval uint8_t AGC low threshold read from the THRESHOLD_LOW field of AGCCTRL_1 register. -* This parameter will be in the range [0:15]. -*/ -uint8_t SpiritRadioGetAGCLowThreshold(void) -{ - uint8_t tempRegValue; - - /* Reads the AGCCTRL_1 register, mask the THRESHOLD_LOW field and return the value */ - g_xStatus = SpiritSpiReadRegisters(AGCCTRL1_BASE, 1, &tempRegValue); - - return (tempRegValue & 0x0F); - -} - - -/** -* @brief Sets the clock recovery algorithm. -* @param xMode the Clock Recovery mode. This parameter can be one of the values defined in @ref ClkRecMode : -* @arg CLK_REC_PLL PLL alogrithm for clock recovery -* @arg CLK_REC_DLL DLL alogrithm for clock recovery -* @retval None. -*/ -void SpiritRadioSetClkRecMode(ClkRecMode xMode) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_CLK_REC_MODE(xMode)); - - /* Reads the FDEV_0 register */ - SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue); - - /* Mask the CLOCK_REC_ALGO_SEL field and write the new value */ - tempRegValue &= 0xF7; - tempRegValue |= (uint8_t)xMode; - - /* Sets the FDEV_0 register */ - g_xStatus = SpiritSpiWriteRegisters(FDEV0_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the Clock Recovery working mode. -* @param None. -* @retval ClkRecMode Clock Recovery mode. This parameter can be one of the values defined in @ref ClkRecMode : -* @arg CLK_REC_PLL PLL alogrithm for clock recovery -* @arg CLK_REC_DLL DLL alogrithm for clock recovery -*/ -ClkRecMode SpiritRadioGetClkRecMode(void) -{ - uint8_t tempRegValue; - - /* Reads the FDEV_0 register, mask the CLOCK_REC_ALGO_SEL field and return the value */ - g_xStatus = SpiritSpiReadRegisters(FDEV0_BASE, 1, &tempRegValue); - - return (ClkRecMode)(tempRegValue & 0x08); - -} - - -/** -* @brief Sets the clock recovery proportional gain. -* @param cPGain the Clock Recovery proportional gain to write in the CLK_REC_P_GAIN field of CLOCKREC register. -* It represents is log2 value of the clock recovery proportional gain. -* This parameter shall be in the range [0:7]. -* @retval None. -*/ -void SpiritRadioSetClkRecPGain(uint8_t cPGain) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_CLK_REC_P_GAIN(cPGain)); - - /* Reads the CLOCKREC register */ - SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - /* Mask the CLK_REC_P_GAIN field and write the new value */ - tempRegValue &= 0x1F; - tempRegValue |= (cPGain<<5); - - /* Sets the CLOCKREC register */ - g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the log2 of the clock recovery proportional gain. -* @param None. -* @retval uint8_t Clock Recovery proportional gain read from the CLK_REC_P_GAIN field of CLOCKREC register. -* This parameter will be in the range [0:7]. -*/ -uint8_t SpiritRadioGetClkRecPGain(void) -{ - uint8_t tempRegValue; - - /* Reads the CLOCKREC register, mask the CLK_REC_P_GAIN field and return the value */ - g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - return ((tempRegValue & 0xEF)>>5); - -} - - -/** -* @brief Sets the clock recovery integral gain. -* @param cIGain the Clock Recovery integral gain to write in the CLK_REC_I_GAIN field of CLOCKREC register. -* This parameter shall be in the range [0:15]. -* @retval None. -*/ -void SpiritRadioSetClkRecIGain(uint8_t cIGain) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_CLK_REC_I_GAIN(cIGain)); - - /* Reads the CLOCKREC register */ - SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - /* Mask the CLK_REC_P_GAIN field and write the new value */ - tempRegValue &= 0xF0; - tempRegValue |= cIGain; - - /* Sets the CLOCKREC register */ - g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the clock recovery integral gain. -* @param None. -* @retval uint8_t Clock Recovery integral gain read from the -* CLK_REC_I_GAIN field of CLOCKREC register. -* This parameter will be in the range [0:15]. -*/ -uint8_t SpiritRadioGetClkRecIGain(void) -{ - uint8_t tempRegValue; - - /* Reads the CLOCKREC register, mask the CLK_REC_I_GAIN field and return the value */ - g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - return (tempRegValue & 0x0F); - -} - - -/** -* @brief Sets the postfilter length for clock recovery algorithm. -* @param xLength the postfilter length in symbols. This parameter can be one of the values defined in @ref PstFltLength : -* @arg PSTFLT_LENGTH_8 Postfilter length is 8 symbols -* @arg PSTFLT_LENGTH_16 Postfilter length is 16 symbols -* @retval None. -*/ -void SpiritRadioSetClkRecPstFltLength(PstFltLength xLength) -{ - uint8_t tempRegValue; - - /* Check the parameter */ - s_assert_param(IS_PST_FLT_LENGTH(xLength)); - - /* Reads the CLOCKREC register */ - SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - /* Mask the PSTFLT_LEN field and write the new value */ - tempRegValue &= 0xEF; - tempRegValue |= (uint8_t)xLength; - - /* Sets the CLOCKREC register */ - g_xStatus = SpiritSpiWriteRegisters(CLOCKREC_BASE, 1, &tempRegValue); - -} - - -/** -* @brief Returns the postfilter length for clock recovery algorithm. -* @param None. -* @retval PstFltLength Postfilter length in symbols. This parameter can be one of the values defined in @ref PstFltLength : -* @arg PSTFLT_LENGTH_8 Postfilter length is 8 symbols -* @arg PSTFLT_LENGTH_16 Postfilter length is 16 symbols -*/ -PstFltLength SpiritRadioGetClkRecPstFltLength(void) -{ - uint8_t tempRegValue; - - /* Reads the CLOCKREC register, mask the PSTFLT_LEN field and return the value */ - g_xStatus = SpiritSpiReadRegisters(CLOCKREC_BASE, 1, &tempRegValue); - - return (PstFltLength)(tempRegValue & 0x10); - -} - - -/** -* @brief Enables or Disables the received data blanking when the CS is under the threshold. -* @param xNewState new state of this mode. -* This parameter can be: S_ENABLE or S_DISABLE . -* @retval None. -*/ -void SpiritRadioCsBlanking(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the ANT_SELECT_CONF_BASE and mask the CS_BLANKING BIT field */ - SpiritSpiReadRegisters(ANT_SELECT_CONF_BASE, 1, &tempRegValue); - - if(xNewState == S_ENABLE) - { - tempRegValue |= ANT_SELECT_CS_BLANKING_MASK; - } - else - { - tempRegValue &= (~ANT_SELECT_CS_BLANKING_MASK); - } - - /* Writes the new value in the ANT_SELECT_CONF register */ - g_xStatus = SpiritSpiWriteRegisters(ANT_SELECT_CONF_BASE, 1, &tempRegValue); - - -} - -/** -* @brief Enables or Disables the persistent RX mode. -* @param xNewState new state of this mode. -* This parameter can be: S_ENABLE or S_DISABLE . -* @retval None. -*/ -void SpiritRadioPersistenRx(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the PROTOCOL0_BASE and mask the PROTOCOL0_PERS_RX_MASK bitfield */ - SpiritSpiReadRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - - if(xNewState == S_ENABLE) - { - tempRegValue |= PROTOCOL0_PERS_RX_MASK; - } - else - { - tempRegValue &= (~PROTOCOL0_PERS_RX_MASK); - } - - /* Writes the new value in the PROTOCOL0_BASE register */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL0_BASE, 1, &tempRegValue); - -} - -/** -* @brief Enables or Disables the synthesizer reference divider. -* @param xNewState new state for synthesizer reference divider. -* This parameter can be: S_ENABLE or S_DISABLE . -* @retval None. -*/ -void SpiritRadioSetRefDiv(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the SYNTH_CONFIG1_BASE and mask the REFDIV bit field */ - SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - - if(xNewState == S_ENABLE) - { - tempRegValue |= 0x80; - } - else - { - tempRegValue &= 0x7F; - } - - /* Writes the new value in the SYNTH_CONFIG1_BASE register */ - g_xStatus = SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - -} - -/** -* @brief Get the the synthesizer reference divider state. -* @param void. -* @retval None. -*/ -SpiritFunctionalState SpiritRadioGetRefDiv(void) -{ - uint8_t tempRegValue; - - g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue); - - if(((tempRegValue>>7)&0x1)) - { - return S_ENABLE; - } - else - { - return S_DISABLE; - } - -} - -/** -* @brief Enables or Disables the synthesizer reference divider. -* @param xNewState new state for synthesizer reference divider. -* This parameter can be: S_ENABLE or S_DISABLE . -* @retval None. -*/ -void SpiritRadioSetDigDiv(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Check the parameters */ - s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); - - /* Reads the XO_RCO_TEST_BASE and mask the PD_CLKDIV bit field */ - SpiritSpiReadRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue); - - if(xNewState == S_ENABLE) - { - tempRegValue &= 0xf7; - } - else - { - - tempRegValue |= 0x08; - } - - /* Writes the new value in the XO_RCO_TEST_BASE register */ - g_xStatus = SpiritSpiWriteRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue); - -} - -/** -* @brief Get the the synthesizer reference divider state. -* @param void. -* @retval None. -*/ -SpiritFunctionalState SpiritRadioGetDigDiv(void) -{ - uint8_t tempRegValue; - - g_xStatus = SpiritSpiReadRegisters(XO_RCO_TEST_BASE, 1, &tempRegValue); - - if(((tempRegValue>>3)&0x1)) - { - return S_DISABLE; - } - else - { - return S_ENABLE; - } - -} - -/** -* @brief Returns the XTAL frequency. -* @param void. -* @retval uint32_t XTAL frequency. -*/ -uint32_t SpiritRadioGetXtalFrequency(void) -{ - return s_lXtalFrequency; -} - -/** -* @brief Sets the XTAL frequency. -* @param uint32_t XTAL frequency. -* @retval void. -*/ -void SpiritRadioSetXtalFrequency(uint32_t lXtalFrequency) -{ - s_lXtalFrequency = lXtalFrequency; -} - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/ -
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Timer.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Timer.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,700 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Timer.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief Configuration and management of SPIRIT timers. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Timer.h" -#include "SPIRIT_Radio.h" -#include "MCU_Interface.h" - - - - -/** - * @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** - * @addtogroup SPIRIT_Timer - * @{ - */ - - -/** - * @defgroup Timer_Private_TypesDefinitions Timer Private Types Definitions - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Timer_Private_Defines Timer Private Defines - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Timer_Private_Macros Timer Private Macros - * @{ - */ - - -/** - *@} - */ - - -/** - * @defgroup Timer_Private_Variables Timer Private Variables - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Timer_Private_FunctionPrototypes Timer Private Function Prototypes - * @{ - */ - -/** - *@} - */ - - -/** - * @defgroup Timer_Private_Functions Timer Private Functions - * @{ - */ - -/** - * @brief Enables or Disables the LDCR mode. - * @param xNewState new state for LDCR mode. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritTimerLdcrMode(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - - /* Mask the read value to enable or disable the LDC mode */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL2_LDC_MODE_MASK; - } - else - { - tempRegValue &= ~PROTOCOL2_LDC_MODE_MASK; - } - - /* Writes the register to Enable or Disable the LDCR mode */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Enables or Disables the LDCR timer reloading with the value stored in the LDCR_RELOAD registers. - * @param xNewState new state for LDCR reloading. - * This parameter can be: S_ENABLE or S_DISABLE. - * @retval None. - */ -void SpiritTimerLdcrAutoReload(SpiritFunctionalState xNewState) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - /* Mask te read value to enable or disable the reload on sync mode */ - if(xNewState==S_ENABLE) - { - tempRegValue |= PROTOCOL1_LDC_RELOAD_ON_SYNC_MASK; - } - else - { - tempRegValue &= ~PROTOCOL1_LDC_RELOAD_ON_SYNC_MASK; - } - - /* Writes the register to Enable or Disable the Auto Reload */ - g_xStatus = SpiritSpiWriteRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - -} - - -/** - * @brief Returns the LDCR timer reload bit. - * @param None. - * @retval SpiritFunctionalState: value of the reload bit. - */ -SpiritFunctionalState SpiritTimerLdcrGetAutoReload(void) -{ - uint8_t tempRegValue; - - /* Reads the register value */ - g_xStatus = SpiritSpiReadRegisters(PROTOCOL1_BASE, 1, &tempRegValue); - - return (SpiritFunctionalState)(tempRegValue & 0x80); - -} - -/** - * @brief Sets the RX timeout timer initialization registers with the values of COUNTER and PRESCALER according to the formula: Trx=PRESCALER*COUNTER*Tck. - * Remember that it is possible to have infinite RX_Timeout writing 0 in the RX_Timeout_Counter and/or RX_Timeout_Prescaler registers. - * @param cCounter value for the timer counter. - * This parameter must be an uint8_t. - * @param cPrescaler value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetRxTimeout(uint8_t cCounter , uint8_t cPrescaler) -{ - uint8_t tempRegValue[2]={cPrescaler,cCounter}; - - /* Writes the prescaler and counter value for RX timeout in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the RX timeout timer counter and prescaler from the desired value in ms. it is possible to fix the RX_Timeout to - * a minimum value of 50.417us to a maximum value of about 3.28 s. - * @param fDesiredMsec desired timer value. - * This parameter must be a float. - * @retval None - */ - -void SpiritTimerSetRxTimeoutMs(float fDesiredMsec) -{ - uint8_t tempRegValue[2]; - - /* Computes the counter and prescaler value */ - SpiritTimerComputeRxTimeoutValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]); - - /* Writes the prescaler and counter value for RX timeout in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the RX timeout timer counter. If it is equal to 0 the timeout is infinite. - * @param cCounter value for the timer counter. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetRxTimeoutCounter(uint8_t cCounter) -{ - /* Writes the counter value for RX timeout in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS4_RX_TIMEOUT_COUNTER_BASE, 1, &cCounter); - -} - - -/** - * @brief Sets the RX timeout timer prescaler. If it is equal to 0 the timeout is infinite. - * @param cPrescaler value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None - */ -void SpiritTimerSetRxTimeoutPrescaler(uint8_t cPrescaler) -{ - /* Writes the prescaler value for RX timeout in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 1, &cPrescaler); - -} - - -/** - * @brief Returns the RX timeout timer. - * @param pfTimeoutMsec pointer to the variable in which the timeout expressed in milliseconds has to be stored. - * If the returned value is 0, it means that the RX_Timeout is infinite. - * This parameter must be a float*. - * @param pcCounter pointer to the variable in which the timer counter has to be stored. - * This parameter must be an uint8_t*. - * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored. - * This parameter must be an uint8_t*. - * @retval None. - */ -void SpiritTimerGetRxTimeout(float* pfTimeoutMsec, uint8_t* pcCounter , uint8_t* pcPrescaler) -{ - uint8_t tempRegValue[2]; - - /* Reads the RX timeout registers value */ - g_xStatus = SpiritSpiReadRegisters(TIMERS5_RX_TIMEOUT_PRESCALER_BASE, 2, tempRegValue); - - /* Returns values */ - (*pcPrescaler) = tempRegValue[0]; - (*pcCounter) = tempRegValue[1]; - - float nXtalFrequency = (float)SpiritRadioGetXtalFrequency(); - if(nXtalFrequency>DOUBLE_XTAL_THR) { - nXtalFrequency /= 2.0; - } - nXtalFrequency /= 1000.0; - *pfTimeoutMsec = (float)((tempRegValue[0]+1)*tempRegValue[1]*(1210.0/nXtalFrequency)); - - -} - - -/** - * @brief Sets the LDCR wake up timer initialization registers with the values of - * COUNTER and PRESCALER according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where - * Tck = 28.818 us. The minimum vale of the wakeup timeout is 28.818us (PRESCALER and - * COUNTER equals to 0) and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals - * to 255). - * @param cCounter value for the timer counter. - * This parameter must be an uint8_t. - * @param cPrescaler value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetWakeUpTimer(uint8_t cCounter , uint8_t cPrescaler) -{ - uint8_t tempRegValue[2]={cPrescaler,cCounter}; - - /* Writes the counter and prescaler value of wake-up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the LDCR wake up timer counter and prescaler from the desired value in ms, - * according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us. - * The minimum vale of the wakeup timeout is 28.818us (PRESCALER and COUNTER equals to 0) - * and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals to 255). - * @param fDesiredMsec desired timer value. - * This parameter must be a float. - * @retval None. - */ -void SpiritTimerSetWakeUpTimerMs(float fDesiredMsec) -{ - uint8_t tempRegValue[2]; - - /* Computes counter and prescaler */ - SpiritTimerComputeWakeUpValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]); - - /* Writes the counter and prescaler value of wake-up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the LDCR wake up timer counter. Remember that this value is incresead by one in the Twu calculation. - * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us - * @param cCounter value for the timer counter. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetWakeUpTimerCounter(uint8_t cCounter) -{ - /* Writes the counter value for Wake_Up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS2_LDC_COUNTER_BASE, 1, &cCounter); - -} - - -/** - * @brief Sets the LDCR wake up timer prescaler. Remember that this value is incresead by one in the Twu calculation. - * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us - * @param cPrescaler value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetWakeUpTimerPrescaler(uint8_t cPrescaler) -{ - /* Writes the prescaler value for Wake_Up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS3_LDC_PRESCALER_BASE, 1, &cPrescaler); - -} - - -/** - * @brief Returns the LDCR wake up timer, according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us. - * @param pfWakeUpMsec pointer to the variable in which the wake-up time expressed in milliseconds has to be stored. - * This parameter must be a float*. - * @param pcCounter pointer to the variable in which the timer counter has to be stored. - * This parameter must be an uint8_t*. - * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored. - * This parameter must be an uint8_t*. - * @retval None. - */ -void SpiritTimerGetWakeUpTimer(float* pfWakeUpMsec, uint8_t* pcCounter , uint8_t* pcPrescaler) -{ - uint8_t tempRegValue[2]; - //uint32_t xtal=SpiritRadioGetXtalFrequency(); - float rco_freq; - - rco_freq=(float)SpiritTimerGetRcoFrequency(); - - /* Reads the Wake_Up timer registers value */ - g_xStatus = SpiritSpiReadRegisters(TIMERS3_LDC_PRESCALER_BASE, 2, tempRegValue); - - /* Returns values */ - (*pcPrescaler)=tempRegValue[0]; - (*pcCounter)=tempRegValue[1]; - *pfWakeUpMsec = (float)((((*pcPrescaler)+1)*((*pcCounter)+1)*(1000.0/rco_freq))); - -} - - -/** - * @brief Sets the LDCR wake up timer reloading registers with the values of - * COUNTER and PRESCALER according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where - * Tck = 28.818 us. The minimum vale of the wakeup timeout is 28.818us (PRESCALER and - * COUNTER equals to 0) and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals - * to 255). - * @param cCounter reload value for the timer counter. - * This parameter must be an uint8_t. - * @param cPrescaler reload value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None. - */ -void SpiritTimerSetWakeUpTimerReload(uint8_t cCounter , uint8_t cPrescaler) -{ - uint8_t tempRegValue[2]={cPrescaler,cCounter}; - - /* Writes the counter and prescaler value of reload wake-up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the LDCR wake up reload timer counter and prescaler from the desired value in ms, - * according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us. - * The minimum vale of the wakeup timeout is 28.818us (PRESCALER and COUNTER equals to 0) - * and the maximum value is about 1.89 s (PRESCALER anc COUNTER equals to 255). - * @param fDesiredMsec desired timer value. - * This parameter must be a float. - * @retval None. - */ -void SpiritTimerSetWakeUpTimerReloadMs(float fDesiredMsec) -{ - uint8_t tempRegValue[2]; - - /* Computes counter and prescaler */ - SpiritTimerComputeWakeUpValues(fDesiredMsec , &tempRegValue[1] , &tempRegValue[0]); - - /* Writes the counter and prescaler value of reload wake-up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue); - -} - - -/** - * @brief Sets the LDCR wake up timer reload counter. Remember that this value is incresead by one in the Twu calculation. - * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us - * @param cCounter value for the timer counter. - * This parameter must be an uint8_t. - * @retval None - */ -void SpiritTimerSetWakeUpTimerReloadCounter(uint8_t cCounter) -{ - /* Writes the counter value for reload Wake_Up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS0_LDC_RELOAD_COUNTER_BASE, 1, &cCounter); - -} - - -/** - * @brief Sets the LDCR wake up timer reload prescaler. Remember that this value is incresead by one in the Twu calculation. - * Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us - * @param cPrescaler value for the timer prescaler. - * This parameter must be an uint8_t. - * @retval None - */ -void SpiritTimerSetWakeUpTimerReloadPrescaler(uint8_t cPrescaler) -{ - /* Writes the prescaler value for reload Wake_Up timer in the corresponding register */ - g_xStatus = SpiritSpiWriteRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 1, &cPrescaler); - -} - - -/** - * @brief Returns the LDCR wake up reload timer, according to the formula: Twu=(PRESCALER +1)*(COUNTER+1)*Tck, where Tck = 28.818 us. - * @param pfWakeUpReloadMsec pointer to the variable in which the wake-up reload time expressed in milliseconds has to be stored. - * This parameter must be a float*. - * @param pcCounter pointer to the variable in which the timer counter has to be stored. - * This parameter must be an uint8_t*. - * @param pcPrescaler pointer to the variable in which the timer prescaler has to be stored. - * This parameter must be an uint8_t*. - * @retval None. - */ -void SpiritTimerGetWakeUpTimerReload(float* pfWakeUpReloadMsec, uint8_t* pcCounter , uint8_t* pcPrescaler) -{ - uint8_t tempRegValue[2]; - //uint32_t xtal=SpiritRadioGetXtalFrequency(); - float rco_freq; - - rco_freq=(float)SpiritTimerGetRcoFrequency(); - - /* Reads the reload Wake_Up timer registers value */ - g_xStatus = SpiritSpiReadRegisters(TIMERS1_LDC_RELOAD_PRESCALER_BASE, 2, tempRegValue); - - /* Returns values */ - (*pcPrescaler)=tempRegValue[0]; - (*pcCounter)=tempRegValue[1]; - *pfWakeUpReloadMsec = (float)((((*pcPrescaler)+1)*((*pcCounter)+1)*(1000.0/rco_freq))); - -} - -/** - * @brief Computes and returns the RCO frequency. - * This frequency depends on the xtal frequency and the XTAL bit in register 0x01. - * @retval RCO frequency in Hz as an uint16_t. - */ -uint16_t SpiritTimerGetRcoFrequency(void) -{ - uint16_t rco_freq=34700; - uint32_t xtal=SpiritRadioGetXtalFrequency(); - - if(xtal>30000000) xtal/=2; - - if(xtal==25000000) - { - uint8_t xtal_flag; - SpiritSpiReadRegisters(0x01, 1, &xtal_flag); - xtal_flag=(xtal_flag&0x40); - - if(xtal_flag==0) - { - rco_freq=36100; - } - else - { - rco_freq=33300; - } - } - - return rco_freq; -} - -/** - * @brief Computes the values of the wakeup timer counter and prescaler from the user time expressed in millisecond. - * The prescaler and the counter values are computed maintaining the prescaler value as - * small as possible in order to obtain the best resolution, and in the meantime minimizing the error. - * @param fDesiredMsec desired wakeup timeout in millisecs. - * This parameter must be a float. Since the counter and prescaler are 8 bit registers the maximum - * reachable value is maxTime = fTclk x 256 x 256. - * @param pcCounter pointer to the variable in which the value for the wakeup timer counter has to be stored. - * This parameter must be a uint8_t*. - * @param pcPrescaler pointer to the variable in which the value for the wakeup timer prescaler has to be stored. - * This parameter must be an uint8_t*. - * @retval None - */ -void SpiritTimerComputeWakeUpValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler) -{ - float rco_freq,err; - uint32_t n; - - rco_freq=((float)SpiritTimerGetRcoFrequency())/1000; - - /* N cycles in the time base of the timer: - - clock of the timer is RCO frequency - - divide times 1000 more because we have an input in ms (variable rco_freq is already this frequency divided by 1000) - */ - n=(uint32_t)(fDesiredMsec*rco_freq); - - /* check if it is possible to reach that target with prescaler and counter of spirit1 */ - if(n/0xFF>0xFD) - { - /* if not return the maximum possible value */ - (*pcCounter) = 0xFF; - (*pcPrescaler) = 0xFF; - return; - } - - /* prescaler is really 2 as min value */ - (*pcPrescaler)=(n/0xFF)+2; - (*pcCounter) = n / (*pcPrescaler); - - /* check if the error is minimum */ - err=S_ABS((float)(*pcCounter)*(*pcPrescaler)/rco_freq-fDesiredMsec); - - if((*pcCounter)<=254) - { - if(S_ABS((float)((*pcCounter)+1)*(*pcPrescaler)/rco_freq-fDesiredMsec)<err) - (*pcCounter)=(*pcCounter)+1; - } - - /* decrement prescaler and counter according to the logic of this timer in spirit1 */ - (*pcPrescaler)--; - if((*pcCounter)>1) - (*pcCounter)--; - else - (*pcCounter)=1; -} - - -/** - * @brief Computes the values of the rx_timeout timer counter and prescaler from the user time expressed in millisecond. - * The prescaler and the counter values are computed maintaining the prescaler value as - * small as possible in order to obtain the best resolution, and in the meantime minimizing the error. - * @param fDesiredMsec desired rx_timeout in millisecs. - * This parameter must be a float. Since the counter and prescaler are 8 bit registers the maximum - * reachable value is maxTime = fTclk x 255 x 255. - * @param pcCounter pointer to the variable in which the value for the rx_timeout counter has to be stored. - * This parameter must be a uint8_t*. - * @param pcPrescaler pointer to the variable in which the value for the rx_timeout prescaler has to be stored. - * This parameter must be an uint8_t*. - * @retval None - */ -void SpiritTimerComputeRxTimeoutValues(float fDesiredMsec , uint8_t* pcCounter , uint8_t* pcPrescaler) -{ - uint32_t nXtalFrequency = SpiritRadioGetXtalFrequency(); - uint32_t n; - float err; - - /* if xtal is doubled divide it by 2 */ - if(nXtalFrequency>DOUBLE_XTAL_THR) { - nXtalFrequency >>= 1; - } - - /* N cycles in the time base of the timer: - - clock of the timer is xtal/1210 - - divide times 1000 more because we have an input in ms - */ - n=(uint32_t)(fDesiredMsec*nXtalFrequency/1210000); - - /* check if it is possible to reach that target with prescaler and counter of spirit1 */ - if(n/0xFF>0xFD) - { - /* if not return the maximum possible value */ - (*pcCounter) = 0xFF; - (*pcPrescaler) = 0xFF; - return; - } - - /* prescaler is really 2 as min value */ - (*pcPrescaler)=(n/0xFF)+2; - (*pcCounter) = n / (*pcPrescaler); - - /* check if the error is minimum */ - err=S_ABS((float)(*pcCounter)*(*pcPrescaler)*1210000/nXtalFrequency-fDesiredMsec); - - if((*pcCounter)<=254) - { - if(S_ABS((float)((*pcCounter)+1)*(*pcPrescaler)*1210000/nXtalFrequency-fDesiredMsec)<err) - (*pcCounter)=(*pcCounter)+1; - } - - /* decrement prescaler and counter according to the logic of this timer in spirit1 */ - (*pcPrescaler)--; - if((*pcCounter)>1) - (*pcCounter)--; - else - (*pcCounter)=1; -} - - -/** - * @brief Sets the RX timeout stop conditions. - * @param xStopCondition new stop condition. - * This parameter can be any value of @ref RxTimeoutStopCondition. - * @retval None - */ -void SpiritTimerSetRxTimeoutStopCondition(RxTimeoutStopCondition xStopCondition) -{ - uint8_t tempRegValue[2]; - - /* Check the parameters */ - s_assert_param(IS_RX_TIMEOUT_STOP_CONDITION(xStopCondition)); - - /* Reads value on the PKT_FLT_OPTIONS and PROTOCOL2 register */ - g_xStatus = SpiritSpiReadRegisters(PCKT_FLT_OPTIONS_BASE, 2, tempRegValue); - - tempRegValue[0] &= 0xBF; - tempRegValue[0] |= ((xStopCondition & 0x08) << 3); - - tempRegValue[1] &= 0x1F; - tempRegValue[1] |= (xStopCondition << 5); - - /* Writes value on the PKT_FLT_OPTIONS and PROTOCOL2 register */ - g_xStatus = SpiritSpiWriteRegisters(PCKT_FLT_OPTIONS_BASE, 2, tempRegValue); - -} - -/** - * @brief Sends the LDC_RELOAD command to SPIRIT. Reload the LDC timer with the value stored in the LDC_PRESCALER / COUNTER registers. - * @param None. - * @retval None - */ -void SpiritTimerReloadStrobe(void) -{ - /* Sends the CMD_LDC_RELOAD command */ - g_xStatus = SpiritSpiCommandStrobes(COMMAND_LDC_RELOAD); - -} - - -/** - *@} - */ - - -/** - *@} - */ - - -/** - *@} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Types.c --- a/stm-spirit1-rf-driver/source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Types.c Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ -/** - ****************************************************************************** - * @file SPIRIT_Types.c - * @author VMA division - AMS - * @version 3.2.2 - * @date 08-July-2015 - * @brief File for SPIRIT types. - * @details - * - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions 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 STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "SPIRIT_Types.h" -#include "MCU_Interface.h" - - -/** @addtogroup SPIRIT_Libraries - * @{ - */ - - -/** @addtogroup SPIRIT_Types - * @{ - */ - - -/** @defgroup Types_Private_TypesDefinitions Types Private Types Definitions - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Types_Private_Defines Types Private Defines - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Types_Private_Macros Types Private Macros - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup Types_Private_Variables Types Private Variables - * @{ - */ - -/** - * @brief Spirit Status global variable. - * This global variable of @ref SpiritStatus type is updated on every SPI transaction - * to maintain memory of Spirit Status. - */ - -volatile SpiritStatus g_xStatus; - -/** - * @} - */ - - - -/** @defgroup Types_Private_FunctionPrototypes Types Private FunctionPrototypes - * @{ - */ - - - -/** - * @} - */ - - - -/** @defgroup Types_Private_Functions Types Private Functions - * @{ - */ - -#ifdef SPIRIT_USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file pointer to the source file name - * @param line assert_param error line source number - * @retval : None - */ -void s_assert_failed(uint8_t* file, uint32_t line) -{ - /* User can add his own implementation to report the file name and line number */ - printf("Wrong parameters value: file %s on line %d\r\n", file, (int)line); - - /* Infinite loop */ - while (1) - { - } -} -#elif SPIRIT_USE_VCOM_ASSERT - -#include "SDK_EVAL_VC_General.h" - -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file pointer to the source file name - * @param line assert_param error line source number - * @param expression: string representing the assert failed expression - * @retval : None - */ -void s_assert_failed(uint8_t* file, uint32_t line, char* expression) -{ - - printf("\n\rVCOM DEBUG: Incorrect parameter. Please reboot.\n\r"); - printf("%s:%d \n\r",file,line); - printf("The expression %s returned FALSE.\n\r", expression); - - /* Infinite loop */ - while (1) - { - } -} - -#elif SPIRIT_USE_FRAME_ASSERT - -#include "SdkUsbProtocol.h" - -/** - * @brief Sends a notify frame with a payload indicating the name - * of the assert failed. - * @param expression: string representing the assert failed expression - * @retval : None - */ -void s_assert_failed(char* expression) -{ - char pcPayload[100]; - uint16_t i; - - for(i = 0 ; expression[i]!='(' ; i++); - expression[i]='\0'; - - strcpy(pcPayload, &expression[3]); - - //sprintf(pcPayload, "The expression %s returned FALSE.\n\r", expression); - SpiritNotifyAssertFailed(pcPayload); - -} - -#endif - - -/** - * @brief Updates the gState (the global variable used to maintain memory of Spirit Status) - * reading the MC_STATE register of SPIRIT. - * @param None - * @retval None - */ -void SpiritRefreshStatus(void) -{ - uint8_t tempRegValue; - - /* Reads the MC_STATUS register to update the g_xStatus */ - g_xStatus = SpiritSpiReadRegisters(MC_STATE1_BASE, 1, &tempRegValue); -} - - -/** - * @} - */ - - - -/** - * @} - */ - - - -/** - * @} - */ - - - -/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/X-NUCLEO-IDS01Ax/radio_gpio.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/X-NUCLEO-IDS01Ax/radio_gpio.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,224 +0,0 @@ -/** -****************************************************************************** -* @file radio_gpio.h -* @author System Lab - NOIDA -* @version V1.0.0 -* @date 15-May-2014 -* @brief This file contains all the functions prototypes for the gpio -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported Variables ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RADIO_GPIO_H -#define __RADIO_GPIO_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#ifdef USE_STM32L1XX_NUCLEO -#include "stm32l1xx_hal.h" -#endif - -#ifdef USE_STM32F4XX_NUCLEO -#include "stm32f4xx_hal.h" -#endif -#include "SPIRIT_Types.h" - -/** - * @addtogroup BSP - * @{ - */ - - -/* Exported types ------------------------------------------------------------*/ - /* MCU GPIO pin working mode for GPIO */ -typedef enum -{ - RADIO_MODE_GPIO_IN = 0x00, /*!< Work as GPIO input */ - RADIO_MODE_EXTI_IN, /*!< Work as EXTI */ - RADIO_MODE_GPIO_OUT, /*!< Work as GPIO output */ -}RadioGpioMode; - - /* MCU GPIO pin enumeration for GPIO */ -typedef enum -{ - RADIO_GPIO_0 = 0x00, /*!< GPIO_0 selected */ - RADIO_GPIO_1 = 0x01, /*!< GPIO_1 selected */ - RADIO_GPIO_2 = 0x02, /*!< GPIO_2 selected */ - RADIO_GPIO_3 = 0x03, /*!< GPIO_3 selected */ - RADIO_GPIO_SDN = 0x04, /*!< GPIO_SDN selected */ -} -RadioGpioPin; - - -/* Exported constants --------------------------------------------------------*/ - - -/* Exported macro ------------------------------------------------------------*/ - /* MCU GPIO pin working mode for GPIO */ -#define IS_RADIO_GPIO_MODE(MODE) (((MODE) == RADIO_MODE_GPIO_IN) || \ - ((MODE) == RADIO_MODE_EXTI_IN) || \ - ((MODE) == RADIO_MODE_GPIO_OUT)) - -/* Number of Arduino pins used for RADIO GPIO interface */ -#define RADIO_GPIO_NUMBER ((uint8_t)5) - -/* MCU GPIO pin enumeration for GPIO */ -#define IS_RADIO_GPIO_PIN(PIN) (((PIN) == RADIO_GPIO_0) || \ - ((PIN) == RADIO_GPIO_1) || \ - ((PIN) == RADIO_GPIO_2) || \ - ((PIN) == RADIO_GPIO_3) || \ - ((PIN) == RADIO_GPIO_SDN)) - -/* Define for RADIO board */ -#if !defined (USE_SPIRIT1_DEFAULT) - #define USE_SPIRIT1_DEFAULT -#endif - -/* @defgroup Radio_Gpio_config_Define */ -/*NOTE: GPIO0, GPIO1, GPIO2 of SPIRIT1 is not used in the shield*/ - -#define RADIO_GPIO_0_PORT GPIOC -#define RADIO_GPIO_0_PIN GPIO_PIN_1 -#define RADIO_GPIO_0_CLOCK_ENABLE() __GPIOC_CLK_ENABLE() -#define RADIO_GPIO_0_CLOCK_DISABLE() __GPIOC_CLK_ENABLE() -#define RADIO_GPIO_0_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_0_PUPD GPIO_NOPULL -#define RADIO_GPIO_0_EXTI_LINE GPIO_PIN_1 -#define RADIO_GPIO_0_EXTI_MODE GPIO_MODE_IT_FALLING -#define RADIO_GPIO_0_EXTI_IRQN EXTI1_IRQn -#define RADIO_GPIO_0_EXTI_PREEMPTION_PRIORITY 2 -#define RADIO_GPIO_0_EXTI_SUB_PRIORITY 2 -#define RADIO_GPIO_0_EXTI_IRQ_HANDLER EXTI1_IRQHandler - -#define RADIO_GPIO_1_PORT GPIOB -#define RADIO_GPIO_1_PIN GPIO_PIN_0 -#define RADIO_GPIO_1_CLOCK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_GPIO_1_CLOCK_DISABLE() __GPIOB_CLK_ENABLE() -#define RADIO_GPIO_1_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_1_PUPD GPIO_NOPULL -#define RADIO_GPIO_1_EXTI_LINE GPIO_PIN_0 -#define RADIO_GPIO_1_EXTI_MODE GPIO_MODE_IT_FALLING -#define RADIO_GPIO_1_EXTI_IRQN EXTI0_IRQn -#define RADIO_GPIO_1_EXTI_PREEMPTION_PRIORITY 2 -#define RADIO_GPIO_1_EXTI_SUB_PRIORITY 2 -#define RADIO_GPIO_1_EXTI_IRQ_HANDLER EXTI0_IRQHandler - -#define RADIO_GPIO_2_PORT GPIOA -#define RADIO_GPIO_2_PIN GPIO_PIN_4 -#define RADIO_GPIO_2_CLOCK_ENABLE() __GPIOA_CLK_ENABLE() -#define RADIO_GPIO_2_CLOCK_DISABLE() __GPIOA_CLK_ENABLE() -#define RADIO_GPIO_2_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_2_PUPD GPIO_NOPULL -#define RADIO_GPIO_2_EXTI_LINE GPIO_PIN_4 -#define RADIO_GPIO_2_EXTI_MODE GPIO_MODE_IT_FALLING -#define RADIO_GPIO_2_EXTI_IRQN EXTI4_IRQn -#define RADIO_GPIO_2_EXTI_PREEMPTION_PRIORITY 2 -#define RADIO_GPIO_2_EXTI_SUB_PRIORITY 2 -#define RADIO_GPIO_2_EXTI_IRQ_HANDLER EXTI4_IRQHandler - - -#if defined (USE_SPIRIT1_DEFAULT) - - -#define RADIO_GPIO_3_PORT GPIOC -#define RADIO_GPIO_3_PIN GPIO_PIN_7 -#define RADIO_GPIO_3_CLOCK_ENABLE() __GPIOC_CLK_ENABLE() -#define RADIO_GPIO_3_CLOCK_DISABLE() __GPIOC_CLK_DISABLE() -#define RADIO_GPIO_3_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_3_PUPD GPIO_NOPULL -#define RADIO_GPIO_3_EXTI_LINE GPIO_PIN_7 -#define RADIO_GPIO_3_EXTI_MODE GPIO_MODE_IT_FALLING -#define RADIO_GPIO_3_EXTI_IRQN EXTI9_5_IRQn -#define RADIO_GPIO_3_EXTI_PREEMPTION_PRIORITY 2 -#define RADIO_GPIO_3_EXTI_SUB_PRIORITY 2 -#define RADIO_GPIO_3_EXTI_IRQ_HANDLER EXTI9_5_IRQHandler - -#else - -#define RADIO_GPIO_3_PORT GPIOA -#define RADIO_GPIO_3_PIN GPIO_PIN_0 -#define RADIO_GPIO_3_CLOCK_ENABLE() __GPIOA_CLK_ENABLE() -#define RADIO_GPIO_3_CLOCK_DISABLE() __GPIOA_CLK_DISABLE() -#define RADIO_GPIO_3_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_3_PUPD GPIO_NOPULL -#define RADIO_GPIO_3_EXTI_LINE GPIO_PIN_0 -#define RADIO_GPIO_3_EXTI_MODE GPIO_MODE_IT_FALLING -#define RADIO_GPIO_3_EXTI_IRQN EXTI0_IRQn -#define RADIO_GPIO_3_EXTI_PREEMPTION_PRIORITY 2 -#define RADIO_GPIO_3_EXTI_SUB_PRIORITY 2 -#define RADIO_GPIO_3_EXTI_IRQ_HANDLER EXTI0_IRQHandler - -#endif - -#define RADIO_GPIO_SDN_PORT GPIOA -#define RADIO_GPIO_SDN_PIN GPIO_PIN_10 -#define RADIO_GPIO_SDN_CLOCK_ENABLE() __GPIOA_CLK_ENABLE() -#define RADIO_GPIO_SDN_CLOCK_DISABLE() __GPIOA_CLK_DISABLE() -#define RADIO_GPIO_SDN_SPEED GPIO_SPEED_HIGH -#define RADIO_GPIO_SDN_PUPD GPIO_PULLUP - - -#define RADIO_GPIO_IRQ RADIO_GPIO_3 -#define SPIRIT_GPIO_IRQ SPIRIT_GPIO_3 - -/* Exported Variables ------------------------------------------------------------*/ - - -/* Exported functions ------------------------------------------------------- */ -FlagStatus RadioGpioGetLevel(RadioGpioPin xGpio); -void RadioGpioSetLevel(RadioGpioPin xGpio, GPIO_PinState xState); -void SdkEvalEnterShutdown(void); -void SdkEvalExitShutdown(void); -SpiritFlagStatus SdkEvalCheckShutdown(void); -void RadioGpioInit(RadioGpioPin xGpio, RadioGpioMode xGpioMode); -void RadioGpioInterruptCmd(RadioGpioPin xGpio, uint8_t nPreemption, uint8_t nSubpriority, FunctionalState xNewState); - - -#ifdef __cplusplus -} -#endif -#endif /*__RADIO_GPIO_H */ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/libs/spirit1/X-NUCLEO-IDS01Ax/radio_shield_config.h --- a/stm-spirit1-rf-driver/source/libs/spirit1/X-NUCLEO-IDS01Ax/radio_shield_config.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/** -****************************************************************************** -* @file radio_shield_config.h -* @author System Lab - NOIDA -* @version V1.0.0 -* @date 15-May-2014 -* @brief This file contains definitions for: -* - LEDs and push-button available on RF shields -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RADIO_SHIELD_CONFIG_H -#define __RADIO_SHIELD_CONFIG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#ifdef USE_STM32L1XX_NUCLEO -// #include "stm32l1xx_hal.h" -#endif - -#ifdef USE_STM32F4XX_NUCLEO -// #include "stm32f4xx_hal.h" -#endif - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup X-NUCLEO-IDS02Ax - * @{ - */ - -/** @addtogroup RADIO_SHILED_LOW_LEVEL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -typedef enum -{ - RADIO_SHIELD_LED = 0 -} Led_t; - - - -/* Exported constants --------------------------------------------------------*/ - - -/* Exported macro ------------------------------------------------------------*/ - /** @addtogroup RF_SHIELD_CONFIG_LOW_LEVEL_LED - * @{ - */ -#define RADIO_SHIELD_LEDn ((uint8_t)1) - -#define RADIO_SHIELD_LED_GPIO_PIN GPIO_PIN_4 /*Rx Indicator LED*/ -#define RADIO_SHIELD_LED_GPIO_PORT GPIOB -#define RADIO_SHIELD_LED_GPIO_CLK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_SHIELD_LED_GPIO_CLK_DISABLE() __GPIOB_CLK_DISABLE() - - -/* Exported Variables ------------------------------------------------------------*/ - - -/* Exported functions ------------------------------------------------------- */ -void RadioShieldLedInit(Led_t Led); -void RadioShieldLedOn(Led_t Led); -void RadioShieldLedOff(Led_t Led); -void RadioShieldLedToggle(Led_t Led); - - - -#ifdef __cplusplus -} -#endif - -#endif /* __RADIO_SHIELD_CONFIG_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ -
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/source/radio_spi.cpp --- a/stm-spirit1-rf-driver/source/radio_spi.cpp Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,335 +0,0 @@ -/** -****************************************************************************** -* @file radio_spi.c -* @author System Lab - NOIDA -* @version V1.0.0 -* @date 15-May-2014 -* @brief This file provides code for the configuration of the SPI instances. -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ - - -/* Includes ------------------------------------------------------------------*/ -#include "radio_spi.h" - -#include "SimpleSpirit1.h" - - -/** - * @addtogroup BSP - * @{ - */ - - -/** - * @addtogroup X-NUCLEO-IDS02Ax - * @{ - */ - - -/** - * @defgroup RADIO_SPI_Private_TypesDefinitions RADIO_SPI Private Types Definitions - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup RADIO_SPI_Private_Defines RADIO_SPI Private Defines - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup RADIO_SPI_Private_Macros RADIO_SPI Private Macros - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup RADIO_SPI_Private_Variables RADIO_SPI Private Variables - * @{ - */ - -/** - * @} - */ - - -/** - * @defgroup RADIO_SPI_Private_FunctionPrototypes RADIO_SPI Private Function Prototypes - * @{ - */ - -/** - * @} - */ - -/** - * @defgroup RADIO_SPI_Private_Functions RADIO_SPI Private Functions - * @{ - */ - -/** -* @} -*/ - -/** -* @brief Write single or multiple RF Transceivers register -* @param cRegAddress: base register's address to be write -* @param cNbBytes: number of registers and bytes to be write -* @param pcBuffer: pointer to the buffer of values have to be written into registers -* @retval StatusBytes -*/ -StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer) -{ - return SimpleSpirit1::Instance().SdkEvalSpiWriteRegisters(cRegAddress, cNbBytes, pcBuffer); -} - -StatusBytes SimpleSpirit1::SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer) -{ - uint8_t aHeader[2] = {0}; - uint16_t tmpstatus = 0x0000; - StatusBytes *pStatus=(StatusBytes *)&tmpstatus; - - /* Built the aHeader bytes */ - aHeader[0] = WRITE_HEADER; - aHeader[1] = cRegAddress; - - /* Puts the SPI chip select low to start the transaction */ - chip_sync_select(); - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus = _spi.write(aHeader[0]); - tmpstatus = tmpstatus << 8; - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus |= _spi.write(aHeader[1]); - - /* Writes the registers according to the number of bytes */ - for (int index = 0; index < cNbBytes; index++) - { - _spi.write(pcBuffer[index]); - } - - /* Puts the SPI chip select high to end the transaction */ - chip_sync_unselect(); - - return *pStatus; -} - - -/** -* @brief Read single or multiple SPIRIT1 register -* @param cRegAddress: base register's address to be read -* @param cNbBytes: number of registers and bytes to be read -* @param pcBuffer: pointer to the buffer of registers' values read -* @retval StatusBytes -*/ -StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer) -{ - return SimpleSpirit1::Instance().SdkEvalSpiReadRegisters(cRegAddress, cNbBytes, pcBuffer); -} - -StatusBytes SimpleSpirit1::SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer) -{ - uint16_t tmpstatus = 0x00; - StatusBytes *pStatus = (StatusBytes *)&tmpstatus; - - uint8_t aHeader[2] = {0}; - - /* Built the aHeader bytes */ - aHeader[0] = READ_HEADER; - aHeader[1] = cRegAddress; - - /* Put the SPI chip select low to start the transaction */ - chip_sync_select(); - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus = _spi.write(aHeader[0]); - tmpstatus = tmpstatus << 8; - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus |= _spi.write(aHeader[1]); - - for (int index = 0; index < cNbBytes; index++) - { - pcBuffer[index] = _spi.write(0xFF); - } - - /* Put the SPI chip select high to end the transaction */ - chip_sync_unselect(); - - return *pStatus; -} - - -/** -* @brief Send a command -* @param cCommandCode: command code to be sent -* @retval StatusBytes -*/ -StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode) -{ - return SimpleSpirit1::Instance().SdkEvalSpiCommandStrobes(cCommandCode); -} - -StatusBytes SimpleSpirit1::SdkEvalSpiCommandStrobes(uint8_t cCommandCode) -{ - uint8_t aHeader[2] = {0}; - uint16_t tmpstatus = 0x0000; - - StatusBytes *pStatus = (StatusBytes *)&tmpstatus; - - /* Built the aHeader bytes */ - aHeader[0] = COMMAND_HEADER; - aHeader[1] = cCommandCode; - - /* Puts the SPI chip select low to start the transaction */ - chip_sync_select(); - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus = _spi.write(aHeader[0]); - tmpstatus = tmpstatus<<8; - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus |= _spi.write(aHeader[1]); - - /* Puts the SPI chip select high to end the transaction */ - chip_sync_unselect(); - - return *pStatus; -} - - -/** -* @brief Write data into TX FIFO -* @param cNbBytes: number of bytes to be written into TX FIFO -* @param pcBuffer: pointer to data to write -* @retval StatusBytes -*/ -StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer) -{ - return SimpleSpirit1::Instance().SdkEvalSpiWriteFifo(cNbBytes, pcBuffer); -} - -StatusBytes SimpleSpirit1::SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer) -{ - uint16_t tmpstatus = 0x0000; - StatusBytes *pStatus = (StatusBytes *)&tmpstatus; - - uint8_t aHeader[2] = {0}; - - /* Built the aHeader bytes */ - aHeader[0] = WRITE_HEADER; - aHeader[1] = LINEAR_FIFO_ADDRESS; - - /* Put the SPI chip select low to start the transaction */ - chip_sync_select(); - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus = _spi.write(aHeader[0]); - tmpstatus = tmpstatus<<8; - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus |= _spi.write(aHeader[1]); - - /* Writes the registers according to the number of bytes */ - for (int index = 0; index < cNbBytes; index++) - { - _spi.write(pcBuffer[index]); - } - - /* Put the SPI chip select high to end the transaction */ - chip_sync_unselect(); - - return *pStatus; -} - -/** -* @brief Read data from RX FIFO -* @param cNbBytes: number of bytes to read from RX FIFO -* @param pcBuffer: pointer to data read from RX FIFO -* @retval StatusBytes -*/ -StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer) -{ - return SimpleSpirit1::Instance().SdkEvalSpiReadFifo(cNbBytes, pcBuffer); -} - -StatusBytes SimpleSpirit1::SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer) -{ - uint16_t tmpstatus = 0x0000; - StatusBytes *pStatus = (StatusBytes *)&tmpstatus; - - uint8_t aHeader[2]; - - /* Built the aHeader bytes */ - aHeader[0]=READ_HEADER; - aHeader[1]=LINEAR_FIFO_ADDRESS; - - /* Put the SPI chip select low to start the transaction */ - chip_sync_select(); - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus = _spi.write(aHeader[0]); - tmpstatus = tmpstatus<<8; - - /* Write the aHeader bytes and read the SPIRIT1 status bytes */ - tmpstatus |= _spi.write(aHeader[1]); - - for (int index = 0; index < cNbBytes; index++) - { - pcBuffer[index] = _spi.write(0xFF); - } - - /* Put the SPI chip select high to end the transaction */ - chip_sync_unselect(); - - return *pStatus; -} - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/stm-spirit1-rf-driver/NanostackRfPhySpirit1.h --- a/stm-spirit1-rf-driver/stm-spirit1-rf-driver/NanostackRfPhySpirit1.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -#ifndef NANOSTACK_RF_PHY_SPIRIT1_H_ -#define NANOSTACK_RF_PHY_SPIRIT1_H_ - -#include <stdint.h> - -#include "NanostackRfPhy.h" -#include "PinNames.h" - -// Arduino pin defaults for convenience -#if !defined(SPIRIT1_SPI_MOSI) -#define SPIRIT1_SPI_MOSI D11 -#endif -#if !defined(SPIRIT1_SPI_MISO) -#define SPIRIT1_SPI_MISO D12 -#endif -#if !defined(SPIRIT1_SPI_SCLK) -#define SPIRIT1_SPI_SCLK D13 -#endif -#if !defined(SPIRIT1_DEV_IRQ) -#define SPIRIT1_DEV_IRQ D9 -#endif -#if !defined(SPIRIT1_DEV_CS) -#define SPIRIT1_DEV_CS D10 -#endif -#if !defined(SPIRIT1_DEV_SDN) -#define SPIRIT1_DEV_SDN D2 -#endif -#if !defined(SPIRIT1_BRD_LED) -#define SPIRIT1_BRD_LED NC -#endif - -class NanostackRfPhySpirit1 : public NanostackRfPhy { -public: - NanostackRfPhySpirit1(PinName spi_mosi, PinName spi_miso, PinName spi_sclk, - PinName dev_irq, PinName dev_cs, PinName dev_sdn, PinName brd_led); - ~NanostackRfPhySpirit1(); - int8_t rf_register(); - void rf_unregister(); - void get_mac_address(uint8_t *mac); - void set_mac_address(uint8_t *mac); - -private: - void rf_init(void); - - const PinName _spi_mosi; - const PinName _spi_miso; - const PinName _spi_sclk; - const PinName _dev_irq; - const PinName _dev_cs; - const PinName _dev_sdn; - const PinName _brd_led; -}; - -#endif /* NANOSTACK_RF_PHY_SPIRIT1_H_ */
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/stm-spirit1-rf-driver/SimpleSpirit1.h --- a/stm-spirit1-rf-driver/stm-spirit1-rf-driver/SimpleSpirit1.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,562 +0,0 @@ -/*** Mbed Includes ***/ -#include "mbed.h" -#include "mbed_debug.h" - - -/*** Cube Includes ***/ -#include "SPIRIT_Radio.h" -#include "SPIRIT_Management.h" -#include "SPIRIT_Commands.h" -#include "MCU_Interface.h" - - -/*** Contiki Lib Includes ***/ -#include "spirit1.h" -#include "spirit1-config.h" -#include "spirit1-const.h" - - -// betzw: enable beyond macro if you want debug messages also from IRQ handler -// #define DEBUG_IRQ - - -/*** Macros from Cube Implementation ***/ -#define CLEAR_TXBUF() (spirit_tx_len = 0) -#define IS_RXBUF_EMPTY() (spirit_rx_len == 0) -#define CLEAR_RXBUF() do { \ - spirit_rx_len = 0; \ - _spirit_rx_pos = 0; \ - } while(0) - - -/*** Macros from Cube Implementation ***/ -/* transceiver state. */ -#define ON 0 -#define OFF 1 - - -/*** Macros for Spirit1 API ***/ -/* max payload */ -#define SPIRIT1_MAX_PAYLOAD (MAX_PACKET_LEN) - - -/*** Missing Cube External Declarations ***/ -extern "C" void SpiritManagementSetFrequencyBase(uint32_t); - - -/*** UnlockedSPI for Usage in IRQ context ***/ -class UnlockedSPI : public SPI { -public: - UnlockedSPI(PinName mosi, PinName miso, PinName sclk) : - SPI(mosi, miso, sclk) { } - virtual ~UnlockedSPI() {} - virtual void lock() { } - virtual void unlock() { } -}; - - -/*** A Simple Spirit1 Class ***/ -// NOTE: must be a singleton (due to mix of MBED/CUBE code)!!! -// NOTE: implementation is IRQ-save but (intentionally) NOT thread-safe!!! -/** Simple Spirit1 Class - * - * @Note Synchronization level: implementation is IRQ-save but (intentionally) NOT thread-safe!!! - * - * Example: - * @code - * #include "mbed.h" - * #include "SimpleSpirit1.h" - * - * static char send_buf[] = "Hello World!"; - * - * static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(D11, D12, D3, D9, D10, D2); - * - * static volatile bool tx_done_flag = false; - * - * static void callback_func(int event) - * { - * if (event == SimpleSpirit1::TX_DONE) { - * tx_done_flag = true; - * } - * } - * - * int main() - * { - * myspirit.attach_irq_callback(callback_func); - * myspirit.on(); - * - * while(1) - * { - * size_t curr_len = strlen((const char*)send_buf); - * myspirit.send(send_buf, curr_len); - * - * while(!tx_done_flag); - * tx_done_flag = false; - * } - * } - * @endcode - */ -class SimpleSpirit1 { - protected: - static SimpleSpirit1 *_singleton; - - /** Communication Interface Instance Variables **/ - UnlockedSPI _spi; // betzw - NOTE: Morpho/Zio pins are valid only for NUCLEO-F401RE - // mosi: PA_7 (D11) - // miso: PA_6 (D12) - // sclk: PB_3 (D3) or - // PA_5 (D13) (only in case you unmount R4 & mount R7, - // (note: in this case you may not use LED1 on some platforms) - // bits: 8-bit - // mode: 0 - // ordr: MSB - // freq: max 10MHz - InterruptIn _irq; // PC_7 (D9) (falling) - DigitalOut _chip_select; // PB_6 (D10) ('1' == chip unselected) - DigitalOut _shut_down; // PA_10 (D2) ('1' == shut_down) - DigitalOut _led; // PB_4 (D5) (optional) - - Callback<void(int)> _current_irq_callback; - Timeout _rx_receiving_timeout; - - void rx_timeout_handler(void) { - set_ready_state(); - cmd_strobe(SPIRIT1_STROBE_RX); -#ifdef DEBUG_IRQ - debug("\r\n%s (%d)\r\n", __func__, __LINE__); -#endif - } - - void start_rx_timeout(void) { - _rx_receiving_timeout.attach_us(Callback<void()>(this, &SimpleSpirit1::rx_timeout_handler), 100 * 1000); // 100ms - } - - void stop_rx_timeout(void) { - _rx_receiving_timeout.detach(); - } - - /** Static Variables from Cube Implementation **/ - /* - * The buffers which hold incoming data. - * The +1 because of the first byte, - * which will contain the length of the packet. - */ - volatile uint16_t spirit_tx_len; - volatile bool _spirit_tx_started; - volatile uint16_t spirit_rx_len; - volatile uint16_t _spirit_rx_pos; - volatile bool _spirit_rx_err; - uint8_t spirit_rx_buf[MAX_PACKET_LEN]; - volatile bool _is_receiving; - - /** Status Variables from Cube Implementation **/ - unsigned int spirit_on; - uint8_t last_rssi; //MGR - uint8_t last_sqi; //MGR - - /** Low Level Instance Variables **/ - unsigned int _nr_of_irq_disables; - - /** Low Level Instance Methods **/ - void disable_spirit_irq(void) { - _irq.disable_irq(); - _nr_of_irq_disables++; -#ifndef NDEBUG - debug_if(_nr_of_irq_disables == 0, "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - } - - void enable_spirit_irq(void) { -#ifndef NDEBUG - debug_if(_nr_of_irq_disables == 0, "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__); -#endif - if(--_nr_of_irq_disables == 0) - _irq.enable_irq(); - } - - void chip_select() { _chip_select = 0; } - void chip_unselect() { _chip_select = 1; } - - void enter_shutdown() { - _shut_down = 1; - wait_ms(5); // wait 5 milliseconds (to allow Spirit1 to shut down) - } - - void exit_shutdown() { - _shut_down = 0; - wait_ms(10); // wait 10 milliseconds (to allow Spirit1 a proper boot-up sequence) - } - - void cs_to_sclk_delay(void) { - wait_us(1); // heuristic value - } - - /** - * @brief Write and read a buffer to/from the SPI peripheral device at the same time - * in 8-bit data mode using synchronous SPI communication. - * @param[in] pBufferToWrite pointer to the buffer of data to send. - * @param[out] pBufferToRead pointer to the buffer to read data into. - * @param[in] NumBytes number of bytes to read and write. - * @retval 0 if ok. - * @retval -1 if data format error. - * @note When using the SPI in Interrupt-mode, remember to disable interrupts - * before calling this function and to enable them again after. - */ - void spi_write_read(uint8_t* pBufferToWrite, uint8_t* pBufferToRead, uint16_t NumBytes) - { - /* Read and write data at the same time. */ - for (int i = 0; i < NumBytes; i++) { - pBufferToRead[i] = _spi.write(pBufferToWrite[i]); - } - } - - /** Radio Instance Methods **/ - void radio_set_xtal_freq(uint32_t freq) { - SpiritRadioSetXtalFrequency(freq); - } - - void radio_set_pa_level_dbm(uint8_t cIndex, float fPowerdBm) { - SpiritRadioSetPALeveldBm(cIndex, fPowerdBm); - } - - void radio_set_pa_level_max_index(uint8_t cIndex) { - SpiritRadioSetPALevelMaxIndex(cIndex); - } - - uint8_t radio_init(SRadioInit *init_struct) { - return SpiritRadioInit(init_struct); - } - - void radio_persistent_rx(SpiritFunctionalState xNewState) { - SpiritRadioPersistenRx(xNewState); - } - - void radio_afc_freeze_on_sync(SpiritFunctionalState xNewState) { - SpiritRadioAFCFreezeOnSync(xNewState); - } - - /** Packet System Instance Methods **/ - void pkt_basic_init(PktBasicInit* pxPktBasicInit) { - SpiritPktBasicInit(pxPktBasicInit); - } - - void pkt_basic_set_payload_length(uint16_t nPayloadLength) { - SpiritPktBasicSetPayloadLength(nPayloadLength); - } - - uint16_t pkt_basic_get_received_pkt_length(void) { - return SpiritPktBasicGetReceivedPktLength(); - } - - /** IRQ Instance Methods **/ - void irq_de_init(SpiritIrqs* pxIrqInit) { - SpiritIrqDeInit(pxIrqInit); - } - - void irq_clear_status(void) { - SpiritIrqClearStatus(); - } - - void irq_set_status(IrqList xIrq, SpiritFunctionalState xNewState) { - SpiritIrq(xIrq, xNewState); - } - - void irq_get_status(SpiritIrqs* pxIrqStatus) { - SpiritIrqGetStatus(pxIrqStatus); - } - - /** Management Instance Methods **/ - void mgmt_set_freq_base(uint32_t freq) { - SpiritManagementSetFrequencyBase(freq); - } - - void mgmt_refresh_status(void) { - SpiritRefreshStatus(); - } - - /** Spirit GPIO Instance Methods **/ - void spirit_gpio_init(SGpioInit* pxGpioInitStruct) { - SpiritGpioInit(pxGpioInitStruct); - } - - /** Qi Instance Methods **/ - void qi_set_sqi_threshold(SqiThreshold xSqiThr) { - SpiritQiSetSqiThreshold(xSqiThr); - } - - void qi_sqi_check(SpiritFunctionalState xNewState) { - SpiritQiSqiCheck(xNewState); - } - - void qi_set_rssi_threshold_dbm(int nDbmValue) { - SpiritQiSetRssiThresholddBm(nDbmValue); - } - - float qi_get_rssi_dbm() { - last_rssi = qi_get_rssi(); - return get_last_rssi_dbm(); - } - - uint8_t qi_get_rssi() { - return SpiritQiGetRssi(); - } - - uint8_t qi_get_sqi() { - return SpiritQiGetSqi(); - } - - /** Timer Instance Methods **/ - void timer_set_rx_timeout_stop_condition(RxTimeoutStopCondition xStopCondition) { - SpiritTimerSetRxTimeoutStopCondition(xStopCondition); - } - - void timer_set_rx_timeout_counter(uint8_t cCounter) { - SpiritTimerSetRxTimeoutCounter(cCounter); - } - - void timer_set_infinite_rx_timeout(void) { - timer_set_rx_timeout_counter(0); - } - - /** CSMA/CA Instance Methods **/ - void csma_ca_state(SpiritFunctionalState xNewState) { - SpiritCsma(xNewState); - } - - void csma_ca_init(CsmaInit* pxCsmaInit) { - csma_ca_state(S_DISABLE); // Disabled at init - SpiritCsmaInit(pxCsmaInit); - SpiritCsmaSeedReloadMode(S_DISABLE); // always disable seed reload - } - - /** Command Instance Methods**/ - void cmd_strobe(uint8_t cmd) { - SpiritCmdStrobeCommand((SpiritCmd)cmd); - } - - void cmd_strobe_flush_rx_fifo() { - SpiritCmdStrobeCommand(CMD_FLUSHRXFIFO); - } - - /** SPI Instance Methods **/ - StatusBytes spi_write_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) { - return SdkEvalSpiWriteFifo(cNbBytes, pcBuffer); - } - - StatusBytes spi_read_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) { - return SdkEvalSpiReadFifo(cNbBytes, pcBuffer); - } - - /** Linear FIFO Instance Methods **/ - uint8_t linear_fifo_read_num_elements_rx_fifo(void) { - return SpiritLinearFifoReadNumElementsRxFifo(); - } - - uint8_t linear_fifo_read_num_elements_tx_fifo(void) { - return SpiritLinearFifoReadNumElementsTxFifo(); - } - - void linear_fifo_set_almost_full_thr_rx(uint8_t cThrRxFifo) { - SpiritLinearFifoSetAlmostFullThresholdRx(cThrRxFifo); - } - - /** Calibration Instance Methods **/ - void calibration_rco(SpiritFunctionalState xNewState) { - SpiritCalibrationRco(xNewState); - } - - /** Internal Spirit Methods */ - void set_ready_state(void); - uint8_t refresh_state(void); - - /** Friend Functions **/ - friend StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); - friend StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); - friend StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode); - friend StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - friend StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - - /** Sdk Instance Methods **/ - StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); - StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); - StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode); - StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - - /** Helper Instance Methods **/ - void chip_sync_select() { - disable_spirit_irq(); - chip_select(); - cs_to_sclk_delay(); - } - - void chip_sync_unselect() { - chip_unselect(); - enable_spirit_irq(); - } - - /** Init Instance Method **/ - void init(); - - /** Spirit Irq Callback */ - void IrqHandler(); - - /** Constructor **/ - SimpleSpirit1(PinName mosi, PinName miso, PinName sclk, - PinName irq, PinName cs, PinName sdn, - PinName led); - - /** Destructor **/ - ~SimpleSpirit1(void); // should never be called! - -public: - enum { - RX_DONE, - TX_DONE, - TX_ERR - }; - - /** Create singleton instance of 'SimpleSpirit1' - * - * @param mosi 'PinName' of mosi pin to use - * @param miso 'PinName' of miso pin to use - * @param sclk 'PinName' of clock pin to use - * @param irq 'PinName' of interrupt pin to use - * @param cs 'PinName' of chip-select pin pin to use - * @param sdn 'PinName' of pin to use for device shutdown - * - * @returns reference to singleton instance - */ - static SimpleSpirit1& CreateInstance(PinName mosi, PinName miso, PinName sclk, - PinName irq, PinName cs, PinName sdn, - PinName led = NC) { - - if(_singleton == NULL) { - _singleton = new SimpleSpirit1(mosi, miso, sclk, - irq, cs, sdn, led); - _singleton->init(); - } else { - error("SimpleSpirit1 singleton already created!\n"); - } - - return *_singleton; - } - - - /** Create singleton instance of 'SimpleSpirit1' - * - * @param mosi 'PinName' of mosi pin to use - * @param miso 'PinName' of miso pin to use - * @param sclk 'PinName' of clock pin to use - * @param irq 'PinName' of interrupt pin to use - * @param cs 'PinName' of chip-select pin pin to use - * @param sdn 'PinName' of pin to use for device shutdown - * - * @returns reference to singleton instance - */ - static SimpleSpirit1& Instance() { - if(_singleton == NULL) { - error("SimpleSpirit1 must be created before used!\n"); - } - - return *_singleton; - } - - /** Attach a function to be called by the Spirit Irq handler when an event has occurred - * - * @param func A void(int) callback, or 0 to set as none - * - * @note Function 'func' will be executed in interrupt context! - * @note Function 'func' will be call with either 'RX_DONE', 'TX_DONE', or 'TX_ERR' as parameter - * to indicate which event has occurred. - */ - void attach_irq_callback(Callback<void(int)> func) { - _current_irq_callback = func; - } - - /** Switch Radio On - */ - int on(void); - /** Switch Radio Off - */ - int off(void); - - /** Set Channel - */ - void set_channel(uint8_t channel) { - SpiritRadioSetChannel(channel); - } - - /** Send a Buffer - * - * @param payload pointer to buffer to be send - * @param payload_len length of payload buffer in bytes - * @param use_csma_ca should CSMA/CA be enabled for transmission - * - * @returns zero in case of success, non-zero error code otherwise - * - * @note the maximum payload size in bytes allowed is defined by macro 'SPIRIT1_MAX_PAYLOAD' - */ - int send(const void *payload, unsigned int payload_len, bool use_csma_ca = true); - - /** Copy received data into buffer - * - * @param buf pointer to buffer to be filled - * @param bufsize size of buffer - * - * @returns number of bytes copied into the buffer - * - * @note the buffer should be (at least) of size 'SPIRIT1_MAX_PAYLOAD' (in bytes). - */ - int read(void *buf, unsigned int bufsize); - - /** Perform a Clear-Channel Assessment (CCA) to find out if there is a packet in the air or not. - * - * @returns 1 if packet has been seen. - */ - int channel_clear(void); - - /** Check if the radio driver has just received a packet - */ - int get_pending_packet(void); - - /** Is radio currently receiving - */ - bool is_receiving(void) { - return _is_receiving; - } - - /** Get latest value of RSSI (in dBm) - */ - float get_last_rssi_dbm(void) { - get_last_rssi_raw(); - return (-120.0+((float)(last_rssi-20))/2); - } - - /** Get latest value of RSSI (as Spirit1 raw value) - */ - uint8_t get_last_rssi_raw(void) { - if(last_rssi == 0) { - last_rssi = qi_get_rssi(); - } - return last_rssi; - } - - /** Get latest value of LQI (scaled to 8-bit) - */ - uint8_t get_last_sqi(void) { - const uint8_t max_sqi = 8 * ((SYNC_LENGTH>>1)+1); - if(last_sqi == 0) { - last_sqi = qi_get_sqi(); - } - if(last_sqi > max_sqi) last_sqi = max_sqi; - - return (last_sqi * 255 / max_sqi); - } - - /** Reset Board - */ - void reset_board() { - init(); - } -};
diff -r d802c6ed2e75 -r 1a6faeda6579 stm-spirit1-rf-driver/stm-spirit1-rf-driver/radio_spi.h --- a/stm-spirit1-rf-driver/stm-spirit1-rf-driver/radio_spi.h Wed Jan 17 04:04:16 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,185 +0,0 @@ -/** -****************************************************************************** -* @file radio_spi.h -* @author System Lab - NOIDA -* @version V1.0.0 -* @date 15-May-2014 -* @brief This file contains all the functions prototypes for SPI . -****************************************************************************** -* @attention -* -* <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* 1. Redistributions 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 STMicroelectronics nor the names of its contributors -* may be used to endorse or promote products derived from this software -* without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. -* -****************************************************************************** -*/ - - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RADIO_SPI_H -#define __RADIO_SPI_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#ifdef USE_STM32L1XX_NUCLEO -// #include "stm32l1xx_hal.h" -#endif - -#ifdef USE_STM32F4XX_NUCLEO -// #include "stm32f4xx_hal.h" -#endif -#include "SPIRIT_Config.h" -#include "radio_spi.h" -// #include "spirit1-arch.h" - -/** - * @addtogroup BSP - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - - -/* Exported constants --------------------------------------------------------*/ - - -/* Exported macro ------------------------------------------------------------*/ - /* Define for SPIRIT1 board */ - #if !defined (USE_SPIRIT1_DEFAULT) - #define USE_SPIRIT1_DEFAULT -#endif - -/* SPIRIT1_Spi_config */ -/* SPI1 */ -#define RADIO_SPI SPI1 -#define RADIO_SPI_CLK_ENABLE() __SPI1_CLK_ENABLE() -#define RADIO_SPI_CLK_DISABLE() __SPI1_CLK_DISABLE() - -#define RADIO_SPI_MISO_PORT GPIOA -#define RADIO_SPI_MISO_PIN GPIO_PIN_6 -#define RADIO_SPI_MISO_CLOCK_ENABLE() __GPIOA_CLK_ENABLE() -#define RADIO_SPI_MISO_CLOCK_DISABLE() __GPIOA_CLK_DISABLE() - -#define RADIO_SPI_MOSI_PORT GPIOA -#define RADIO_SPI_MOSI_PIN GPIO_PIN_7 -#define RADIO_SPI_MOSI_CLOCK_ENABLE() __GPIOA_CLK_ENABLE() -#define RADIO_SPI_MOSI_CLOCK_DISABLE() __GPIOA_CLK_DISABLE() - - - -#ifdef USE_SPIRIT1_DEFAULT - -#define RADIO_SPI_SCK_PORT GPIOB -#define RADIO_SPI_SCK_PIN GPIO_PIN_3 -#define RADIO_SPI_SCK_CLOCK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_SPI_SCK_CLOCK_DISABLE() __GPIOB_CLK_DISABLE() - - -#define RADIO_SPI_CS_PORT GPIOB -#define RADIO_SPI_CS_PIN GPIO_PIN_6 -#define RADIO_SPI_CS_CLOCK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_SPI_CS_CLOCK_DISABLE() __GPIOB_CLK_DISABLE() - -#else - -#define RADIO_SPI_SCK_PORT GPIOB -#define RADIO_SPI_SCK_PIN GPIO_PIN_3 -#define RADIO_SPI_SCK_CLOCK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_SPI_SCK_CLOCK_DISABLE() __GPIOB_CLK_DISABLE() - - -#define RADIO_SPI_CS_PORT GPIOB -#define RADIO_SPI_CS_PIN GPIO_PIN_6 -#define RADIO_SPI_CS_CLOCK_ENABLE() __GPIOB_CLK_ENABLE() -#define RADIO_SPI_CS_CLOCK_DISABLE() __GPIOB_CLK_DISABLE() - -#endif - -/* Maximum Timeout values for flags waiting loops. These timeouts are not based - on accurate values, they just guarantee that the application will not remain - stuck if the SPI communication is corrupted. - You may modify these timeout values depending on CPU frequency and application - conditions (interrupts routines ...) */ -#define RADIO_SPI_TIMEOUT_MAX ((uint32_t)1000) - -/* SPIRIT1_Spi_config_Private_Defines */ -#define CS_TO_SCLK_DELAY 0x0200//FIXME what is this doing? -#define CLK_TO_CS_DELAY 0x0001 - -/* SPIRIT1_Spi_config_Headers */ -#define HEADER_WRITE_MASK 0x00 /*!< Write mask for header byte*/ -#define HEADER_READ_MASK 0x01 /*!< Read mask for header byte*/ -#define HEADER_ADDRESS_MASK 0x00 /*!< Address mask for header byte*/ -#define HEADER_COMMAND_MASK 0x80 /*!< Command mask for header byte*/ - -#define LINEAR_FIFO_ADDRESS 0xFF /*!< Linear FIFO address*/ - -/* SPIRIT1_Spi_config_Private_FunctionPrototypes */ -#define SPI_ENTER_CRITICAL() IRQ_DISABLE() -#define SPI_EXIT_CRITICAL() IRQ_ENABLE() - -/* SPIRIT1_Spi_config_Private_Functions */ -#define RadioSpiCSLow() HAL_GPIO_WritePin(RADIO_SPI_CS_PORT, RADIO_SPI_CS_PIN, GPIO_PIN_RESET) -#define RadioSpiCSHigh() HAL_GPIO_WritePin(RADIO_SPI_CS_PORT, RADIO_SPI_CS_PIN, GPIO_PIN_SET) - -/* SPIRIT1_Spi_config_Private_Macros */ -#define BUILT_HEADER(add_comm, w_r) (add_comm | w_r) /*!< macro to build the header byte*/ -#define WRITE_HEADER BUILT_HEADER(HEADER_ADDRESS_MASK, HEADER_WRITE_MASK) /*!< macro to build the write - header byte*/ -#define READ_HEADER BUILT_HEADER(HEADER_ADDRESS_MASK, HEADER_READ_MASK) /*!< macro to build the read - header byte*/ -#define COMMAND_HEADER BUILT_HEADER(HEADER_COMMAND_MASK, HEADER_WRITE_MASK) /*!< macro to build the command - header byte*/ - - - -/* Exported Variables --------------------------------------------------------*/ - - -/* Exported functions ------------------------------------------------------- */ -void SdkEvalSpiInit(void); -// void SpiCSGpioSetLevel(GPIO_PinState xState); -StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode); -StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer); -StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer); - - -#ifdef __cplusplus -} -#endif -#endif /*__RADIO_SPI_H */ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/