[FL-1146] GD0 self-test
This commit is contained in:
parent
2844743370
commit
a975fb6dc5
@ -114,15 +114,15 @@ bool subghz_static_input(InputEvent* event, void* context) {
|
|||||||
uint8_t bit = i % 8;
|
uint8_t bit = i % 8;
|
||||||
bool value = (key[byte] >> (7 - bit)) & 1;
|
bool value = (key[byte] >> (7 - bit)) & 1;
|
||||||
// Payload send
|
// Payload send
|
||||||
hal_gpio_write(&cc1101_g0_gpio, false);
|
hal_gpio_write(&gpio_cc1101_g0, false);
|
||||||
delay_us(value ? SUBGHZ_PT_ONE : SUBGHZ_PT_ZERO);
|
delay_us(value ? SUBGHZ_PT_ONE : SUBGHZ_PT_ZERO);
|
||||||
hal_gpio_write(&cc1101_g0_gpio, true);
|
hal_gpio_write(&gpio_cc1101_g0, true);
|
||||||
delay_us(value ? SUBGHZ_PT_ZERO : SUBGHZ_PT_ONE);
|
delay_us(value ? SUBGHZ_PT_ZERO : SUBGHZ_PT_ONE);
|
||||||
}
|
}
|
||||||
// Last bit
|
// Last bit
|
||||||
hal_gpio_write(&cc1101_g0_gpio, false);
|
hal_gpio_write(&gpio_cc1101_g0, false);
|
||||||
delay_us(SUBGHZ_PT_ONE);
|
delay_us(SUBGHZ_PT_ONE);
|
||||||
hal_gpio_write(&cc1101_g0_gpio, true);
|
hal_gpio_write(&gpio_cc1101_g0, true);
|
||||||
// Guard time
|
// Guard time
|
||||||
delay_us(10600);
|
delay_us(10600);
|
||||||
}
|
}
|
||||||
@ -144,8 +144,8 @@ void subghz_static_enter(void* context) {
|
|||||||
api_hal_subghz_reset();
|
api_hal_subghz_reset();
|
||||||
api_hal_subghz_load_preset(ApiHalSubGhzPresetOokAsync);
|
api_hal_subghz_load_preset(ApiHalSubGhzPresetOokAsync);
|
||||||
|
|
||||||
hal_gpio_init(&cc1101_g0_gpio, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
hal_gpio_write(&cc1101_g0_gpio, true);
|
hal_gpio_write(&gpio_cc1101_g0, true);
|
||||||
|
|
||||||
with_view_model(
|
with_view_model(
|
||||||
subghz_static->view, (SubghzStaticModel * model) {
|
subghz_static->view, (SubghzStaticModel * model) {
|
||||||
|
@ -105,12 +105,12 @@ bool subghz_test_basic_input(InputEvent* event, void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(model->status == SubghzTestBasicModelStatusRx) {
|
if(model->status == SubghzTestBasicModelStatusRx) {
|
||||||
hal_gpio_init(&cc1101_g0_gpio, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
api_hal_subghz_rx();
|
api_hal_subghz_rx();
|
||||||
osTimerStart(subghz_test_basic->timer, 1024 / 4);
|
osTimerStart(subghz_test_basic->timer, 1024 / 4);
|
||||||
} else {
|
} else {
|
||||||
hal_gpio_init(&cc1101_g0_gpio, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
hal_gpio_write(&cc1101_g0_gpio, false);
|
hal_gpio_write(&gpio_cc1101_g0, false);
|
||||||
api_hal_subghz_tx();
|
api_hal_subghz_tx();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ void subghz_test_basic_enter(void* context) {
|
|||||||
api_hal_subghz_reset();
|
api_hal_subghz_reset();
|
||||||
api_hal_subghz_load_preset(ApiHalSubGhzPresetOokAsync);
|
api_hal_subghz_load_preset(ApiHalSubGhzPresetOokAsync);
|
||||||
|
|
||||||
hal_gpio_init(&cc1101_g0_gpio, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
|
|
||||||
with_view_model(
|
with_view_model(
|
||||||
subghz_test_basic->view, (SubghzTestBasicModel * model) {
|
subghz_test_basic->view, (SubghzTestBasicModel * model) {
|
||||||
|
@ -134,7 +134,7 @@ void subghz_test_packet_enter(void* context) {
|
|||||||
api_hal_subghz_reset();
|
api_hal_subghz_reset();
|
||||||
api_hal_subghz_load_preset(ApiHalSubGhzPreset2FskPacket);
|
api_hal_subghz_load_preset(ApiHalSubGhzPreset2FskPacket);
|
||||||
|
|
||||||
hal_gpio_init(&cc1101_g0_gpio, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
|
|
||||||
with_view_model(
|
with_view_model(
|
||||||
subghz_test_packet->view, (SubghzTestPacketModel * model) {
|
subghz_test_packet->view, (SubghzTestPacketModel * model) {
|
||||||
|
@ -18,7 +18,10 @@ const size_t input_pins_count = sizeof(input_pins) / sizeof(InputPin);
|
|||||||
|
|
||||||
const GpioPin vibro_gpio = {.port = VIBRO_GPIO_Port, .pin = VIBRO_Pin};
|
const GpioPin vibro_gpio = {.port = VIBRO_GPIO_Port, .pin = VIBRO_Pin};
|
||||||
const GpioPin ibutton_gpio = {.port = iBTN_GPIO_Port, .pin = iBTN_Pin};
|
const GpioPin ibutton_gpio = {.port = iBTN_GPIO_Port, .pin = iBTN_Pin};
|
||||||
const GpioPin cc1101_g0_gpio = {.port = CC1101_G0_GPIO_Port, .pin = CC1101_G0_Pin};
|
|
||||||
|
const GpioPin gpio_cc1101_g0 = {.port = CC1101_G0_GPIO_Port, .pin = CC1101_G0_Pin};
|
||||||
|
const GpioPin gpio_rf_sw_0 = {.port = RF_SW_0_GPIO_Port, .pin = RF_SW_0_Pin};
|
||||||
|
const GpioPin gpio_rf_sw_1 = {.port = RF_SW_1_GPIO_Port, .pin = RF_SW_1_Pin};
|
||||||
|
|
||||||
const GpioPin gpio_subghz_cs = {.port = CC1101_CS_GPIO_Port, .pin = CC1101_CS_Pin};
|
const GpioPin gpio_subghz_cs = {.port = CC1101_CS_GPIO_Port, .pin = CC1101_CS_Pin};
|
||||||
const GpioPin gpio_display_cs = {.port = DISPLAY_CS_GPIO_Port, .pin = DISPLAY_CS_Pin};
|
const GpioPin gpio_display_cs = {.port = DISPLAY_CS_GPIO_Port, .pin = DISPLAY_CS_Pin};
|
||||||
|
@ -55,7 +55,10 @@ extern const size_t input_pins_count;
|
|||||||
|
|
||||||
extern const GpioPin vibro_gpio;
|
extern const GpioPin vibro_gpio;
|
||||||
extern const GpioPin ibutton_gpio;
|
extern const GpioPin ibutton_gpio;
|
||||||
extern const GpioPin cc1101_g0_gpio;
|
|
||||||
|
extern const GpioPin gpio_cc1101_g0;
|
||||||
|
extern const GpioPin gpio_rf_sw_0;
|
||||||
|
extern const GpioPin gpio_rf_sw_1;
|
||||||
|
|
||||||
extern const GpioPin gpio_subghz_cs;
|
extern const GpioPin gpio_subghz_cs;
|
||||||
extern const GpioPin gpio_display_cs;
|
extern const GpioPin gpio_display_cs;
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
#include "api-hal-subghz.h"
|
#include "api-hal-subghz.h"
|
||||||
#include <stm32wbxx_ll_gpio.h>
|
|
||||||
#include <api-hal-gpio.h>
|
#include <api-hal-gpio.h>
|
||||||
#include <api-hal-spi.h>
|
#include <api-hal-spi.h>
|
||||||
|
#include <api-hal-resources.h>
|
||||||
|
#include <furi.h>
|
||||||
#include <cc1101.h>
|
#include <cc1101.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
static const uint8_t api_hal_subghz_preset_ook_async_regs[][2] = {
|
static const uint8_t api_hal_subghz_preset_ook_async_regs[][2] = {
|
||||||
/* Base setting */
|
/* Base setting */
|
||||||
@ -37,17 +38,24 @@ static const uint8_t api_hal_subghz_preset_2fsk_packet_patable[8] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void api_hal_subghz_init() {
|
void api_hal_subghz_init() {
|
||||||
LL_GPIO_SetPinMode(RF_SW_0_GPIO_Port, RF_SW_0_Pin, LL_GPIO_MODE_OUTPUT);
|
hal_gpio_init(&gpio_rf_sw_0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
LL_GPIO_SetPinSpeed(RF_SW_0_GPIO_Port, RF_SW_0_Pin, LL_GPIO_SPEED_FREQ_LOW);
|
hal_gpio_init(&gpio_rf_sw_1, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
LL_GPIO_SetPinOutputType(RF_SW_0_GPIO_Port, RF_SW_0_Pin, LL_GPIO_OUTPUT_PUSHPULL);
|
|
||||||
LL_GPIO_SetPinMode(RF_SW_1_GPIO_Port, RF_SW_1_Pin, LL_GPIO_MODE_OUTPUT);
|
|
||||||
LL_GPIO_SetPinSpeed(RF_SW_1_GPIO_Port, RF_SW_1_Pin, LL_GPIO_SPEED_FREQ_LOW);
|
|
||||||
LL_GPIO_SetPinOutputType(RF_SW_1_GPIO_Port, RF_SW_1_Pin, LL_GPIO_OUTPUT_PUSHPULL);
|
|
||||||
|
|
||||||
const ApiHalSpiDevice* device = api_hal_spi_device_get(ApiHalSpiDeviceIdSubGhz);
|
const ApiHalSpiDevice* device = api_hal_spi_device_get(ApiHalSpiDeviceIdSubGhz);
|
||||||
// Reset and shutdown
|
// Reset and shutdown
|
||||||
cc1101_reset(device);
|
cc1101_reset(device);
|
||||||
cc1101_write_reg(device, CC1101_IOCFG0, 0x2E); // High impedance 3-state
|
// Prepare GD0 for power on self test
|
||||||
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
|
// GD0 low
|
||||||
|
cc1101_write_reg(device, CC1101_IOCFG0, CC1101IocfgHW);
|
||||||
|
while(hal_gpio_read(&gpio_cc1101_g0) != false);
|
||||||
|
// GD0 high
|
||||||
|
cc1101_write_reg(device, CC1101_IOCFG0, CC1101IocfgHW | CC1101_IOCFG_INV);
|
||||||
|
while(hal_gpio_read(&gpio_cc1101_g0) != true);
|
||||||
|
// Reset GD0 to floating state
|
||||||
|
cc1101_write_reg(device, CC1101_IOCFG0, CC1101IocfgHighImpedance);
|
||||||
|
hal_gpio_init(&gpio_cc1101_g0, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
|
||||||
|
// Turn off oscillator
|
||||||
cc1101_shutdown(device);
|
cc1101_shutdown(device);
|
||||||
api_hal_spi_device_return(device);
|
api_hal_spi_device_return(device);
|
||||||
}
|
}
|
||||||
@ -164,18 +172,18 @@ uint32_t api_hal_subghz_set_frequency(uint32_t value) {
|
|||||||
|
|
||||||
void api_hal_subghz_set_path(ApiHalSubGhzPath path) {
|
void api_hal_subghz_set_path(ApiHalSubGhzPath path) {
|
||||||
if (path == ApiHalSubGhzPath1) {
|
if (path == ApiHalSubGhzPath1) {
|
||||||
LL_GPIO_ResetOutputPin(RF_SW_0_GPIO_Port, RF_SW_0_Pin);
|
hal_gpio_write(&gpio_rf_sw_0, 0);
|
||||||
LL_GPIO_SetOutputPin(RF_SW_1_GPIO_Port, RF_SW_1_Pin);
|
hal_gpio_write(&gpio_rf_sw_1, 1);
|
||||||
} else if (path == ApiHalSubGhzPath2) {
|
} else if (path == ApiHalSubGhzPath2) {
|
||||||
LL_GPIO_SetOutputPin(RF_SW_0_GPIO_Port, RF_SW_0_Pin);
|
hal_gpio_write(&gpio_rf_sw_0, 1);
|
||||||
LL_GPIO_ResetOutputPin(RF_SW_1_GPIO_Port, RF_SW_1_Pin);
|
hal_gpio_write(&gpio_rf_sw_1, 0);
|
||||||
} else if (path == ApiHalSubGhzPath3) {
|
} else if (path == ApiHalSubGhzPath3) {
|
||||||
LL_GPIO_SetOutputPin(RF_SW_0_GPIO_Port, RF_SW_0_Pin);
|
hal_gpio_write(&gpio_rf_sw_0, 1);
|
||||||
LL_GPIO_SetOutputPin(RF_SW_1_GPIO_Port, RF_SW_1_Pin);
|
hal_gpio_write(&gpio_rf_sw_1, 1);
|
||||||
} else if (path == ApiHalSubGhzPathIsolate) {
|
} else if (path == ApiHalSubGhzPathIsolate) {
|
||||||
LL_GPIO_ResetOutputPin(RF_SW_0_GPIO_Port, RF_SW_0_Pin);
|
hal_gpio_write(&gpio_rf_sw_0, 0);
|
||||||
LL_GPIO_ResetOutputPin(RF_SW_1_GPIO_Port, RF_SW_1_Pin);
|
hal_gpio_write(&gpio_rf_sw_1, 0);
|
||||||
} else {
|
} else {
|
||||||
|
furi_check(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,6 +99,63 @@ extern "C" {
|
|||||||
#define CC1101_PATABLE 0x3E /** PATABLE register number, an 8-byte table that defines the PA control settings */
|
#define CC1101_PATABLE 0x3E /** PATABLE register number, an 8-byte table that defines the PA control settings */
|
||||||
#define CC1101_FIFO 0x3F /** FIFO register nunmber, can be combined with CC1101_WRITE and/or CC1101_BURST */
|
#define CC1101_FIFO 0x3F /** FIFO register nunmber, can be combined with CC1101_WRITE and/or CC1101_BURST */
|
||||||
|
|
||||||
|
#define CC1101_IOCFG_INV (1<<6) /** IOCFG inversion */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CC1101IocfgRxFifoThreshold=0x00,
|
||||||
|
CC1101IocfgRxFifoThresholdOrPacket=0x01,
|
||||||
|
CC1101IocfgTxFifoThreshold=0x02,
|
||||||
|
CC1101IocfgTxFifoFull=0x03,
|
||||||
|
CC1101IocfgRxOverflow=0x04,
|
||||||
|
CC1101IocfgTxUnderflow=0x05,
|
||||||
|
CC1101IocfgSyncWord=0x06,
|
||||||
|
CC1101IocfgPacket=0x07,
|
||||||
|
CC1101IocfgPreamble=0x08,
|
||||||
|
CC1101IocfgClearChannel=0x09,
|
||||||
|
CC1101IocfgLockDetector=0x0A,
|
||||||
|
CC1101IocfgSerialClock=0x0B,
|
||||||
|
CC1101IocfgSerialSynchronousDataOutput=0x0C,
|
||||||
|
CC1101IocfgSerialDataOutput=0x0D,
|
||||||
|
CC1101IocfgCarrierSense=0x0E,
|
||||||
|
CC1101IocfgCrcOk=0x0F,
|
||||||
|
/* Reserved range: 0x10 - 0x15 */
|
||||||
|
CC1101IocfgRxHardData1=0x16,
|
||||||
|
CC1101IocfgRxHardData0=0x17,
|
||||||
|
/* Reserved range: 0x18 - 0x1A */
|
||||||
|
CC1101IocfgPaPd=0x1B,
|
||||||
|
CC1101IocfgLnaPd=0x1C,
|
||||||
|
CC1101IocfgRxSymbolTick=0x1D,
|
||||||
|
/* Reserved range: 0x1E - 0x23 */
|
||||||
|
CC1101IocfgWorEvnt0=0x24,
|
||||||
|
CC1101IocfgWorEvnt1=0x25,
|
||||||
|
CC1101IocfgClk256=0x26,
|
||||||
|
CC1101IocfgClk32k=0x27,
|
||||||
|
/* Reserved: 0x28 */
|
||||||
|
CC1101IocfgChpRdyN=0x29,
|
||||||
|
/* Reserved: 0x2A */
|
||||||
|
CC1101IocfgXoscStable=0x2B,
|
||||||
|
/* Reserved range: 0x2C - 0x2D */
|
||||||
|
CC1101IocfgHighImpedance=0x2E,
|
||||||
|
CC1101IocfgHW=0x2F,
|
||||||
|
/* Only one CC1101IocfgClkXoscN can be selected as an output at any time */
|
||||||
|
CC1101IocfgClkXosc1=0x30,
|
||||||
|
CC1101IocfgClkXosc1_5=0x31,
|
||||||
|
CC1101IocfgClkXosc2=0x32,
|
||||||
|
CC1101IocfgClkXosc3=0x33,
|
||||||
|
CC1101IocfgClkXosc4=0x34,
|
||||||
|
CC1101IocfgClkXosc6=0x35,
|
||||||
|
CC1101IocfgClkXosc8=0x36,
|
||||||
|
CC1101IocfgClkXosc12=0x37,
|
||||||
|
CC1101IocfgClkXosc16=0x38,
|
||||||
|
CC1101IocfgClkXosc24=0x39,
|
||||||
|
CC1101IocfgClkXosc32=0x3A,
|
||||||
|
CC1101IocfgClkXosc48=0x3B,
|
||||||
|
CC1101IocfgClkXosc64=0x3C,
|
||||||
|
CC1101IocfgClkXosc96=0x3D,
|
||||||
|
CC1101IocfgClkXosc128=0x3E,
|
||||||
|
CC1101IocfgClkXosc192=0x3F,
|
||||||
|
} CC1101Iocfg;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CC1101StateIDLE=0b000, /** IDLE state */
|
CC1101StateIDLE=0b000, /** IDLE state */
|
||||||
CC1101StateRX=0b001, /** Receive mode */
|
CC1101StateRX=0b001, /** Receive mode */
|
||||||
|
Loading…
Reference in New Issue
Block a user