Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SX1276_terminal SX1276_Semtech_GUI
Fork of SX127x by
Diff: sx127x_fsk.cpp
- Revision:
- 3:3bf2515b1eed
- Parent:
- 2:fdae76e1215e
- Child:
- 4:d987ac2836bf
--- a/sx127x_fsk.cpp Wed Apr 30 22:49:43 2014 +0000
+++ b/sx127x_fsk.cpp Fri May 02 01:18:59 2014 +0000
@@ -15,9 +15,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-//SX127x_fsk::SX127x_fsk(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName rst, PinName dio_0, PinName dio_1, PinName fem_ctx, PinName fem_cps) : SX127x(mosi, miso, sclk, cs, rst, dio_0, dio_1, fem_ctx, fem_cps)
-SX127x_fsk::SX127x_fsk(SX127x r) : m_xcvr(r)
+
+SX127x_fsk::SX127x_fsk(SX127x& r) : m_xcvr(r)
{
}
@@ -32,8 +31,9 @@
m_xcvr.m_cs = 0;
m_xcvr.m_spi.write(REG_FIFO | 0x80); // bit7 is high for writing to radio
- if (!m_xcvr.RegOpMode.bits.LongRangeMode && RegPktConfig1.bits.PacketFormatVariable)
+ if (!m_xcvr.RegOpMode.bits.LongRangeMode && RegPktConfig1.bits.PacketFormatVariable) {
m_xcvr.m_spi.write(len);
+ }
for (i = 0; i < len; i++) {
m_xcvr.m_spi.write(m_xcvr.tx_buf[i]);
@@ -49,13 +49,28 @@
m_xcvr.write_reg(REG_OPMODE, m_xcvr.RegOpMode.octet);
wait(0.01);
- /*RegOpMode.octet = read_reg(REG_OPMODE);
- printf("setloraoff:%02x\r\n", RegOpMode.octet);*/
-
- // todo: read FSK regsiters
- //SX1272ReadBuffer( REG_OPMODE, SX1272Regs + 1, 0x70 - 1 );
RegPktConfig1.octet = m_xcvr.read_reg(REG_FSK_PACKETCONFIG1);
RegPktConfig2.word = m_xcvr.read_u16(REG_FSK_PACKETCONFIG2);
+ RegRxConfig.octet = m_xcvr.read_u16(REG_FSK_RXCONFIG);
+ RegPreambleDetect.octet = m_xcvr.read_reg(REG_FSK_PREAMBLEDETECT);
+ RegSyncConfig.octet = m_xcvr.read_reg(REG_FSK_SYNCCONFIG);
+ RegFifoThreshold.octet = m_xcvr.read_reg(REG_FSK_FIFOTHRESH);
+ RegAfcFei.octet = m_xcvr.read_reg(REG_FSK_AFCFEI);
+
+ if (!RegFifoThreshold.bits.TxStartCondition) {
+ RegFifoThreshold.bits.TxStartCondition = 1; // start TX on fifoEmpty==0
+ m_xcvr.write_reg(REG_FSK_FIFOTHRESH, RegFifoThreshold.octet);
+ }
+
+ if (RegSyncConfig.bits.AutoRestartRxMode != 1) {
+ RegSyncConfig.bits.AutoRestartRxMode = 1;
+ m_xcvr.write_reg(REG_FSK_SYNCCONFIG, RegSyncConfig.octet);
+ }
+
+ if (RegPreambleDetect.bits.PreambleDetectorTol != 10) {
+ RegPreambleDetect.bits.PreambleDetectorTol = 10;
+ m_xcvr.write_reg(REG_FSK_PREAMBLEDETECT, RegPreambleDetect.octet);
+ }
m_xcvr.set_opmode(RF_OPMODE_STANDBY);
}
@@ -91,7 +106,7 @@
uint32_t SX127x_fsk::get_rx_bw_hz(uint8_t addr)
{
- FSKRegRxBw_t reg_bw;
+ RegRxBw_t reg_bw;
uint8_t mantissa;
if (m_xcvr.RegOpMode.bits.LongRangeMode)
@@ -151,7 +166,7 @@
void SX127x_fsk::start_tx(uint16_t arg_len)
{
uint16_t pkt_buf_len;
- FSKRegIrqFlags2_t RegIrqFlags2;
+ RegIrqFlags2_t RegIrqFlags2;
int maxlen = FSK_FIFO_SIZE-1;
if (m_xcvr.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER) {
@@ -164,7 +179,6 @@
}
if (RegPktConfig1.bits.PacketFormatVariable) {
- printf("variable-fmt %d\r\n", arg_len);
pkt_buf_len = arg_len;
} else {
pkt_buf_len = RegPktConfig2.bits.PayloadLength;
@@ -183,7 +197,6 @@
printf("var-oversized %d\r\n", pkt_buf_len);
} else {
//setup_FifoLevel(NO_EDGE); // disable
- printf("var-write-fifo %d\r\n", pkt_buf_len);
write_fifo(pkt_buf_len);
//remaining_ = 0; // all was sent
}
@@ -207,6 +220,20 @@
}
+void SX127x_fsk::config_dio0_for_pktmode_rx()
+{
+ if (RegPktConfig1.bits.CrcOn) {
+ if (m_xcvr.RegDioMapping1.bits.Dio0Mapping != 1) {
+ m_xcvr.RegDioMapping1.bits.Dio0Mapping = 1; // to CrcOk
+ m_xcvr.write_reg(REG_DIOMAPPING1, m_xcvr.RegDioMapping1.octet);
+ }
+ } else { // Crc Off, use PayloadReady
+ if (m_xcvr.RegDioMapping1.bits.Dio0Mapping != 0) {
+ m_xcvr.RegDioMapping1.bits.Dio0Mapping = 0; // to PayloadReady
+ m_xcvr.write_reg(REG_DIOMAPPING1, m_xcvr.RegDioMapping1.octet);
+ }
+ }
+}
void SX127x_fsk::start_rx()
{
@@ -218,6 +245,9 @@
m_xcvr.set_opmode(RF_OPMODE_STANDBY);
wait(0.01);
}
+
+ config_dio0_for_pktmode_rx();
+
m_xcvr.set_opmode(RF_OPMODE_RECEIVER);
}
@@ -230,17 +260,19 @@
m_xcvr.set_opmode(RF_OPMODE_STANDBY);
return SERVICE_TX_DONE;
}
- } else if (m_xcvr.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER) {
- uint8_t len;
+ } else if (m_xcvr.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER && m_xcvr.dio0) {
+ if (RegRxConfig.bits.AfcAutoOn)
+ RegAfcValue = m_xcvr.read_s16(REG_FSK_AFCMSB);
+
if (RegPktConfig1.bits.PacketFormatVariable) {
- len = m_xcvr.read_reg(REG_FIFO);
+ rx_buf_length = m_xcvr.read_reg(REG_FIFO);
} else {
- len = RegPktConfig2.bits.PayloadLength;
+ rx_buf_length = RegPktConfig2.bits.PayloadLength;
}
m_xcvr.m_cs = 0;
m_xcvr.m_spi.write(REG_FIFO); // bit7 is low for reading from radio
- for (i = 0; i < len; i++) {
+ for (i = 0; i < rx_buf_length; i++) {
m_xcvr.rx_buf[i] = m_xcvr.m_spi.write(0);
}
m_xcvr.m_cs = 1;
