X-Git-Url: https://defiant.homedns.org/gitweb/?a=blobdiff_plain;f=bus_pirate.py;h=02f3fb8211024a29eb0165be158aef32be520d82;hb=1c4ce051633cb05741796f49e178f4b3bde28c4a;hp=4ef9c61d4eacf79612be535156477e553b4d770b;hpb=6af0c706c1dd1b0ae4cbc38adf1f056a8686aae4;p=pyshared.git diff --git a/bus_pirate.py b/bus_pirate.py index 4ef9c61..02f3fb8 100644 --- a/bus_pirate.py +++ b/bus_pirate.py @@ -3,6 +3,7 @@ import serial import struct +import threading dPinToBit = { "POWER": 6, @@ -18,14 +19,16 @@ dPinToBit = { # http://dangerousprototypes.com/docs/SPI_(binary) class BP: def __init__(self, sDevice): + self.lock = threading.Lock() self.pSerial = serial.Serial(sDevice, baudrate=115200, timeout=0.1) self.mode_bit_bang() self.io_state = 0 self.io_dir = 0 def command(self, cmd, num_read): - self.pSerial.write(cmd) - return self.pSerial.read(num_read) + with self.lock: + self.pSerial.write(cmd) + return self.pSerial.read(num_read) def mode_bit_bang(self): for i in range(20): @@ -64,6 +67,29 @@ class BP: v = struct.unpack(">h", s) return v[0]/1024.0*6.6 + # http://codepad.org/qtYpZmIF + def pwm(self, freq, duty_cycle_percent): + lPrescaler = {0:1, 1:8 , 2:64, 3:256} + Fosc = 32e6 + Tcy = 2.0 / Fosc + period = 1.0 / freq + prescaler = 1 + + # find needed prescaler + for i in range(4): + prescaler = lPrescaler[i] + PRy = period * 1.0 / (Tcy * prescaler) + PRy = int(PRy - 1) + OCR = int(PRy * duty_cycle_percent) + + if PRy < (2 ** 16 - 1): + break # valid value for PRy, keep values + + cmd = struct.pack(">BBHH", 0b00010010, i, OCR, PRy) + ret = self.command(cmd, 1) + if ord(ret) != 0x1: + raise Exception() + def spi_command(self, cmd): ret = self.command(cmd, 1) if ord(ret) != 0x1: @@ -132,6 +158,15 @@ class BP: if ord(ret) != 0x1: raise Exception() + def i2c_ping(self, addr): + # 1. Write + # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..) + msg = struct.pack(">BHHB", 0x08, 1, 0, addr) + ret = self.command(msg, 1) + + if ord(ret[0]) != 0x1: + raise Exception("I2C ping failed") + def i2c_write(self, addr, reg, s): # 1. Write # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..) @@ -143,7 +178,8 @@ class BP: def i2c_read(self, addr, reg, num_read): # set reg - self.i2c_write(addr, reg, "") + if reg != None: + self.i2c_write(addr, reg, "") # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..) msg = struct.pack(">BHHB", 0x08, 1, num_read, addr | 0x1)