Compare commits
2 Commits
077674e19b
...
a301cc5ea1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a301cc5ea1 | ||
![]() |
37d5b2865d |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
saved_packets/*
|
||||||
|
src/__pycache__
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"python.analysis.stubPath": "./typings"
|
||||||
|
}
|
@ -106,4 +106,4 @@ The known frequency range is 2400 – 2483.5 MHz, and my SDR has a 20 MHZ bandwi
|
|||||||
|
|
||||||
|
|
||||||
## Run
|
## Run
|
||||||
`python3 read.py`
|
`python3 -m src.main`
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
12
freq.txt
12
freq.txt
@ -1,12 +0,0 @@
|
|||||||
Handheld Init
|
|
||||||
2.4312 GHZ (mid)
|
|
||||||
2.439256 (strong)
|
|
||||||
2.447 GHZ (strong)
|
|
||||||
2.4632 GHZ (strong)
|
|
||||||
2.471 GHZ (weak)
|
|
||||||
|
|
||||||
Test Pts
|
|
||||||
2410000.000
|
|
||||||
2430000.000
|
|
||||||
2450000.000
|
|
||||||
2470000.000
|
|
@ -1,8 +1,8 @@
|
|||||||
import spidev
|
import spidev
|
||||||
import RPi.GPIO as GPIO
|
import RPi.GPIO as GPIO
|
||||||
from util import sleep, get_addr
|
from .util import sleep, get_addr
|
||||||
from init_regs_value import init_regs_value
|
from .init_regs_value import init_regs_value
|
||||||
from regs_addr import regs_addr
|
from .regs_addr import regs_addr
|
||||||
CONFIG_REGS = regs_addr["CONFIG_REGS"]
|
CONFIG_REGS = regs_addr["CONFIG_REGS"]
|
||||||
STROBES = regs_addr["STROBES"]
|
STROBES = regs_addr["STROBES"]
|
||||||
STATUS = regs_addr["STATUS"]
|
STATUS = regs_addr["STATUS"]
|
||||||
@ -83,7 +83,7 @@ def reset(spi):
|
|||||||
version = read_register(spi, VERSION)
|
version = read_register(spi, VERSION)
|
||||||
print(f"CC2500 VERSION register: 0x{version:02X}")
|
print(f"CC2500 VERSION register: 0x{version:02X}")
|
||||||
# if version != 0x2F:
|
# if version != 0x2F:
|
||||||
# raise Exception("Expected Version was 0x0F!! Quitting")
|
# raise Exception("Expected Version was 0x2F!! Quitting")
|
||||||
|
|
||||||
|
|
||||||
def test_read_write_reg(spi, dbg=False):
|
def test_read_write_reg(spi, dbg=False):
|
@ -1,8 +1,8 @@
|
|||||||
import spidev
|
import spidev
|
||||||
from util import print_gdo_state, sleep, get_addr, dump_regs, debug, GDO0_PIN, GDO2_PIN
|
from .util import print_gdo_state, sleep, get_addr, dump_regs, debug, GDO0_PIN, GDO2_PIN
|
||||||
from receive import rx_data_rf
|
from .receive import rx_data_rf
|
||||||
from transmit import transmit_packet
|
from .transmit import transmit_packet
|
||||||
from common import reset, setup_spi, setup_gpio, read_register, test_read_write_reg, init_cc_2500, write_reg, SRES, SNOP, MARCSTATE, VERSION
|
from .common import reset, setup_spi, setup_gpio, read_register, test_read_write_reg, init_cc_2500, write_reg, SRES, SNOP, MARCSTATE, VERSION
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
|||||||
from util import sleep, get_addr, digital_read, GDO0_PIN, GDO2_PIN, debug, delay
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
|
from .util import sleep, get_addr, digital_read, GDO0_PIN, GDO2_PIN, debug, delay
|
||||||
import time
|
import time
|
||||||
from common import strobe, read_register
|
from .common import strobe, read_register
|
||||||
|
|
||||||
SIDLE = get_addr('SIDLE')
|
SIDLE = get_addr('SIDLE')
|
||||||
SFRX = get_addr('SFRX')
|
SFRX = get_addr('SFRX')
|
||||||
@ -12,9 +14,21 @@ def print_packet(spi, packet_length):
|
|||||||
for i in range(packet_length):
|
for i in range(packet_length):
|
||||||
print(f", byte: {0}: 0x{1}", i, read_register(spi, RXFIFO))
|
print(f", byte: {0}: 0x{1}", i, read_register(spi, RXFIFO))
|
||||||
|
|
||||||
#TODO
|
# Save packet to a timestamped binary file
|
||||||
def save_packet():
|
def save_packet(packet: list):
|
||||||
print()
|
# Create directory to store packets if it doesn't exist
|
||||||
|
packet_dir = Path("saved_packets")
|
||||||
|
packet_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Create timestamped filename
|
||||||
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
|
filename = packet_dir / f"packet_{timestamp}.bin"
|
||||||
|
|
||||||
|
# Save packet as binary data
|
||||||
|
with open(filename, "wb") as f:
|
||||||
|
f.write(bytearray(packet))
|
||||||
|
|
||||||
|
print(f"Packet saved to {filename}")
|
||||||
|
|
||||||
|
|
||||||
def get_rssi_from_pkt(packet):
|
def get_rssi_from_pkt(packet):
|
||||||
@ -61,57 +75,13 @@ def rx_data_rf(spi):
|
|||||||
gdo2_state = digital_read(GDO2_PIN)
|
gdo2_state = digital_read(GDO2_PIN)
|
||||||
delay(100)
|
delay(100)
|
||||||
packet_length: int = read_register(spi, RXFIFO)
|
packet_length: int = read_register(spi, RXFIFO)
|
||||||
# print("Packet Length {0}".format(packet_length))
|
|
||||||
packet: list = [read_register(spi, RXFIFO) for _ in range(packet_length)]
|
packet: list = [read_register(spi, RXFIFO) for _ in range(packet_length)]
|
||||||
rssi_raw = get_rssi_from_pkt(packet)
|
rssi_raw = get_rssi_from_pkt(packet)
|
||||||
strength = get_signal_strength_rssi_raw(rssi_raw)
|
strength = get_signal_strength_rssi_raw(rssi_raw)
|
||||||
print("Length: {0} bytes\t Signal: {1} dBm".format(packet_length, strength) )
|
print("Length: {0} bytes\t Signal: {1} dBm".format(packet_length, strength) )
|
||||||
|
save_packet(packet)
|
||||||
# Make sure that the radio is in IDLE state before flushing the FIFO
|
# Make sure that the radio is in IDLE state before flushing the FIFO
|
||||||
# (Unless RXOFF_MODE has been changed, the radio should be in IDLE state at this point)
|
# (Unless RXOFF_MODE has been changed, the radio should be in IDLE state at this point)
|
||||||
strobe(spi, SIDLE)
|
strobe(spi, SIDLE)
|
||||||
# Flush RX FIFO
|
# Flush RX FIFO
|
||||||
strobe(spi, SFRX)
|
strobe(spi, SFRX)
|
||||||
|
|
||||||
# def burst_read(spi, addr, length):
|
|
||||||
# """Read multiple bytes"""
|
|
||||||
# READ_SINGLE = get_addr("READ_SINGLE")
|
|
||||||
# READ_BURST = get_addr("READ_BURST")
|
|
||||||
# return spi.xfer2([addr | READ_SINGLE | READ_BURST] + [0x00] * length)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# def read_fifo(spi):
|
|
||||||
# # Burst read RX FIFO
|
|
||||||
# READ_BURST = get_addr("READ_BURST")
|
|
||||||
# RXFIFO = get_addr("RXFIFO")
|
|
||||||
# fifo = spi.xfer2([RXFIFO | READ_BURST] + [0x00]*64) # Max 64 bytes
|
|
||||||
# return fifo[1:]
|
|
||||||
|
|
||||||
|
|
||||||
# def receive_packet(spi):
|
|
||||||
# SFRX = get_addr("SFRX")
|
|
||||||
# RXBYTES = get_addr("RXBYTES")
|
|
||||||
# SRX = get_addr("SRX")
|
|
||||||
|
|
||||||
# # Flush RX FIFO
|
|
||||||
# strobe(spi, SFRX)
|
|
||||||
# time.sleep(0.5) # 1 ms delay to allow flush
|
|
||||||
# # Go into RX mode
|
|
||||||
# strobe(spi, SRX)
|
|
||||||
|
|
||||||
# # Wait for data (use GDO0 in real app)
|
|
||||||
# sleep(0.5)
|
|
||||||
|
|
||||||
# # Check RXBYTES
|
|
||||||
|
|
||||||
# timeout = time.time() + 2 # 2-second timeout
|
|
||||||
# while time.time() < timeout:
|
|
||||||
# rx_bytes = read_register(spi, RXBYTES) & 0x7F
|
|
||||||
# if rx_bytes > 0:
|
|
||||||
# data = read_fifo(spi)
|
|
||||||
# print(f"Received: {data}")
|
|
||||||
# return data
|
|
||||||
# time.sleep(0.01)
|
|
||||||
|
|
||||||
# print("Timeout: no data received.")
|
|
@ -1,5 +1,5 @@
|
|||||||
from common import strobe, write_burst
|
from .common import strobe, write_burst
|
||||||
from util import get_addr
|
from .util import get_addr
|
||||||
|
|
||||||
|
|
||||||
SIDLE = get_addr('SIDLE')
|
SIDLE = get_addr('SIDLE')
|
@ -1,4 +1,4 @@
|
|||||||
from regs_addr import regs_addr
|
from .regs_addr import regs_addr
|
||||||
import RPi.GPIO as GPIO
|
import RPi.GPIO as GPIO
|
||||||
import time
|
import time
|
||||||
debug = True
|
debug = True
|
||||||
@ -19,14 +19,7 @@ def print_gdo_state(GDO0_PIN=17, GDO2_PIN=27):
|
|||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|
||||||
def digital_read(GDO_PIN: int):
|
def digital_read(GDO_PIN: int):
|
||||||
bit = GPIO.input(GDO_PIN)
|
return GPIO.input(GDO_PIN)
|
||||||
# print("bit " + str(bit))
|
|
||||||
if bit == 1:
|
|
||||||
return True
|
|
||||||
elif bit == 0:
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
raise Exception("Unexpected digital read GDO_PIN{GDO_PIN} {bit}")
|
|
||||||
|
|
||||||
def get_addr(name):
|
def get_addr(name):
|
||||||
addr = ""
|
addr = ""
|
6
typings/spidev/__init__.pyi
Normal file
6
typings/spidev/__init__.pyi
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
class SpiDev:
|
||||||
|
def open(self, bus: int, device: int) -> None: ...
|
||||||
|
def close(self) -> None: ...
|
||||||
|
def xfer2(self, data: list[int]) -> list[int]: ...
|
||||||
|
max_speed_hz: int
|
||||||
|
mode: int
|
31
wiring.txt
31
wiring.txt
@ -1,31 +0,0 @@
|
|||||||
CC2500 Pins to Raspberry Pi GPIO Pins
|
|
||||||
GND (CC2500) → Ground (Pin 6 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
VCC (CC2500) → 3.3V Power (Pin 1 or Pin 17 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
Ensure the CC2500 module operates at 3.3V. Connecting it to 5V may damage it.
|
|
||||||
|
|
||||||
SPI Pins:
|
|
||||||
SI (CC2500) → MOSI (GPIO 10) (Pin 19 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
SCK (CC2500) → SCLK (GPIO 11) (Pin 23 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
CSN (CC2500) → CE0 (GPIO 8) (Pin 24 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
This is the Chip Select line.
|
|
||||||
|
|
||||||
SO (CC2500) → MISO (GPIO 9) (Pin 21 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
Optional Pins:
|
|
||||||
GDO0 (CC2500) → Any GPIO Pin (e.g., GPIO 18) (Pin 12 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
Use this for interrupt handling or data-ready signals if required.
|
|
||||||
|
|
||||||
GDO2 (CC2500) → Any GPIO Pin (e.g., GPIO 25) (Pin 22 on Raspberry Pi GPIO header)
|
|
||||||
|
|
||||||
Additional interrupt or data pin.
|
|
||||||
|
|
||||||
Power Amplifier Pins (If Applicable):
|
|
||||||
PA_EN (CC2500) → Any GPIO Pin (Optional, depending on whether you control the amplifier externally or not).
|
|
||||||
|
|
||||||
PA_EX (CC2500) → Not Connected (unless needed for a specific configuration)
|
|
Loading…
Reference in New Issue
Block a user