dev #1

Merged
david merged 25 commits from dev into main 2025-04-28 14:20:45 -07:00
7 changed files with 373 additions and 0 deletions
Showing only changes of commit 21e95b8d3a - Show all commits

BIN
cc2500.pdf Normal file

Binary file not shown.

17
cc2500_init.json Normal file
View File

@ -0,0 +1,17 @@
{
"IOCFG0" : { "hex":"0x2E", "dec":46},
"FIFOTHR" : { "hex":"0x47", "dec":71},
"PKTCTRL0": { "hex":"0x05", "dec":5},
"FREQ2" : { "hex":"0x5D", "dec":93},
"FREQ1" : { "hex":"0x93", "dec":147},
"FREQ0" : { "hex":"0xB1", "dec":177},
"MDMCFG4" : { "hex":"0x0D", "dec":13},
"MDMCFG3" : { "hex":"0x3B", "dec":59},
"MDMCFG2" : { "hex":"0x73", "dec":115},
"DEVIATN" : { "hex":"0x01", "dec":1},
"MCSM0" : { "hex":"0x18", "dec":24},
"FSCAL3" : { "hex":"0xEA", "dec":234},
"FSCAL1" : { "hex":"0x00", "dec":0},
"TEST2" : { "hex":"0x00", "dec":0},
"TEST1" : { "hex":"0x21", "dec":33}
}

97
cc2500_regs.json Normal file
View File

@ -0,0 +1,97 @@
{
"CONFIG_REGS": {
"IOCFG2": {"hex": "0x00", "dec": 0},
"IOCFG1": {"hex": "0x01", "dec": 1},
"IOCFG0": {"hex": "0x02", "dec": 2},
"FIFOTHR": {"hex": "0x03", "dec": 3},
"SYNC1": {"hex": "0x04", "dec": 4},
"SYNC0": {"hex": "0x05", "dec": 5},
"PKTLEN": {"hex": "0x06", "dec": 6},
"PKTCTRL1": {"hex": "0x07", "dec": 7},
"PKTCTRL0": {"hex": "0x08", "dec": 8},
"ADDR": {"hex": "0x09", "dec": 9},
"CHANNR": {"hex": "0x0A", "dec": 10},
"FSCTRL1": {"hex": "0x0B", "dec": 11},
"FSCTRL0": {"hex": "0x0C", "dec": 12},
"FREQ2": {"hex": "0x0D", "dec": 13},
"FREQ1": {"hex": "0x0E", "dec": 14},
"FREQ0": {"hex": "0x0F", "dec": 15},
"MDMCFG4": {"hex": "0x10", "dec": 16},
"MDMCFG3": {"hex": "0x11", "dec": 17},
"MDMCFG2": {"hex": "0x12", "dec": 18},
"MDMCFG1": {"hex": "0x13", "dec": 19},
"MDMCFG0": {"hex": "0x14", "dec": 20},
"DEVIATN": {"hex": "0x15", "dec": 21},
"MCSM2": {"hex": "0x16", "dec": 22},
"MCSM1": {"hex": "0x17", "dec": 23},
"MCSM0": {"hex": "0x18", "dec": 24},
"FOCCFG": {"hex": "0x19", "dec": 25},
"BSCFG": {"hex": "0x1A", "dec": 26},
"AGCCTRL2": {"hex": "0x1B", "dec": 27},
"AGCCTRL1": {"hex": "0x1C", "dec": 28},
"AGCCTRL0": {"hex": "0x1D", "dec": 29},
"WOREVT1": {"hex": "0x1E", "dec": 30},
"WOREVT0": {"hex": "0x1F", "dec": 31},
"WORCTRL": {"hex": "0x20", "dec": 32},
"FREND1": {"hex": "0x21", "dec": 33},
"FREND0": {"hex": "0x22", "dec": 34},
"FSCAL3": {"hex": "0x23", "dec": 35},
"FSCAL2": {"hex": "0x24", "dec": 36},
"FSCAL1": {"hex": "0x25", "dec": 37},
"FSCAL0": {"hex": "0x26", "dec": 38},
"RCCTRL1": {"hex": "0x27", "dec": 39},
"RCCTRL0": {"hex": "0x28", "dec": 40},
"FSTEST": {"hex": "0x29", "dec": 41},
"PTEST": {"hex": "0x2A", "dec": 42},
"AGCTEST": {"hex": "0x2B", "dec": 43},
"TEST2": {"hex": "0x2C", "dec": 44},
"TEST1": {"hex": "0x2D", "dec": 45},
"TEST0": {"hex": "0x2E", "dec": 46}
},
"STROBES": {
"SRES": {"hex": "0x30", "dec": 48},
"SFSTXON": {"hex": "0x31", "dec": 49},
"SXOFF": {"hex": "0x32", "dec": 50},
"SCAL": {"hex": "0x33", "dec": 51},
"SRX": {"hex": "0x34", "dec": 52},
"STX": {"hex": "0x35", "dec": 53},
"SIDLE": {"hex": "0x36", "dec": 54},
"SAFC": {"hex": "0x37", "dec": 55},
"SWOR": {"hex": "0x38", "dec": 56},
"SPWD": {"hex": "0x39", "dec": 57},
"SFRX": {"hex": "0x3A", "dec": 58},
"SFTX": {"hex": "0x3B", "dec": 59},
"SWORRST": {"hex": "0x3C", "dec": 60},
"SNOP": {"hex": "0x3D", "dec": 61}
},
"STATUS": {
"PARTNUM": {"hex": "0x30", "dec": 48},
"VERSION": {"hex": "0x31", "dec": 49},
"FREQEST": {"hex": "0x32", "dec": 50},
"LQI": {"hex": "0x33", "dec": 51},
"RSSI": {"hex": "0x34", "dec": 52},
"MARCSTATE": {"hex": "0x35", "dec": 53},
"WORTIME1": {"hex": "0x36", "dec": 54},
"WORTIME0": {"hex": "0x37", "dec": 55},
"PKTSTATUS": {"hex": "0x38", "dec": 56},
"VCO_VC_DAC": {"hex": "0x39", "dec": 57},
"TXBYTES": {"hex": "0x3A", "dec": 58},
"RXBYTES": {"hex": "0x3B", "dec": 59},
"NUM_RXBYTES": {"hex": "0x7F", "dec": 127}
},
"MEMORY": {
"PATABLE": {"hex": "0x3E", "dec": 62},
"TXFIFO": {"hex": "0x3F", "dec": 63},
"RXFIFO": {"hex": "0x3F", "dec": 63}
},
"MASKS": {
"LQI_RX": {"hex": "0x01", "dec": 1},
"CRC_OK": {"hex": "0x80", "dec": 128}
},
"ACCESS": {
"WRITE_BURST": {"hex": "0x40", "dec": 64},
"READ_SINGLE": {"hex": "0x80", "dec": 128},
"READ_BURST": {"hex": "0xC0", "dec": 192}
}
}

12
freq.txt Normal file
View File

@ -0,0 +1,12 @@
Handheld Init
2.4312 GHZ (mid)
2.439 (strong)
2.447 GHZ (strong)
2.4632 GHZ (strong)
2.471 GHZ (weak)
Test Pts
2410000.000
2430000.000
2450000.000
2470000.000

166
read.py Normal file
View File

@ -0,0 +1,166 @@
import spidev
import time
import json
# Example register to read (e.g., version)
VERSION_REG = 0xF1 # CC2500 version register (0xF1 is 0x31 | 0xC0 for read + burst)
# Initialize SPI
global spi
global init_data
# global regs_data
global CONFIG_REGS
global STROBES
global STATUS
global MEMORY
global MASKS
global ACCESS
def asb (a):
return int(b,16)
def strobe(command):
"""Send a command strobe to CC2500"""
spi.xfer2([command])
def write_reg(addr, value):
"""Write single byte to a register"""
spi.xfer2([addr, value])
def burst_write(addr, data):
"""Write multiple bytes to FIFO or registers"""
BURST = 0x40
spi.xfer2([addr | BURST] + data)
def burst_read(addr, length):
"""Read multiple bytes"""
READ_SINGLE = ACCESS["READ_SINGLE"]["dec"]
READ_BURST = ACCESS["READ_BURST"]["dec"]
return spi.xfer2([addr | READ_SINGLE | READ_BURST] + [0x00] * length)
def read_register(addr):
READ_SINGLE = ACCESS["READ_SINGLE"]["dec"]
# Send address | 0x80 (read), then 0x00 dummy to clock in response
response = spi.xfer2([READ_SINGLE | addr, 0x00])
return response[1]
def init_cc2500():
spi.open(0, 0) # Bus 0, CE0 (Pin 24)
spi.max_speed_hz = 500000 # Safe start speed
spi.mode = 0b00 # SPI mode 0
print("Sending SRES (reset)...")
spi.xfer2([SRES])
time.sleep(0.1)
print("Sending SNOP (no-op)...")
status = spi.xfer2([SNOP])[0]
print(f"Status byte: 0x{status:02X}")
print("Reading VERSION register...")
version = read_register(0x31)
print(f"CC2500 VERSION register: 0x{version:02X}")
spi.close()
def send_packet(data):
# Flush TX FIFO
strobe(0x3B) # SFTX
# Load data to TX FIFO (fixed length)
burst_write(0x3F, data) # 0x3F = TX FIFO
# Strobe STX to transmit
strobe(0x35) # STX
print(f"Sent: {data}")
def receive_packet():
# Flush RX FIFO
SFRX = STROBES["SFRX"]["dec"]
strobe(SFRX) # SFRX
SRX = STROBES["SRX"]["dec"]
# Go into RX mode
strobe(SRX) # SRX
# Wait for data (use GDO0 in real app)
time.sleep(0.1)
# Check RXBYTES
RXBYTES = STATUS["RXBYTES"]["dec"]
rx_bytes = read_register(RXBYTES) & 0x7F
if rx_bytes == 0:
print("No data received.")
return None
# Read data
data = burst_read(0x3F, rx_bytes) # 0x3F = RX FIFO
print(f"Received: {data}")
return data
def test_read_write_reg():
# FIFOTHR = CONFIG_REGS["FIFOTHR"]["dec"]
FIFOTHR = 0x03
print("reg ", hex(FIFOTHR))
initial_val = read_register(FIFOTHR)
test_value = initial_val + 1
write_reg(FIFOTHR, test_value)
check = read_register(FIFOTHR)
write_reg(FIFOTHR, initial_val)
print("initial value ", initial_val)
print("test value ", test_value)
print("check ",check)
return check == test_value
if __name__ == "__main__":
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CE0 (Pin 24)
spi.max_speed_hz = 2000000 # Safe start speed
spi.mode = 0b00 # SPI mode 0
with open("cc2500_init.json", "r") as f:
init_data = json.load(f)
with open("cc2500_regs.json", "r") as f:
regs_data = json.load(f)
CONFIG_REGS = regs_data["CONFIG_REGS"]
STROBES = regs_data["STROBES"]
STATUS = regs_data["STATUS"]
MEMORY = regs_data["MEMORY"]
MASKS = regs_data["MASKS"]
ACCESS = regs_data["ACCESS"]
SRES = STROBES["SRES"]["dec"]
SNOP = STROBES["SNOP"]["dec"]
VERSION = STATUS["VERSION"]["dec"]
print("Sending SRES (reset)...")
spi.xfer2([SRES])
time.sleep(0.1)
print("Sending SNOP (no-op)...")
status = spi.xfer2([SNOP])[0]
print(f"Status byte: 0x{status:02X}")
print("Reading VERSION register...")
version = read_register(0x31)
print(f"CC2500 VERSION register: 0x{version:02X}")
for reg_name, values in init_data.items():
addr_dec = regs_data["CONFIG_REGS"][reg_name]["dec"]
addr_hex = regs_data["CONFIG_REGS"][reg_name]["dec"]
value_hex = values["hex"]
value_dec = values["dec"]
# print(addr)
# print(values["hex"])
# print("writing "+str(addr_hex) + " to "+str(addr_dec))
write_reg(addr_dec, value_dec)
print("Read + Write test ", test_read_write_reg())
while True:
receive_packet()
time.sleep(1)
spi.close()

50
test.py Executable file
View File

@ -0,0 +1,50 @@
import spidev
import time
cc2500_config = {
0x00: 0x0B, # IOCFG2
0x02: 0x06, # IOCFG0
0x03: 0x00, # FIFOTHR
0x07: 0x08, # FSCTRL1
0x08: 0x00, # FSCTRL0
0x0B: 0x06, # IOCFG0 (repeating correct setting)
0x0C: 0x00, # FIFOTHR
0x0D: 0x5D, # FREQ2
0x0E: 0x93, # FREQ1
0x0F: 0xB1, # FREQ0
0x10: 0x2D, # MDMCFG4
0x11: 0x3B, # MDMCFG3
0x12: 0x73, # MDMCFG2
0x15: 0x00, # DEVIATN
0x18: 0x18, # MCSM0
0x19: 0x1D, # FOCCFG
0x1A: 0x1C, # BSCFG
0x1B: 0xC7, # AGCCTRL2
0x22: 0x11, # FREND0
0x23: 0xE9, # FSCAL3
0x24: 0x2A, # FSCAL2
0x25: 0x00, # FSCAL1
0x26: 0x1F, # FSCAL0
0x2C: 0x81, # TEST2
0x2D: 0x35, # TEST1
0x2E: 0x09, # TEST0
0x06: 0x00, # ADDR (only once)
0x1E: 0x05, # PKTCTRL0
0x07: 0x00, # CHANNR
}
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CE0
spi.max_speed_hz = 500000 # Adjust if needed
spi.mode = 0 # CC2500 usually works in SPI mode 0
def cc2500_strobe(command):
resp = spi.xfer2([command])
return resp[0]
SRES = 0x30 # Reset strobe command
print("Sending reset to CC2500...")
status = cc2500_strobe(SRES)
print(f"Status byte: 0x{status:02X}")

31
wiring.txt Normal file
View File

@ -0,0 +1,31 @@
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)