Skip to content

Instantly share code, notes, and snippets.

@loganwilliams
Created October 26, 2016 17:36
Show Gist options
  • Select an option

  • Save loganwilliams/9ec1a7f977695e35196ac4169b85e492 to your computer and use it in GitHub Desktop.

Select an option

Save loganwilliams/9ec1a7f977695e35196ac4169b85e492 to your computer and use it in GitHub Desktop.

Revisions

  1. loganwilliams created this gist Oct 26, 2016.
    75 changes: 75 additions & 0 deletions capture-test.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    from periphery import I2C
    import time
    import numpy as np
    import copy
    import pickle

    i2c = I2C("/dev/i2c-1")

    device_address = 0x1A

    def generate_command(register, value):
    return [I2C.Message([register, value])]

    def send_command(cmd)
    i2c.transfer(device_addess, cmd)
    time.sleep(0.005) # sleep for 5 ms

    wakeup = generate_command(0x01, 0x01) # wake up the device
    adc_res = generate_command(0x03, 0x0C) # set ADC resolution to 16 bits
    bias_top = generate_command(0x04, 0x0C) #
    bias_bottom = generate_command(0x05, 0x0C) #
    clk_speed = generate_command(0x06, 0x14)
    cm_top = generate_command(0x07, 0x0C)
    cm_bottom = generate_command(0x08, 0x0C)
    pull_ups = generate_command(0x09, 0x88)

    def generate_expose_block_command(block):
    return generate_command(0x01, 0x09 + (block << 4))

    print("Sending commands")

    send_command(wakeup)
    send_command(adc_res)
    send_command(bias_top)
    send_command(bias_bottom)
    send_command(clk_speed)
    send_command(cm_top)
    send_command(cm_bottom)
    send_command(pull_ups)

    pixel_values = np.zeros(1024)
    ptats = np.zeros(8)

    for block in range(4):
    print("Exposing block " + str(block))
    send_command(generate_expose_block_command(block))

    query = [I2C.Message([0x02]), I2C.Message([0x00], read=True)]
    expected = 1 + (block << 2)

    done = False

    while not done:
    i2c.transfer(device_addess, query)

    if not (query[1].data == expected):
    print("Not ready, received " + str(query[1].data) + ", expected " + str(expected))
    time.sleep(0.03)
    else:
    done = True

    top_read_block = [I2C.Message([0x0A]), I2C.Message([0x00]*258, read=True)]
    i2c.transfer(device_address, top_read_block)
    top_data = read_block[1].data[1::2] + (read_block[1].data[0::2] << 8)

    bottom_read_block = [I2C.Message([0x0B]), I2C.Message([0x00]*258, read=True)]
    i2c.transfer(device_address, bottom_read_block)
    bottom_data = read_block[1].data[1::2] + (read_block[1].data[0::2] << 8)

    pixel_values[(0+block*128):(127+block*128)] = copy.copy(top_data[1:])
    pixel_values[(896-block*128):(1024-block*128)] = copy.copy(np.flipud(bottom_data[1:]))
    ptats[block] = top_data[0]
    ptats[7-block] = bottom_data[0]

    pickle.dump((pixel_values, ptats), open("capture.p", "wb"))