class bitbang_spi: def __init__(self, spi_cs, spi_mosi, spi_miso, spi_clk, rising_data = True, latch = None, enable_low = True): self.gpio = GPIO() self.rising_data = rising_data self.enable_low = enable_low self.spi_cs = spi_cs self.spi_mosi = spi_mosi self.spi_miso = spi_miso self.spi_clk = spi_clk self.latch = latch self.gpio.set_output(spi_cs) self.gpio.set_output(spi_mosi) self.gpio.set_output(spi_clk) if self.spi_miso != None: self.gpio.set_input(spi_miso) if self.latch != None: self.gpio.set_output(latch) self.gpio.set_value(spi_cs, self.enable_low) def transfer(self, payload, bits = 8): self.gpio.set_value(self.spi_cs, not self.enable_low) self.gpio.set_value(self.spi_clk, self.gpio.LOW) if self.latch != None: self.gpio.set_value(self.latch, self.gpio.LOW) response = 0 for i in range(bits): response = response << 1 # data clocked in on clock rising edge self.gpio.set_value(self.spi_mosi, (payload >> (bits - (i + 1))) & 0x01) self.gpio.set_value(self.spi_clk, self.gpio.HIGH) if self.spi_miso != None: response |= self.gpio.read_value(self.spi_miso) if self.latch!= None and i == bits - 1: self.gpio.set_value(self.latch, self.gpio.HIGH) self.gpio.set_value(self.spi_clk, self.gpio.LOW) if self.latch != None: self.gpio.set_value(self.latch, self.gpio.LOW) self.gpio.set_value(self.spi_cs, self.enable_low) return response
class bitbang_spi: def __init__(self, spi_cs, spi_mosi, spi_miso, spi_clk): self.gpio = GPIO() self.spi_cs = spi_cs self.spi_mosi = spi_mosi self.spi_miso = spi_miso self.spi_clk = spi_clk self.gpio.set_output(spi_cs) self.gpio.set_output(spi_mosi) self.gpio.set_output(spi_clk) if self.spi_miso != None: self.gpio.set_input(spi_miso) self.gpio.set_value(spi_cs, self.gpio.HIGH) def transfer(self, payload, bits = 8): self.gpio.set_value(self.spi_cs, self.gpio.LOW) self.gpio.set_value(self.spi_clk, self.gpio.LOW) response = 0 for i in range(bits): response = response << 1 # data clocked in on clock rising edge self.gpio.set_value(self.spi_mosi, (payload >> (bits - (i + 1))) & 0x01) self.gpio.set_value(self.spi_clk, self.gpio.HIGH) if self.spi_miso != None: response |= self.gpio.read_value(self.spi_miso) self.gpio.set_value(self.spi_clk, self.gpio.LOW) self.gpio.set_value(self.spi_cs, self.gpio.HIGH) return response
self.spi.transfer(command, bits = 11) def set_b(self, value): command = (((value & 0x1FF)) << 2) + 1 command = self._revbits(command) self.spi.transfer(command, bits = 11) if __name__ == '__main__': gpio = GPIO() gpio.set_output(TRIG_SEL0) gpio.set_output(TRIG_SEL1) gpio.set_output(REF_SEL) gpio.set_input(COMP_OUT) gpio.set_input(REFCLK) delay = Delay(gpio) dac = Dac(gpio) NDELAYS = 1 << 9 NDACS = 1 << 12 BRUTE_FORCE_TRIG = False # trigger sources: # 0 - clk (delayed) # 1 - unused # 2 - analog trigger # 3 - external pulse