|
|
|
@ -45,7 +45,8 @@
|
|
|
|
#define SI4432_SPI SPI1
|
|
|
|
#define SI4432_SPI SPI1
|
|
|
|
//#define SI4432_SPI_SPEED SPI_BR_DIV64
|
|
|
|
//#define SI4432_SPI_SPEED SPI_BR_DIV64
|
|
|
|
//#define SI4432_SPI_SPEED SPI_BR_DIV32
|
|
|
|
//#define SI4432_SPI_SPEED SPI_BR_DIV32
|
|
|
|
#define SI4432_SPI_SPEED SPI_BR_DIV4
|
|
|
|
#define SI4432_SPI_SPEED SPI_BR_DIV4
|
|
|
|
|
|
|
|
#define SI4432_SPI_FASTSPEED SPI_BR_DIV2
|
|
|
|
|
|
|
|
|
|
|
|
//#define ADF_SPI_SPEED SPI_BR_DIV64
|
|
|
|
//#define ADF_SPI_SPEED SPI_BR_DIV64
|
|
|
|
//#define ADF_SPI_SPEED SPI_BR_DIV32
|
|
|
|
//#define ADF_SPI_SPEED SPI_BR_DIV32
|
|
|
|
@ -828,14 +829,14 @@ static uint8_t SI4463_read_byte( uint8_t ADR )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
uint8_t DATA ;
|
|
|
|
uint8_t DATA ;
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
// SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
|
|
|
|
|
|
|
|
__disable_irq();
|
|
|
|
// __disable_irq();
|
|
|
|
SI_CS_LOW;
|
|
|
|
SI_CS_LOW;
|
|
|
|
shiftOut( ADR );
|
|
|
|
shiftOut( ADR );
|
|
|
|
DATA = shiftIn();
|
|
|
|
DATA = shiftIn();
|
|
|
|
SI_CS_HIGH;
|
|
|
|
SI_CS_HIGH;
|
|
|
|
__enable_irq();
|
|
|
|
// __enable_irq();
|
|
|
|
|
|
|
|
|
|
|
|
return DATA ;
|
|
|
|
return DATA ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -864,34 +865,19 @@ static uint8_t SI4463_get_response(void* buff, uint8_t len)
|
|
|
|
return cts;
|
|
|
|
return cts;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t SI4463_wait_response(void* buff, uint8_t len, uint8_t use_timeout)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
uint16_t timeout = 40000;
|
|
|
|
|
|
|
|
while(!SI4463_get_response(buff, len))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
my_microsecond_delay(1);
|
|
|
|
|
|
|
|
if(use_timeout && !--timeout)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
((char *)buff)[0] = 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SI_FAST_SPEED SPI_BR_DIV4
|
|
|
|
#define SI_FAST_SPEED SPI_BR_DIV4
|
|
|
|
|
|
|
|
|
|
|
|
void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen)
|
|
|
|
void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
SPI_BR_SET(SI4432_SPI, SI_FAST_SPEED);
|
|
|
|
// SPI_BR_SET(SI4432_SPI, SI_FAST_SPEED);
|
|
|
|
|
|
|
|
|
|
|
|
#define SHORT_DELAY my_microsecond_delay(1)
|
|
|
|
#define SHORT_DELAY my_microsecond_delay(1)
|
|
|
|
//#define SHORT_DELAY
|
|
|
|
//#define SHORT_DELAY
|
|
|
|
|
|
|
|
|
|
|
|
while (!SI4463_READ_CTS) {SHORT_DELAY; } // Wait for CTS
|
|
|
|
while (!SI4463_READ_CTS) {SHORT_DELAY; } // Wait for CTS
|
|
|
|
|
|
|
|
|
|
|
|
__disable_irq();
|
|
|
|
// __disable_irq();
|
|
|
|
SI_CS_LOW;
|
|
|
|
SI_CS_LOW;
|
|
|
|
|
|
|
|
|
|
|
|
while(SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes
|
|
|
|
while(SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes
|
|
|
|
@ -914,7 +900,7 @@ void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen)
|
|
|
|
|
|
|
|
|
|
|
|
if(out != NULL) { // If we have an output buffer then read command response into it
|
|
|
|
if(out != NULL) { // If we have an output buffer then read command response into it
|
|
|
|
SI_CS_LOW;
|
|
|
|
SI_CS_LOW;
|
|
|
|
SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
// SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
#if 0
|
|
|
|
#if 0
|
|
|
|
SPI_WRITE_8BIT(SI4432_SPI,SI446X_CMD_READ_CMD_BUFF);
|
|
|
|
SPI_WRITE_8BIT(SI4432_SPI,SI446X_CMD_READ_CMD_BUFF);
|
|
|
|
while (SPI_IS_BUSY(SI4432_SPI)) // drop rx and wait tx
|
|
|
|
while (SPI_IS_BUSY(SI4432_SPI)) // drop rx and wait tx
|
|
|
|
@ -939,7 +925,7 @@ void SI4463_do_api(void* data, uint8_t len, void* out, uint8_t outLen)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SI_CS_HIGH;
|
|
|
|
SI_CS_HIGH;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
__enable_irq();
|
|
|
|
// __enable_irq();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef notused
|
|
|
|
#ifdef notused
|
|
|
|
@ -1272,7 +1258,7 @@ static uint8_t SI4463_get_device_status(void)
|
|
|
|
uint8_t getFRR(uint8_t reg)
|
|
|
|
uint8_t getFRR(uint8_t reg)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
// SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
|
|
|
|
|
|
|
|
return SI4463_read_byte(reg);
|
|
|
|
return SI4463_read_byte(reg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1399,15 +1385,32 @@ static int buf_index = 0;
|
|
|
|
static bool buf_read = false;
|
|
|
|
static bool buf_read = false;
|
|
|
|
uint32_t old_t = 0;
|
|
|
|
uint32_t old_t = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char Si446x_readRSSI(void){
|
|
|
|
|
|
|
|
SI_CS_LOW;
|
|
|
|
|
|
|
|
SPI_WRITE_8BIT(SI4432_SPI, SI446X_CMD_GET_MODEM_STATUS);
|
|
|
|
|
|
|
|
while (SPI_IS_BUSY(SI4432_SPI)) ; // wait tx
|
|
|
|
|
|
|
|
SI_CS_HIGH;
|
|
|
|
|
|
|
|
while (!SI4463_READ_CTS); // Wait for CTS
|
|
|
|
|
|
|
|
SI_CS_LOW;
|
|
|
|
|
|
|
|
SPI_WRITE_8BIT(SI4432_SPI, SI446X_CMD_READ_CMD_BUFF); // read answer
|
|
|
|
|
|
|
|
while (SPI_IS_BUSY(SI4432_SPI)) ; // wait tx
|
|
|
|
|
|
|
|
SPI_READ_16BIT(SI4432_SPI); // Drop SI446X_CMD_GET_MODEM_STATUS read and SI446X_CMD_READ_CMD_BUFF read
|
|
|
|
|
|
|
|
SPI_WRITE_16BIT(SI4432_SPI, 0x00); // begin read 2 bytes
|
|
|
|
|
|
|
|
SPI_WRITE_16BIT(SI4432_SPI, 0x00); // next read 2 bytes
|
|
|
|
|
|
|
|
while (SPI_IS_BUSY(SI4432_SPI)); // wait tx
|
|
|
|
|
|
|
|
SPI_READ_8BIT(SI4432_SPI); // MODEM_PEND
|
|
|
|
|
|
|
|
SPI_READ_8BIT(SI4432_SPI); // MODEM_STATUS
|
|
|
|
|
|
|
|
SPI_READ_8BIT(SI4432_SPI); // CURR_RSSI
|
|
|
|
|
|
|
|
char rssi = SPI_READ_8BIT(SI4432_SPI); // LATCH_RSSI
|
|
|
|
|
|
|
|
SI_CS_HIGH;
|
|
|
|
|
|
|
|
return rssi;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SI446x_Fill(int s, int start)
|
|
|
|
void SI446x_Fill(int s, int start)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
(void)s;
|
|
|
|
(void)s;
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
set_SPI_mode(SPI_MODE_SI);
|
|
|
|
|
|
|
|
SI4432_Sel = s;
|
|
|
|
|
|
|
|
uint16_t sel = SI_nSEL[SI4432_Sel];
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SPI_BR_SET(SI4432_SPI, SI4432_SPI_FASTSPEED);
|
|
|
|
uint32_t t = setting.additional_step_delay_us;
|
|
|
|
uint32_t t = setting.additional_step_delay_us;
|
|
|
|
if (t < old_t +100 && t + 100 > old_t) { // avoid oscillation
|
|
|
|
if (t < old_t +100 && t + 100 > old_t) { // avoid oscillation
|
|
|
|
t = (t + old_t) >> 1;
|
|
|
|
t = (t + old_t) >> 1;
|
|
|
|
@ -1415,49 +1418,16 @@ void SI446x_Fill(int s, int start)
|
|
|
|
old_t = t;
|
|
|
|
old_t = t;
|
|
|
|
// __disable_irq();
|
|
|
|
// __disable_irq();
|
|
|
|
systime_t measure = chVTGetSystemTimeX();
|
|
|
|
systime_t measure = chVTGetSystemTimeX();
|
|
|
|
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
|
|
|
|
if (0) {
|
|
|
|
|
|
|
|
uint8_t data[] = {0x12, 0x02, 0x04, 0x00};
|
|
|
|
|
|
|
|
// SI4463_do_api(data, sizeof(data), NULL, 0 );
|
|
|
|
|
|
|
|
// data[0] = 0x12;
|
|
|
|
|
|
|
|
SI4463_do_api(data, 4, data, 4 );
|
|
|
|
|
|
|
|
age[0] = getFRR(SI446X_CMD_READ_FRR_A);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int i = start;
|
|
|
|
int i = start;
|
|
|
|
uint8_t data[4];
|
|
|
|
while(SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes
|
|
|
|
|
|
|
|
while (!SI4463_READ_CTS); // Wait for CTS
|
|
|
|
do {
|
|
|
|
do {
|
|
|
|
again:
|
|
|
|
age[i] = Si446x_readRSSI();
|
|
|
|
#if 1
|
|
|
|
|
|
|
|
data[0] = SI446X_CMD_GET_MODEM_STATUS;
|
|
|
|
|
|
|
|
data[1] = 0xFF;
|
|
|
|
|
|
|
|
SI4463_do_api(data, 1, data, 3); // TODO no clear of interrups
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
if (data[2] == 0) {
|
|
|
|
|
|
|
|
if (i > 0)
|
|
|
|
|
|
|
|
data[2] = age[i-1];
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
goto again;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data[2] == 255) goto again;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (i >= 0)
|
|
|
|
|
|
|
|
age[i]=(char)data[2]; // Skip first RSSI
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
if (i>=0) {
|
|
|
|
|
|
|
|
SI4463_wait_for_cts();
|
|
|
|
|
|
|
|
age[i] = getFRR(SI446X_CMD_READ_FRR_A);
|
|
|
|
|
|
|
|
// else
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (++i >= sweep_points) break;
|
|
|
|
if (++i >= sweep_points) break;
|
|
|
|
if (t)
|
|
|
|
if (t)
|
|
|
|
my_microsecond_delay(t);
|
|
|
|
my_microsecond_delay(t);
|
|
|
|
} while(1);
|
|
|
|
} while(1);
|
|
|
|
#else
|
|
|
|
// SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
|
|
|
|
shiftInBuf(sel, SI4432_REG_RSSI, &age[start], sweep_points - start, t);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setting.measure_sweep_time_us = (chVTGetSystemTimeX() - measure)*100;
|
|
|
|
setting.measure_sweep_time_us = (chVTGetSystemTimeX() - measure)*100;
|
|
|
|
// __enable_irq();
|
|
|
|
// __enable_irq();
|
|
|
|
buf_index = (start<=0 ? 0 : start); // Is used to skip 1st entry during level triggering
|
|
|
|
buf_index = (start<=0 ? 0 : start); // Is used to skip 1st entry during level triggering
|
|
|
|
@ -1509,17 +1479,10 @@ void SI4432_Listen(int s)
|
|
|
|
uint8_t max = 0;
|
|
|
|
uint8_t max = 0;
|
|
|
|
uint16_t count = 0;
|
|
|
|
uint16_t count = 0;
|
|
|
|
operation_requested = OP_NONE;
|
|
|
|
operation_requested = OP_NONE;
|
|
|
|
|
|
|
|
while(SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes
|
|
|
|
|
|
|
|
while (!SI4463_READ_CTS); // Wait for CTS
|
|
|
|
do {
|
|
|
|
do {
|
|
|
|
uint8_t v;
|
|
|
|
uint8_t v = Si446x_readRSSI();
|
|
|
|
uint8_t data[3] = {
|
|
|
|
|
|
|
|
SI446X_CMD_GET_MODEM_STATUS,
|
|
|
|
|
|
|
|
0xFF
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
uint8_t out[3];
|
|
|
|
|
|
|
|
// __disable_irq(); // Already in do_api
|
|
|
|
|
|
|
|
SI4463_do_api(data, 2, out, 3); // TODO no clear of interrupts
|
|
|
|
|
|
|
|
// __enable_irq();
|
|
|
|
|
|
|
|
v = out[2];
|
|
|
|
|
|
|
|
if (max < v) // Peak
|
|
|
|
if (max < v) // Peak
|
|
|
|
max = v;
|
|
|
|
max = v;
|
|
|
|
if (count > 1000) { // Decay
|
|
|
|
if (count > 1000) { // Decay
|
|
|
|
@ -1548,39 +1511,15 @@ int16_t Si446x_RSSI(void)
|
|
|
|
|
|
|
|
|
|
|
|
int i = setting.repeat;
|
|
|
|
int i = setting.repeat;
|
|
|
|
int32_t RSSI_RAW = 0;
|
|
|
|
int32_t RSSI_RAW = 0;
|
|
|
|
|
|
|
|
while(SPI_RX_IS_NOT_EMPTY(SI4432_SPI)) (void)SPI_READ_8BIT(SI4432_SPI); // Remove lingering bytes
|
|
|
|
|
|
|
|
while (!SI4463_READ_CTS); // Wait for CTS
|
|
|
|
do{
|
|
|
|
do{
|
|
|
|
// if (MODE_INPUT(setting.mode) && RSSI_R
|
|
|
|
// if (MODE_INPUT(setting.mode) && RSSI_R
|
|
|
|
uint8_t data[4] = {
|
|
|
|
|
|
|
|
SI446X_CMD_GET_MODEM_STATUS,
|
|
|
|
|
|
|
|
0xFF
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define SAMPLE_COUNT 1
|
|
|
|
#define SAMPLE_COUNT 1
|
|
|
|
int j = SAMPLE_COUNT; //setting.repeat;
|
|
|
|
int j = SAMPLE_COUNT; //setting.repeat;
|
|
|
|
int RSSI_RAW_ARRAY[3];
|
|
|
|
int RSSI_RAW_ARRAY[3];
|
|
|
|
do{
|
|
|
|
do{
|
|
|
|
again:
|
|
|
|
RSSI_RAW_ARRAY[--j] = Si446x_readRSSI();
|
|
|
|
#if 1
|
|
|
|
|
|
|
|
// __disable_irq();
|
|
|
|
|
|
|
|
data[0] = SI446X_CMD_GET_MODEM_STATUS;
|
|
|
|
|
|
|
|
data[1] = 0xFF;
|
|
|
|
|
|
|
|
SI4463_do_api(data, 2, data, 4); // TODO no clear of interrupts
|
|
|
|
|
|
|
|
// __enable_irq();
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
data[2] = getFRR(SI446X_CMD_READ_FRR_A);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (data[0] == 255) {
|
|
|
|
|
|
|
|
my_microsecond_delay(10);
|
|
|
|
|
|
|
|
goto again;
|
|
|
|
|
|
|
|
// data[2] = data[3];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
if (data[2] == 0) {
|
|
|
|
|
|
|
|
// my_microsecond_delay(10);
|
|
|
|
|
|
|
|
goto again;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
RSSI_RAW_ARRAY[--j] = data[2];
|
|
|
|
|
|
|
|
if (j == 0) break;
|
|
|
|
if (j == 0) break;
|
|
|
|
// my_microsecond_delay(20);
|
|
|
|
// my_microsecond_delay(20);
|
|
|
|
}while(1);
|
|
|
|
}while(1);
|
|
|
|
|