diff --git a/cc2500.pdf b/cc2500.pdf new file mode 100644 index 0000000..ae83236 Binary files /dev/null and b/cc2500.pdf differ diff --git a/cc2500_init.json b/cc2500_init.json new file mode 100644 index 0000000..6fc3332 --- /dev/null +++ b/cc2500_init.json @@ -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} +} \ No newline at end of file diff --git a/cc2500_regs.json b/cc2500_regs.json new file mode 100644 index 0000000..a98a286 --- /dev/null +++ b/cc2500_regs.json @@ -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} + } + +} diff --git a/freq.txt b/freq.txt new file mode 100644 index 0000000..e833447 --- /dev/null +++ b/freq.txt @@ -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 \ No newline at end of file diff --git a/read.py b/read.py new file mode 100644 index 0000000..7505728 --- /dev/null +++ b/read.py @@ -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() diff --git a/test.py b/test.py new file mode 100755 index 0000000..ba3f972 --- /dev/null +++ b/test.py @@ -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}") diff --git a/wiring.txt b/wiring.txt new file mode 100644 index 0000000..6bc9535 --- /dev/null +++ b/wiring.txt @@ -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) \ No newline at end of file