玩转 Xilinx 下载器(四)—— 从 PC 侧直接访问 SPI 从设备
当然,SPI 接口不仅仅可以用来读写编程 SPI Flash,同样可以与所有 SPI 接口设备进行通信,比如 SPI 显示屏、传感器等,受 FT232H 芯片特性限制,SPI Mode 仅支持 Mode 0 和 Mode 2,也就是 CPHA 必须是 0,第一个时钟边沿进行数据采样。接线很不方便,看来转接板还得加两个座,8 PIN 和 16 PIN 的,用来直接连接 SOP8/16 夹子,另外需要
FT232H 芯片支持 SPI 主设备接口,可以从PC侧直接访问 SPI 从设备,手里刚好有 SPI Flash 小板,动手试试。

连接:
VCC <-----> 3V
CS <-----> TMS
DO <-----> TDO
GND <-----> GND
CLK <-----> TCK
DI <-----> TDI

测试代码:
import ftd2xx as ftd
from binascii import hexlify
def ftdi_write(dev, data):
s = bytes(data)
print(hexlify(s))
dev.write(s)
# SPI 传输
def spi_txrx(dev, tx):
size = len(tx)
# 拉低 CS
ftdi_write(dev, (0x80, 0x00, 0x0B))
ftdi_write(dev, (0x31, size%256, size//256) + tx)
rx = dev.read(size)
# 拉高 CS
ftdi_write(dev, (0x80, 0x08, 0x0B))
return rx
d = ftd.open(0)
# 设置 MPSSE 模式
d.setBitMode(0, 2)
# 设置 SPI 频率
SPI_FREQ = 1000000
div = int((12000000 / (SPI_FREQ * 2)) - 1)
d.write(bytes((0x86, div%256, div//256)))
# 配置IO初始状态
# CS Output High, CLK output low, MOSI output low, MISO input
d.write(bytes((0x80, 0x08, 0x0B)))
# 读取 JEDEC ID
id = spi_txrx(d, (0x9F, 0x00, 0x00, 0x00))
print("ID is " + str(hexlify(id[1:])))
运行测试代码需要安装 Python 库 ftd2xx
pip install ftd2xx
在Mac电脑上运行结果:

三字节ID: EF 40 17,与 Flash 手册中的描述一致,说明 SPI 通信正常。

如果是已经焊到板子上的 Flash,可以使用SOP8/16这样的夹子去连接,像下面这样



上边都是使用 FT232H 开发板来实验的,FT232H 有 3V 电源脚可以给 SPI Flash 供电,如果使用商业 Xilinx 下载器,需要给下载器的 VREF 提供参考电压,把 Flash 的 VCC 引脚接到 VREF 上即可。实测了一个 ZYNQ 开发板,板载 16Pin QSPI Flash,JTAG Boot 模式上电,使用 SMT2 下载器可以成功读取 Flash ID。

接线很不方便,看来转接板还得加两个座,8 PIN 和 16 PIN 的,用来直接连接 SOP8/16 夹子,另外需要写个 GUI 小工具来读写编程 SPI Flash,方便日常调试操作。
当然,SPI 接口不仅仅可以用来读写编程 SPI Flash,同样可以与所有 SPI 接口设备进行通信,比如 SPI 显示屏、传感器等,受 FT232H 芯片特性限制,SPI Mode 仅支持 Mode 0 和 Mode 2,也就是 CPHA 必须是 0,第一个时钟边沿进行数据采样。
感兴趣的欢迎微 【老吴胡编】,持续更新中
更多推荐



所有评论(0)