dev #1

Merged
david merged 25 commits from dev into main 2025-04-28 14:20:45 -07:00
3 changed files with 79 additions and 23 deletions
Showing only changes of commit b4b657b4fd - Show all commits

36
main.py
View File

@ -1,7 +1,10 @@
import spidev import spidev
from util import * from util import *
from receive import receive_packet from receive import receive_packet
debug = True debug = True
GDO0_PIN=23,
GDO2_PIN=24
def menu(): def menu():
print("\nMenu") print("\nMenu")
@ -12,35 +15,44 @@ def menu():
print("5: Run Read+Write test") print("5: Run Read+Write test")
print("0: Quit") print("0: Quit")
if __name__ == "__main__": if __name__ == "__main__":
init_gpio(GDO0_PIN, GDO2_PIN)
spi = spidev.SpiDev() spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CE0 (Pin 24) spi.open(0, 0) # Bus 0, CE0 (Pin 24)
spi.max_speed_hz = 8000000 # Safe start speed # spi.max_speed_hz = 8_000_000 # Safe start speed
spi.max_speed_hz = 100_000 # Safe start speed
spi.mode = 0b00 # SPI mode 0 spi.mode = 0b00 # SPI mode 0
stop = False stop = False
print("Sending SRES (reset)...") print_gdo_state(GDO0_PIN, GDO2_PIN)
# print("Sending SRES (reset)...")
spi.xfer2([SRES]) spi.xfer2([SRES])
sleep(0.5) sleep(0.5)
print("Sending SNOP (no-op)...") # print("Sending SNOP (no-op)...")
status = spi.xfer2([SNOP])[0] status = spi.xfer2([SNOP])[0]
print(f"Status byte: 0x{status:02X}") print(f"Status byte: 0x{status:02X}")
# print("Reading MARCSTATE...")
marc = spi.xfer2([MARCSTATE| 0x80, 0x00])[0]
print(f"Marcstate byte: 0x{marc:02X}")
print("Reading VERSION register...") print("Reading VERSION register...")
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}")
test_read_write_reg(spi)
init_regs(spi)
sleep(0.1)
reg_name = "" reg_name = ""
reg_hex_val = "" reg_hex_val = ""
try: try:
# if version != 0x0F:
# raise Exception("Expected Version was 0x0F!! Quitting")
test_read_write_reg(spi)
init_regs(spi)
while not stop: while not stop:
menu() menu()
cmd = int(input("$: ")) cmd = int(input("$: "))
@ -60,7 +72,7 @@ if __name__ == "__main__":
value_check = read_register(spi,addr) value_check = read_register(spi,addr)
print("Updated Value: " + hex(value) +" == " + str(value)) print("Updated Value: " + hex(value) +" == " + str(value))
elif cmd == 3: elif cmd == 3:
dump_regs(spi) dump_regs(spi, True)
elif cmd == 4: elif cmd == 4:
receive_packet(spi) receive_packet(spi)
elif cmd == 5: elif cmd == 5:
@ -70,4 +82,6 @@ if __name__ == "__main__":
print("Invalid command") print("Invalid command")
finally: finally:
print("Closing SPI...") print("Closing SPI...")
sleep(0.1)
spi.close() spi.close()
sleep(0.1)

View File

@ -1,17 +1,22 @@
def burst_write(addr, data): from util import strobe, get_addr
def burst_write(spi, addr, data):
"""Write multiple bytes to FIFO or registers""" """Write multiple bytes to FIFO or registers"""
BURST = 0x40 BURST = get_addr("BURST")
spi.xfer2([addr | BURST] + data) spi.xfer2([addr | BURST] + data)
def send_packet(data): def send_packet(data):
# Flush TX FIFO # Flush TX FIFO
strobe(0x3B) # SFTX SFTX = get_addr("SFTX")
strobe(SFTX)
# Load data to TX FIFO (fixed length) # Load data to TX FIFO (fixed length)
burst_write(0x3F, data) # 0x3F = TX FIFO TXFIFO = get_addr("TXFIFO")
burst_write(TXFIFO, data) # 0x3F = TX FIFO
# Strobe STX to transmit # Strobe STX to transmit
strobe(0x35) # STX STX = get_addr("STX")
strobe(STX) # STX
print(f"Sent: {data}") print(f"Sent: {data}")

49
util.py
View File

@ -1,5 +1,6 @@
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
import RPi.GPIO as GPIO
import time import time
CONFIG_REGS = regs_addr["CONFIG_REGS"] CONFIG_REGS = regs_addr["CONFIG_REGS"]
STROBES = regs_addr["STROBES"] STROBES = regs_addr["STROBES"]
@ -10,6 +11,33 @@ ACCESS = regs_addr["ACCESS"]
SRES = STROBES["SRES"] SRES = STROBES["SRES"]
SNOP = STROBES["SNOP"] SNOP = STROBES["SNOP"]
VERSION = STATUS["VERSION"] VERSION = STATUS["VERSION"]
MARCSTATE = STATUS["MARCSTATE"]
def init_gpio(GDO0_PIN=23, GDO2_PIN=24):
# Use BCM numbering
GPIO.setmode(GPIO.BCM)
# Set up GPIO 23 and 24 as inputs
# GPIO.setup(GDO0_PIN, GPIO.IN)
# GPIO.setup(GDO2_PIN, GPIO.IN)
GPIO.setup(GDO0_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(GDO2_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# def clear_csn():
# CSN_PIN = 8 # CE0 = GPIO8 (Pin 24)
# GPIO.setmode(GPIO.BCM)
# GPIO.setup(CSN_PIN, GPIO.OUT)
# sleep(0.1)
# GPIO.output(CSN_PIN, GPIO.HIGH)
# sleep(0.1)
def print_gdo_state(GDO0_PIN=23, GDO2_PIN=24):
gdo0 = GPIO.input(23) # Reads 1 or 0
gdo2 = GPIO.input(24)
print(f"GDO0 (GPIO23): {gdo0}, GDO2 (GPIO24): {gdo2}")
sleep(0.1)
def get_addr(name): def get_addr(name):
addr = "" addr = ""
@ -26,15 +54,18 @@ def get_addr(name):
def strobe(spi, command): def strobe(spi, command):
"""Send a command strobe to CC2500""" """Send a command strobe to CC2500"""
spi.xfer2([command]) spi.xfer2([command])
sleep(0.1)
def write_reg(spi, addr, value): def write_reg(spi, addr, value):
"""Write single byte to a register""" """Write single byte to a register"""
spi.xfer2([addr, value]) spi.xfer2([addr, value])
sleep(0.1)
def read_register(spi, addr): def read_register(spi, addr):
READ_SINGLE = get_addr("READ_SINGLE") READ_SINGLE = get_addr("READ_SINGLE")
# Send address | 0x80 (read), then 0x00 dummy to clock in response # Send address | 0x80 (read), then 0x00 dummy to clock in response
response = spi.xfer2([READ_SINGLE | addr, 0x00]) response = spi.xfer2([READ_SINGLE | addr, 0x00])
sleep(0.1)
return response[1] return response[1]
def disable_crc(spi): def disable_crc(spi):
@ -52,20 +83,26 @@ def test_read_write_reg(spi, dbg=False):
write_reg(spi, FIFOTHR, test_value) write_reg(spi, FIFOTHR, test_value)
check = read_register(spi, FIFOTHR) check = read_register(spi, FIFOTHR)
write_reg(spi, FIFOTHR, initial_val) write_reg(spi, FIFOTHR, initial_val)
if(dbg): if(check != test_value):
print("initial value ", initial_val) print("initial value ", initial_val)
print("test value ", test_value) print("test value ", test_value)
print("check ",check) print("check ",check)
elif (not dbg and (check != test_value)): if(not dbg):
raise Exception("Test Read+Write failed") raise Exception("Test Read+Write failed")
return check == test_value return check == test_value
def dump_regs(spi): def dump_regs(spi, cfgonly = False):
for reg_type, reg_data in regs_addr.items(): if cfgonly:
for reg_name, reg_addr in reg_data.items(): for reg_name, reg_addr in CONFIG_REGS.items():
name :str = reg_name name :str = reg_name
value = read_register(spi, reg_addr) value = read_register(spi, reg_addr)
print((name+":").ljust(15) +hex(value).ljust(4)+"\t"+str(value)) print((name+":").ljust(15) +hex(value).ljust(4)+"\t"+str(value))
else:
for reg_type, reg_data in regs_addr.items():
for reg_name, reg_addr in reg_data.items():
name :str = reg_name
value = read_register(spi, reg_addr)
print((name+":").ljust(15) +hex(value).ljust(4)+"\t"+str(value))
def sleep(t): def sleep(t):
return time.sleep(t) return time.sleep(t)