This commit is contained in:
230
app/fskmodem.c
230
app/fskmodem.c
@@ -6,6 +6,7 @@
|
||||
//#include "messages.h"
|
||||
#include "driver/uart.h"
|
||||
#include "../ui/messages.h"
|
||||
#include "ui/ui.h"
|
||||
|
||||
uint16_t TONE2_FREQ;
|
||||
|
||||
@@ -63,42 +64,68 @@ void FSKModem_TimeSlice500ms(void) {
|
||||
}
|
||||
|
||||
void MSG_ConfigureFSK(bool rx) {
|
||||
BK4819_WriteRegister(BK4819_REG_70, TONE2_ENABLE_BIT | (96U << 0));
|
||||
|
||||
// Compute tone frequency control word (for 26 MHz XTAL)
|
||||
// quick helper
|
||||
bool isAFSK = (gEeprom.FSKMode == MOD_AFSK_1200 ||
|
||||
gEeprom.FSKMode == MOD_AFSK_2400 ||
|
||||
gEeprom.FSKMode == MOD_NOAA_SAME);
|
||||
|
||||
|
||||
// Base tone config
|
||||
uint16_t tone1 = 0, tone2 = 0;
|
||||
#define BK4819_FREQ_WORD(freq_hz) ((uint16_t)((freq_hz) * 10.32444f))
|
||||
|
||||
// Tone word macro for 26MHz XTAL (app note: freq * 10.32444)
|
||||
#undef BK4819_FREQ_WORD
|
||||
#define BK4819_FREQ_WORD(freq_hz) ((uint16_t)((freq_hz) * 10.32444f))
|
||||
if (isAFSK) {
|
||||
// Bell-202 style tones for AFSK/NOAA
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_AFSK_1200:
|
||||
tone1 = BK4819_FREQ_WORD(1200.0f); // mark
|
||||
tone2 = BK4819_FREQ_WORD(2200.0f); // space
|
||||
break;
|
||||
case MOD_AFSK_2400:
|
||||
tone1 = BK4819_FREQ_WORD(1200.0f);
|
||||
tone2 = BK4819_FREQ_WORD(2400.0f);
|
||||
break;
|
||||
case MOD_NOAA_SAME:
|
||||
tone1 = BK4819_FREQ_WORD(1562.5f); // typical mark
|
||||
tone2 = BK4819_FREQ_WORD(2083.3f); // typical space
|
||||
break;
|
||||
default:
|
||||
tone1 = BK4819_FREQ_WORD(1200.0f);
|
||||
tone2 = BK4819_FREQ_WORD(2200.0f);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_AFSK_2400:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(2400.0f);
|
||||
break;
|
||||
case MOD_AFSK_1200:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(1200.0f);
|
||||
break;
|
||||
case MOD_FSK_700:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(700.0f);
|
||||
break;
|
||||
case MOD_FSK_450:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(450.0f);
|
||||
break;
|
||||
case MOD_FSK_1200_2400:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(1200.0f);
|
||||
break;
|
||||
case MOD_NOAA_SAME:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(2083.3f);
|
||||
break;
|
||||
default:
|
||||
TONE2_FREQ = BK4819_FREQ_WORD(1200.0f);
|
||||
break;
|
||||
BK4819_WriteRegister(BK4819_REG_71, tone1);
|
||||
BK4819_WriteRegister(BK4819_REG_72, tone2);
|
||||
// enable both tones
|
||||
BK4819_WriteRegister(BK4819_REG_70,
|
||||
TONE1_ENABLE_BIT | TONE2_ENABLE_BIT |
|
||||
(96U << 8) | (96U << 0));
|
||||
} else {
|
||||
// plain FSK path: only TONE2 used (frequency for binary shift display/debug)
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_FSK_450:
|
||||
tone2 = BK4819_FREQ_WORD(450.0f);
|
||||
break;
|
||||
case MOD_FSK_700:
|
||||
tone2 = BK4819_FREQ_WORD(700.0f);
|
||||
break;
|
||||
case MOD_FSK_1200:
|
||||
tone2 = BK4819_FREQ_WORD(1200.0f);
|
||||
break;
|
||||
case MOD_FSK_2400:
|
||||
tone2 = BK4819_FREQ_WORD(2400.0f);
|
||||
break;
|
||||
default:
|
||||
tone2 = BK4819_FREQ_WORD(1200.0f);
|
||||
break;
|
||||
}
|
||||
BK4819_WriteRegister(BK4819_REG_72, tone2);
|
||||
BK4819_WriteRegister(BK4819_REG_70, TONE2_ENABLE_BIT | (96U << 0));
|
||||
}
|
||||
|
||||
BK4819_WriteRegister(BK4819_REG_72, TONE2_FREQ);
|
||||
|
||||
// Base config (enable + preamble type AA)
|
||||
// Base FSK config
|
||||
uint16_t fskConfig = FSK_ENABLE_BIT | FSK_PREAMBLE_TYPE_AA;
|
||||
|
||||
// Compose the correct fields into REG_58:
|
||||
@@ -108,30 +135,37 @@ void MSG_ConfigureFSK(bool rx) {
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_AFSK_1200:
|
||||
fskConfig |= FSK_TX_MODE_FFSK_1200_1800 /*<<13 in macro*/
|
||||
| FSK_RX_MODE_FFSK_1200_1800 /*<<10 in macro*/
|
||||
| FSK_RX_BW_FFSK_1200_1800; /*<<1 in macro*/
|
||||
| FSK_RX_MODE_FFSK_1200_1800 /*<<10 in macro*/
|
||||
| FSK_RX_BW_FFSK_1200_1800; /*<<1 in macro*/
|
||||
break;
|
||||
|
||||
case MOD_AFSK_2400:
|
||||
fskConfig |= FSK_TX_MODE_FFSK_1200_2400
|
||||
| FSK_RX_MODE_FFSK_1200_2400
|
||||
| FSK_RX_BW_2_4K_FFSK_1200_2400;
|
||||
| FSK_RX_MODE_FFSK_1200_2400
|
||||
| FSK_RX_BW_2_4K_FFSK_1200_2400;
|
||||
break;
|
||||
|
||||
case MOD_NOAA_SAME:
|
||||
fskConfig |= FSK_TX_MODE_NOAA_SAME
|
||||
| FSK_RX_MODE_FSK_1_2K_2_4K_NOAA
|
||||
| FSK_RX_BW_NOAA_SAME;
|
||||
| FSK_RX_MODE_FSK_1_2K_2_4K_NOAA
|
||||
| FSK_RX_BW_NOAA_SAME;
|
||||
break;
|
||||
|
||||
case MOD_FSK_2400:
|
||||
// binary FSK 1.2k/2.4k - use default FSK TX/RX modes and 1.2k BW
|
||||
fskConfig |= FSK_TX_MODE_FSK_1_2K_2_4K
|
||||
| FSK_RX_MODE_FSK_1_2K_2_4K_NOAA
|
||||
| FSK_RX_BW_2_4K_FFSK_1200_2400;
|
||||
break;
|
||||
|
||||
case MOD_FSK_700:
|
||||
case MOD_FSK_450:
|
||||
case MOD_FSK_1200_2400:
|
||||
case MOD_FSK_1200:
|
||||
default:
|
||||
// binary FSK 1.2k/2.4k - use default FSK TX/RX modes and 1.2k BW
|
||||
fskConfig |= FSK_TX_MODE_FSK_1_2K_2_4K
|
||||
| FSK_RX_MODE_FSK_1_2K_2_4K_NOAA
|
||||
| FSK_RX_BW_1_2K;
|
||||
| FSK_RX_MODE_FSK_1_2K_2_4K_NOAA
|
||||
| FSK_RX_BW_1_2K;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -143,9 +177,23 @@ void MSG_ConfigureFSK(bool rx) {
|
||||
BK4819_WriteRegister(BK4819_REG_5C, FSK_CRC_ON);
|
||||
|
||||
if (rx) {
|
||||
BK4819_WriteRegister(BK4819_REG_5E, (64U << 3) | (1U << 0));
|
||||
uint8_t threshold;
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_AFSK_1200:
|
||||
case MOD_NOAA_SAME:
|
||||
threshold = 1U;
|
||||
break;
|
||||
case MOD_AFSK_2400:
|
||||
threshold = 2U; // Slightly higher; 2400 baud can fill FIFO faster
|
||||
break;
|
||||
default:
|
||||
threshold = 4U; // FSK modes
|
||||
break;
|
||||
}
|
||||
BK4819_WriteRegister(BK4819_REG_5E, (64U << 3) | threshold);
|
||||
}
|
||||
|
||||
|
||||
// Data length (REG_5D<15:8>)
|
||||
size_t size = sizeof(dataPacket);
|
||||
if (rx) size = (((size + 1) / 2) * 2) + 2;
|
||||
@@ -154,12 +202,65 @@ void MSG_ConfigureFSK(bool rx) {
|
||||
BK4819_FskClearFifo();
|
||||
|
||||
// REG_59: clear flags, preamble len, sync len etc.
|
||||
uint16_t fskParams = FSK_SYNC_LEN_BIT | ((rx ? 0U : 15U) << 4);
|
||||
//uint16_t fskParams = FSK_SYNC_LEN_BIT | ((rx ? 0U : 15U) << 4);
|
||||
uint16_t preamble_len = (gEeprom.FSKMode == MOD_AFSK_1200 || gEeprom.FSKMode == MOD_AFSK_2400 || gEeprom.FSKMode == MOD_NOAA_SAME) ? 10U : (rx ? 0U
|
||||
: 15U);
|
||||
uint16_t fskParams = FSK_SYNC_LEN_BIT | (preamble_len << 4);
|
||||
if (gCurrentVfo->SCRAMBLING_TYPE > 0) fskParams |= FSK_SCRAMBLE_ENABLE;
|
||||
BK4819_WriteRegister(BK4819_REG_59, fskParams);
|
||||
|
||||
|
||||
// Clear interrupt flags
|
||||
BK4819_WriteRegister(BK4819_REG_02, 0);
|
||||
|
||||
// Enable AF path filters for tone demodulation in AFSK/NOAA modes
|
||||
if (gEeprom.FSKMode == MOD_AFSK_1200 ||
|
||||
gEeprom.FSKMode == MOD_AFSK_2400 ||
|
||||
gEeprom.FSKMode == MOD_NOAA_SAME) {
|
||||
|
||||
// Keep DC cancel, disable only deemphasis
|
||||
BK4819_WriteRegister(BK4819_REG_2B,
|
||||
(1U << 15) | (1U << 14) | (1U << 8));
|
||||
} else {
|
||||
|
||||
BK4819_WriteRegister(BK4819_REG_2B, (1u << 2) | (1u << 0));
|
||||
}
|
||||
|
||||
// set the FM deviation level
|
||||
const uint16_t dev_val = BK4819_ReadRegister(BK4819_REG_40);
|
||||
|
||||
uint16_t deviation;
|
||||
switch (gEeprom.FSKMode) {
|
||||
case MOD_AFSK_1200:
|
||||
case MOD_AFSK_2400:
|
||||
case MOD_NOAA_SAME:
|
||||
deviation = 650; // 0.65 kHz for audio-based tones (linear region)
|
||||
break;
|
||||
|
||||
case MOD_FSK_450:
|
||||
deviation = 225; // ≈ half of 450 Hz separation
|
||||
break;
|
||||
|
||||
case MOD_FSK_700:
|
||||
deviation = 350; // ≈ half of 700 Hz separation
|
||||
break;
|
||||
|
||||
case MOD_FSK_1200:
|
||||
deviation = 600; // halfway between 1200 and 2400 = 1.8 kHz spacing → ±900 Hz dev
|
||||
break;
|
||||
|
||||
case MOD_FSK_2400:
|
||||
deviation = 1200; // halfway between 1200 and 2400 = 1.8 kHz spacing → ±900 Hz dev
|
||||
break;
|
||||
|
||||
default:
|
||||
deviation = 750; // safe fallback
|
||||
break;
|
||||
}
|
||||
BK4819_WriteRegister(BK4819_REG_40, (dev_val & 0xf000) | (deviation & 0x0fff));
|
||||
// restore FM deviation level
|
||||
//BK4819_WriteRegister(BK4819_REG_40, dev_val);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -210,6 +311,9 @@ void processReceivedPacket(DataPacket *packet) {
|
||||
itoa(packet->src, numBuf); // Convert number to string
|
||||
strcat(String, numBuf);
|
||||
MESSAGES_SAVE();
|
||||
gRequestDisplayScreen = DISPLAY_MESSAGES;
|
||||
GUI_SelectNextDisplay(gRequestDisplayScreen);
|
||||
gActiveMessageBank = MESSAGES_COUNT / 3 - 1;
|
||||
UI_DisplayPopup(String);
|
||||
inBoundPacket.flags |= 0x40;
|
||||
inBoundPacket.dest = inBoundPacket.src;
|
||||
@@ -265,29 +369,7 @@ void MSG_FSKSendData(DataPacket *dataPacketIn) {
|
||||
const uint16_t css_val = BK4819_ReadRegister(BK4819_REG_51);
|
||||
BK4819_WriteRegister(BK4819_REG_51, 0);
|
||||
|
||||
// set the FM deviation level
|
||||
const uint16_t dev_val = BK4819_ReadRegister(BK4819_REG_40);
|
||||
|
||||
{
|
||||
uint16_t deviation;
|
||||
switch (gEeprom.VfoInfo[gEeprom.TX_VFO].CHANNEL_BANDWIDTH) {
|
||||
case BK4819_FILTER_BW_WIDE:
|
||||
deviation = 1300;
|
||||
break; // 20k // measurements by kamilsss655
|
||||
case BK4819_FILTER_BW_NARROW:
|
||||
deviation = 1200;
|
||||
break; // 10k
|
||||
// case BK4819_FILTER_BW_NARROWAVIATION: deviation = 850; break; // 5k
|
||||
// case BK4819_FILTER_BW_NARROWER: deviation = 850; break; // 5k
|
||||
// case BK4819_FILTER_BW_NARROWEST: deviation = 850; break; // 5k
|
||||
default:
|
||||
deviation = 850;
|
||||
break; // 5k
|
||||
}
|
||||
|
||||
//BK4819_WriteRegister(0x40, (3u << 12) | (deviation & 0xfff));
|
||||
BK4819_WriteRegister(BK4819_REG_40, (dev_val & 0xf000) | (deviation & 0xfff));
|
||||
}
|
||||
|
||||
// REG_2B 0
|
||||
//
|
||||
@@ -302,8 +384,20 @@ void MSG_FSKSendData(DataPacket *dataPacketIn) {
|
||||
//
|
||||
// disable the 300Hz HPF and FM pre-emphasis filter
|
||||
//
|
||||
|
||||
const uint16_t filt_val = BK4819_ReadRegister(BK4819_REG_2B);
|
||||
BK4819_WriteRegister(BK4819_REG_2B, (1u << 2) | (1u << 0));
|
||||
// Enable AF path filters for tone demodulation in AFSK/NOAA modes
|
||||
if (gEeprom.FSKMode == MOD_AFSK_1200 ||
|
||||
gEeprom.FSKMode == MOD_AFSK_2400 ||
|
||||
gEeprom.FSKMode == MOD_NOAA_SAME) {
|
||||
|
||||
// Keep DC cancel, disable only deemphasis
|
||||
BK4819_WriteRegister(BK4819_REG_2B,
|
||||
(1U << 15) | (1U << 14) | (1U << 8));
|
||||
} else {
|
||||
|
||||
BK4819_WriteRegister(BK4819_REG_2B, (1u << 2) | (1u << 0));
|
||||
}
|
||||
|
||||
MSG_ConfigureFSK(false);
|
||||
|
||||
@@ -343,9 +437,6 @@ void MSG_FSKSendData(DataPacket *dataPacketIn) {
|
||||
// disable TX
|
||||
MSG_ConfigureFSK(true);
|
||||
|
||||
// restore FM deviation level
|
||||
BK4819_WriteRegister(BK4819_REG_40, dev_val);
|
||||
|
||||
// restore TX/RX filtering
|
||||
BK4819_WriteRegister(BK4819_REG_2B, filt_val);
|
||||
|
||||
@@ -365,7 +456,8 @@ void MSG_FSKSendData(DataPacket *dataPacketIn) {
|
||||
BK4819_ExitTxMute();
|
||||
}
|
||||
|
||||
if (!(dataPacketIn->flags & 0x64)) {
|
||||
//if (!(dataPacketIn->flags & 0x64)) {
|
||||
if (!(dataPacketIn->flags & 0x40)) {
|
||||
gGotACK = false;
|
||||
}
|
||||
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);
|
||||
@@ -415,7 +507,7 @@ void FSK_HANDLE_IRQ(unsigned short irq) {
|
||||
UART_Send((const void *) &ptr[gFSKWriteIndex - 1], 2);
|
||||
}
|
||||
|
||||
SYSTEM_DelayMs(10);
|
||||
SYSTEM_DelayMs(2);
|
||||
}
|
||||
|
||||
if (rx_finished) {
|
||||
|
||||
Reference in New Issue
Block a user