102 lines
3.0 KiB
Python
102 lines
3.0 KiB
Python
import spidev
|
|
import RPi.GPIO as GPIO
|
|
from util import sleep, get_addr
|
|
from init_regs_value import init_regs_value
|
|
from regs_addr import regs_addr
|
|
CONFIG_REGS = regs_addr["CONFIG_REGS"]
|
|
STROBES = regs_addr["STROBES"]
|
|
STATUS = regs_addr["STATUS"]
|
|
MEMORY = regs_addr["MEMORY"]
|
|
MASKS = regs_addr["MASKS"]
|
|
ACCESS = regs_addr["ACCESS"]
|
|
SRES = STROBES["SRES"]
|
|
SNOP = STROBES["SNOP"]
|
|
VERSION = STATUS["VERSION"]
|
|
MARCSTATE = STATUS["MARCSTATE"]
|
|
|
|
|
|
def write_reg(spi, addr, value):
|
|
"""Write single byte to a register"""
|
|
spi.xfer2([addr, value])
|
|
sleep(0.1)
|
|
|
|
def read_register(spi, addr):
|
|
READ_SINGLE = get_addr("READ_SINGLE")
|
|
# Send address | 0x80 (read), then 0x00 dummy to clock in response
|
|
response = spi.xfer2([READ_SINGLE | addr, 0x00])
|
|
# sleep(0.1)
|
|
return response[1]
|
|
|
|
def write_burst(spi, addr, data):
|
|
"""Write multiple bytes using burst write"""
|
|
WRITE_BURST = get_addr("WRITE_BURST")
|
|
tbuf = [addr | WRITE_BURST] + data
|
|
spi.xfer2(tbuf)
|
|
sleep(0.1)
|
|
|
|
def read_burst(spi, addr, length):
|
|
"""Read multiple bytes using burst read"""
|
|
READ_BURST = get_addr("READ_BURST")
|
|
rbuf = [addr | READ_BURST] + [0x00] * length
|
|
response = spi.xfer2(rbuf)
|
|
sleep(0.1)
|
|
return response[1:] # Skip status byte
|
|
|
|
def strobe(spi, command):
|
|
"""Send a command strobe to CC2500"""
|
|
spi.xfer2([command])
|
|
sleep(0.1)
|
|
|
|
def init_cc_2500(spi):
|
|
for reg_name, value in init_regs_value.items():
|
|
addr = get_addr(reg_name)
|
|
write_reg(spi, addr, value)
|
|
|
|
def setup_spi():
|
|
spi = spidev.SpiDev()
|
|
spi.open(0, 0) # Bus 0, CE0 (Pin 24)
|
|
spi.max_speed_hz = 100_000 # Safe start speed
|
|
spi.mode = 0b00 # SPI mode 0
|
|
return spi
|
|
|
|
|
|
def setup_gpio(GDO0_PIN=17, GDO2_PIN=27):
|
|
GPIO.setmode(GPIO.BCM)
|
|
GPIO.setup(GDO0_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
|
GPIO.setup(GDO2_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
|
sleep(0.1)
|
|
|
|
def reset(spi):
|
|
# print("Sending SRES (reset)...")
|
|
spi.xfer2([SRES])
|
|
sleep(0.5)
|
|
|
|
# print("Sending SNOP (no-op)...")
|
|
status = spi.xfer2([SNOP])[0]
|
|
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...")
|
|
version = read_register(spi, VERSION)
|
|
print(f"CC2500 VERSION register: 0x{version:02X}")
|
|
# if version != 0x2F:
|
|
# raise Exception("Expected Version was 0x0F!! Quitting")
|
|
|
|
|
|
def test_read_write_reg(spi, dbg=False):
|
|
FIFOTHR = get_addr("FIFOTHR")
|
|
initial_val = read_register(spi, FIFOTHR)
|
|
test_value = initial_val + 1
|
|
write_reg(spi, FIFOTHR, test_value)
|
|
check = read_register(spi, FIFOTHR)
|
|
write_reg(spi, FIFOTHR, initial_val)
|
|
if((check != test_value) or dbg):
|
|
print("initial value ", initial_val)
|
|
print("test value ", test_value)
|
|
print("check ",check)
|
|
if(not dbg):
|
|
raise Exception("Test Read+Write failed")
|
|
return check == test_value |