Python 基于 FTDI FT2232H 实现 SPI 通信控制
本文介绍了使用 Python 语言配合 ctypes 库调用 FTDI ftd2xx.dll 动态链接库,通过 FT2232H 芯片的 MPSSE 模式实现 SPI 通信控制的代码示例。
核心功能
- 设备初始化与 MPSSE 模式配置
- 时钟频率设置与 CS 信号控制
- 寄存器读写(单字节、连续、增量)
- EEPROM 操作支持
代码实现
import os
import time
import array
import ctypes
from ctypes import *
from enum import Enum
import math
import re
class Device_status(Enum):
FT_OK = 0
FT_INVALID_HANDLE = 1
FT_DEVICE_NOT_FOUND = 2
FT_DEVICE_NOT_OPENED = 3
FT_IO_ERROR = 4
FT_INSUFFICIENT_RESOURCES = 5
FT_INVALID_PARAMETER = 6
FT_INVALID_BAUD_RATE = 7
FT_DEVICE_NOT_OPENED_FOR_ERASE = 8
FT_DEVICE_NOT_OPENED_FOR_WRITE = 9
FT_FAILED_TO_WRITE_DEVICE = 10
FT_EEPROM_READ_FAILED = 11
FT_EEPROM_WRITE_FAILED = 12
FT_EEPROM_ERASE_FAILED = 13
FT_EEPROM_NOT_PRESENT = 14
FT_EEPROM_NOT_PROGRAMMED = 15
FT_INVALID_ARGS = 16
FT_NOT_SUPPORTED = 17
FT_OTHER_ERROR = 18
FT_DEVICE_LIST_NOT_READY = 19
MemSize = 512
SPIDATALENGTH = 11
READ = 0xC0
WRITE =
WREN =
ERAL =
BAD_COMMAND_RESPONSE =
MSB_RISING_EDGE_CLOCK_BYTE_OUT =
MSB_FALLING_EDGE_CLOCK_BYTE_OUT =
MSB_RISING_EDGE_CLOCK_BIT_OUT =
MSB_FALLING_EDGE_CLOCK_BIT_OUT =
MSB_RISING_EDGE_CLOCK_BYTE_IN =
MSB_RISING_EDGE_CLOCK_BIT_IN =
MSB_FALLING_EDGE_CLOCK_BYTE_IN =
MSB_FALLING_EDGE_CLOCK_BIT_IN =
(ctypes.Structure):
_fields_ = [(, ctypes.c_ubyte * )]
(ctypes.Structure):
_fields_ = [(, ctypes.c_ubyte * )]
(ctypes.Structure):
_fields_ = [(, ctypes.c_ubyte * MemSize)]
(ctypes.Structure):
_fields_ = [(, ctypes.c_ubyte * MemSize)]
(ctypes.Structure):
_fields_ = [
(, ctypes.c_ulong),
(, ctypes.c_ulong),
(, ctypes.c_ulong),
(, ctypes.c_ulong),
(, ctypes.c_char * ),
(, ctypes.c_char * ),
(, ctypes.c_char_p),
(, ctypes.c_void_p)
]
:
():
.output_buffer = OutBuffer()
.input_buffer = InBuffer()
.clock_div =
.num_bytes_to_send =
.num_bytes_send = ctypes.c_ulong()
.num_bytes_read = ctypes.c_ulong()
.num_input_buffer = ctypes.c_ulong()
.byte_data_read =
.mem_addr =
.data_out_buffer = OutDataBuffer()
.data_in_buffer = InDataBuffer()
.ft_status =
.dummy_rd =
.dummy_wr =
.high_addr =
.bit_wr_flag =
.ftdiHandle = ctypes.c_void_p()
.ftd2xx = ctypes.cdll.LoadLibrary
current_dir = os.path.dirname(os.path.abspath(__file__))
file_name = os.path.join(current_dir, )
.lib_ftd2xx = .ftd2xx(file_name)
.debug =
.reg_config_all_file_path =
.reg_config_file_path =
fid = (.reg_config_file_path, )
fid.write(.(.ljust(, ), .ljust(, ), .ljust(, )))
fid.close()
fid = (.reg_config_all_file_path, )
fid.write()
fid.close()
():
result = []
i (, (lst), size):
result.append(lst[i:i + size])
result
():
b_len = bit_h - bit_l +
val > ** (bit_h - bit_l + ) - :
ValueError(.(val, b_len))
data_bin = (data)[:].rjust(bit_len, )
data_bin_list = (data_bin)[::-]
val_bin = (val)[:].rjust(b_len, )
val_bin_list = (val_bin)[::-]
k =
i (bit_l, bit_h + ):
data_bin_list[i] = val_bin_list[k]
k +=
data_final = .join(data_bin_list[::-])
(data_final, )
():
i ():
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
():
loop ():
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
():
addr = addr >>
high_addr = addr >>
high_addr != .high_addr:
.ft2232_write_high_addr(high_addr)
addr = addr &
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ((addr >> ) & ) <<
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (addr >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = addr &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = value &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = math.ceil(.dummy_wr/) -
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
ft_status = .lib_ftd2xx.FT_Read(.ftdiHandle, .input_buffer.data, , byref(.num_bytes_read))
.num_bytes_to_send =
ft_status
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = value &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = math.ceil(.dummy_wr / ) -
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status
():
addr = addr >>
high_addr = addr >>
high_addr != .high_addr:
.ft2232_write_high_addr(high_addr)
addr = addr &
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ((addr >> ) & ) <<
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (addr >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = addr &
.num_bytes_to_send +=
i (length):
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_IN
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
ft_status = .lib_ftd2xx.FT_Read(.ftdiHandle, .input_buffer.data, length*, byref(.num_bytes_read))
bdata = []
n ((length)):
bdata.append((((.input_buffer.data[+*n] << ) + (.input_buffer.data[+*n] << ) + (.input_buffer.data[+*n] << ) + .input_buffer.data[+*n])))
.num_bytes_to_send =
bdata
():
addr = addr >>
high_addr = addr >>
high_addr != .high_addr:
.ft2232_write_high_addr(high_addr)
addr = addr &
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ((addr >> ) & ) <<
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (addr >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = addr &
.num_bytes_to_send +=
i ((data_list)):
value = data_list[i]
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (value >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = value &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (math.ceil(.dummy_wr / ) - )
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
dummy_wr = math.ceil(dummy_wr/) *
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = dummy_wr
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
.dummy_wr = dummy_wr
ft_status
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = high_addr >>
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (high_addr & ) <<
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
.high_addr = high_addr
ft_status
():
.debug == :
.ft2232_write(addr, value)
.bit_wr_flag == :
(.reg_config_file_path, ) fid:
lines = fid.readlines()
fid.close()
(lines) > :
lines[-] lines[-] lines[-]:
last_addr =
:
last_addr = (re.split(, lines[-])[].strip(), )
:
last_addr =
last_addr == addr:
final_lines = lines[:-]
final_lines.append(.((addr).ljust(, ), (value).ljust(, )))
:
final_lines = lines
final_lines.append(.((addr), (value)))
(.reg_config_file_path, ) fid:
line final_lines:
fid.write(line)
fid.close()
(.reg_config_all_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), (value).ljust(, ), .ljust(, ), .ljust(, , )))
fid.close()
():
.bit_wr_flag =
.debug == :
data = (.read(addr), )
w_data = .set_reg(data, bit_h, bit_l, value)
.write(addr, w_data)
.bit_wr_flag =
(.reg_config_file_path, ) fid:
lines = fid.readlines()
fid.close()
(lines) > :
lines[-] lines[-] lines[-]:
last_addr =
:
last_addr = (re.split(, lines[-])[].strip(), )
:
last_addr =
last_addr == addr:
final_lines = lines[:-]
final_lines.append(.((addr).ljust(, ), (w_data).ljust(, )))
:
final_lines = lines
final_lines.append(.((addr), (w_data)))
(.reg_config_file_path, ) fid:
line final_lines:
fid.write(line)
fid.close()
(.reg_config_all_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), (value).ljust(, ), (bit_h).ljust(, ), (bit_l).ljust(, , )))
fid.close()
():
.num_bytes_send = ctypes.c_ulong()
addr = addr >>
high_addr = addr >>
high_addr != .high_addr:
.ft2232_write_high_addr(high_addr)
addr = addr &
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ((addr >> ) & ) <<
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = (addr >> ) &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = addr &
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = .dummy_rd -
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_IN
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status = .lib_ftd2xx.FT_Read(.ftdiHandle, .input_buffer.data, , byref(.num_bytes_read))
bdata = ((.input_buffer.data[] << ) +(.input_buffer.data[] << ) +(.input_buffer.data[] << ) + .input_buffer.data[])
(bdata)[:].upper()
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = math.ceil(.dummy_rd/) - +
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status = .lib_ftd2xx.FT_Read(.ftdiHandle, .input_buffer.data, , byref(.num_bytes_read))
bdata = ((.input_buffer.data[] << ) +(.input_buffer.data[] << ) +(.input_buffer.data[] << ) + .input_buffer.data[])
(bdata)[:].upper()
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
dummy_rd = math.ceil(dummy_rd / ) *
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = dummy_rd
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(.ftdiHandle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
.dummy_rd = dummy_rd
ft_status
():
.debug == :
b_data = .ft2232_read(addr)
:
b_data =
.bit_wr_flag == :
(.reg_config_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), b_data.ljust(, )))
fid.close()
(.reg_config_all_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), b_data.ljust(, )))
fid.close()
b_data
():
.bit_wr_flag =
.debug == :
data = .read(addr)
:
data =
.bit_wr_flag =
data_bin = ((data, ))[:].rjust(, )
data_list = (data_bin)
data_list.reverse()
data_ret = data_list[bit_l:bit_h + ]
data_ret.reverse()
ret = .join(data_ret)
data_hex = ((ret, ))[:]
(.reg_config_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), data.ljust(, )))
fid.close()
(.reg_config_all_file_path, ) fid:
fid.write(.(
(addr).ljust(, ), data.ljust(, ), (bit_h).ljust(, ), (bit_l).ljust(, , )))
fid.close()
data_hex
():
ft_status = .lib_ftd2xx.FT_ResetDevice(ft_handle)
ft_status |= .lib_ftd2xx.FT_GetQueueStatus(ft_handle, byref(.num_input_buffer))
ft_status == Device_status.FT_OK.value .num_input_buffer.value > :
ft_status |= .lib_ftd2xx.FT_Read(ft_handle, .input_buffer, .num_input_buffer, .num_bytes_read)
ft_status |= .lib_ftd2xx.FT_SetUSBParameters(ft_handle, , )
ft_status |= .lib_ftd2xx.FT_SetChars(ft_handle, , , , )
ft_status |= .lib_ftd2xx.FT_SetTimeouts(ft_handle, , )
ft_status |= .lib_ftd2xx.FT_SetLatencyTimer(ft_handle, )
ft_status |= .lib_ftd2xx.FT_SetBitMode(ft_handle, , )
ft_status |= .lib_ftd2xx.FT_SetBitMode(ft_handle, , )
ft_status != Device_status.FT_OK.value:
()
time.sleep()
.num_bytes_to_send =
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
.num_input_buffer.value == ft_status == Device_status.FT_OK.value:
ft_status = .lib_ftd2xx.FT_GetQueueStatus(ft_handle, byref(.num_input_buffer))
b_command_echod =
ft_status = .lib_ftd2xx.FT_Read(ft_handle, .input_buffer.data, .num_input_buffer, byref(.num_bytes_read))
dw_count (, .num_bytes_read.value - ):
.input_buffer.data[dw_count] == .input_buffer.data[dw_count + ] == :
b_command_echod =
b_command_echod:
()
.num_bytes_to_send =
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
(.num_input_buffer == ) (ft_status == Device_status.FT_OK):
ft_status = .lib_ftd2xx.FT_GetQueueStatus(ft_handle, byref(.num_input_buffer))
b_command_echod =
ft_status = .lib_ftd2xx.FT_Read(ft_handle, .input_buffer.data, .num_input_buffer, byref(.num_bytes_read))
dw_count (, .num_bytes_read.value - ):
.input_buffer.data[dw_count] == .input_buffer.data[dw_count + ] == :
b_command_echod =
b_command_echod:
()
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ctypes.c_ubyte(.clock_div & )
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ctypes.c_ubyte(.clock_div >> )
.num_bytes_to_send +=
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
time.sleep()
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
time.sleep()
()
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = WRITE
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ctypes.c_ubyte(address)
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = bdata >>
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = bdata &
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status
():
.num_bytes_send = ctypes.c_ulong()
.SPI_CSEnable()
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = READ
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BIT_OUT
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = ctypes.c_ubyte(address)
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] = MSB_FALLING_EDGE_CLOCK_BYTE_IN
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.output_buffer.data[.num_bytes_to_send] =
.num_bytes_to_send +=
.SPI_CSDisable()
ft_status = .lib_ftd2xx.FT_Write(ft_handle, .output_buffer.data, .num_bytes_to_send, byref(.num_bytes_send))
.num_bytes_to_send =
ft_status = .lib_ftd2xx.FT_Read(ft_handle, .input_buffer.data, , byref(.num_bytes_read))
bdata = [((.input_buffer.data[] << ) + .input_buffer.data[])]
ft_status
():
.lib_ftd2xx.FT_Close(.ftdiHandle)
numDevs = ctypes.c_ulong()
devInfo = FT_DEVICE_LIST_INFO_NODE()
ft_status = .lib_ftd2xx.FT_CreateDeviceInfoList(ctypes.byref(numDevs))
ft_status == Device_status.FT_OK.value:
(.(numDevs.value))
:
()
(numDevs.value) > :
devInfo = (FT_DEVICE_LIST_INFO_NODE * numDevs.value)()
ft_status = .lib_ftd2xx.FT_GetDeviceInfoList(devInfo, byref(numDevs))
ft_status == Device_status.FT_OK.value:
i (numDevs.value):
( % i)
(.(devInfo[i].flags))
(.(devInfo[i].))
(.(devInfo[i].))
(.(devInfo[i].locId))
(.(devInfo[i].serial_number))
(.(devInfo[i].description))
(.(devInfo[i].ft_handle))
:
ft_status = .lib_ftd2xx.FT_Open(, byref(.ftdiHandle))
(ft_status)
ft_status != Device_status.FT_OK.value:
ValueError()
:
()
.SPI_Initial(.ftdiHandle):
ReadByte =
i (MemSize):
.data_out_buffer.data[i] = i
ft_status = .lib_ftd2xx.FT_GetQueueStatus(.ftdiHandle, byref(.num_bytes_read))
ft_status != Device_status.FT_OK.value .num_input_buffer.value > :
.lib_ftd2xx.FT_Read(.ftdiHandle, .input_buffer.data, .num_input_buffer, byref(.num_bytes_read))
():
.ft2232_read_dly(dummy_rd)
():
.ft2232_write_dly(dummy_wr)
():
b_data = .ft2232_read_inc()
b_data
():
.ft2232_write_inc(value)
():
length > :
ValueError()
data = []
count = math.ceil(length/)
n (count):
length/ > :
bdata = .ft2232_read_con(addr+n*(*), )
:
bdata = .ft2232_read_con(addr + n * ( * ), length)
data = data+bdata
data
():
(data_list) > :
ValueError()
max_len =
w_data_list = .split_list(data_list, max_len)
n ((w_data_list)):
.ft2232_write_con(addr+n*(*), w_data_list[n])
():
time.sleep(sec)
(.reg_config_all_file_path, ) fid:
fid.write(.((sec)))
fid.close()
(.reg_config_file_path, ) fid:
fid.write(.((sec)))
fid.close()
__name__ == :
spi = SPI()
spi.ft2232_init()
i ():
spi.set_dummy_wr(dummy_wr=)
spi.set_dummy_rd(dummy_rd=)
(spi.read())

