123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #!/usr/bin/env python3
- import struct
- from pyftdi.spi import SpiController
- class BoardControlBase(object):
- def __init__(self, addr='ftdi://ftdi:2232h/1', spi_frequency=30e6, spi_cs=None):
- # SPI link
- self.spi_frequency = spi_frequency
- self.spi = SpiController(cs_count=3)
- self.spi.configure(addr)
- if spi_cs is not None:
- self.slave = self.spi.get_port(cs=spi_cs, freq=self.spi_frequency, mode=0)
- else:
- self.slave = self._spi_probe()
- def _spi_probe(self):
- for cs in [0, 2]:
- port = self.spi.get_port(cs=cs, freq=self.spi_frequency, mode=0)
- r = port.exchange(b'\x00', duplex=True)[0]
- if r != 0xff:
- return port
- raise RuntimeError('Automatic SPI CS probe failed')
- def reg_w16(self, reg, v):
- self.slave.exchange(struct.pack('>BH', reg, v))
- def reg_w8(self, reg, v):
- self.slave.exchange(struct.pack('>BB', reg, v))
- def reg_burst(self, reg, data):
- self.slave.exchange(bytearray([reg]) + data)
- def read_status(self):
- rv = self.slave.exchange(bytearray(2), duplex=True)
- return rv[0] | rv[1]
- def arg_group_setup(group):
- group.add_argument('--spi-freq', type=float, help='SPI frequency in MHz', default=30.0)
- group.add_argument('--spi-cs', type=int, help='SPI slave select id (-1 = probe)', default=-1)
- group.add_argument('--ftdi-addr', type=str, help='FTDI address', default='ftdi://ftdi:2232h/1')
- def arg_to_kwargs(args):
- return {
- 'spi_frequency': args.spi_freq * 1e6,
- 'spi_cs': args.spi_cs if (args.spi_cs >= 0) else None,
- 'addr': args.ftdi_addr,
- }
|