我是一个相当新的 SoC,我目前正在使用评估平台 Zedboard。我在我的块设计中包含了一个四通道 SPI,并希望通过在其中一个 ARM 处理器上运行的 Linux 与它进行通信。我需要 SPI 在一次突发中传输/接收 32 位并处理来自 C++ 的通信。但是,我无法让它工作。
Quad SPI 设置为标准,无 FIFO 和事务宽度 = 32 位。我已将 Linux 设备树更新如下:
axi_quad_spi_0@41E00000 {
compatible = "xlnx,xps-spi-2.00.b", "xlnx,xps-spi-2.00.a";
#address-cells = <0x1>;
#size-cells = <0x0>;
interrupt-parent = <0x2>;
interrupts = <0x0 0x39 0x1>;
reg = <0x41e00000 0xffff>;
xlnx,fifo-exist = <0x0>;
xlnx,num-ss-bits = <0x2>;
xlnx,num-transfer-bits = <0x20>;
xlnx,sck-ratio = <0x10>;
device@0 {
compatible = "spidev";
reg = <0x0>;
spi-max-frequency = <0x5f5e10>;
};
device@1 {
compatible = "spidev";
reg = <0x1>;
spi-max-frequency = <0x5f5e10>;
};
在此之后,我可以按预期在 /dev 中看到 spidev0.0 和 spidev.0.1。此外,当使用 bits_per_word = 8 写入设备文件时,我从 quad SPI 中得到一个 8 位突发,但有 32 个时钟周期,即我得到对应于 32 位突发的 1/4 的第一个字节(通过调试探针看到在 Vivado 中)。我想我看到了这一点,因为事务宽度设置为 32 位。
但是,当我想将突发更改为 32 位 (bits_per_word = 32) 时,它不起作用 - 我在我的 Linux 终端中收到消息“xilinx_spi_setup_transfer,不支持的 bits_per_word=32”。
我在 C++ 中使用以下代码:
uint8_t tx[] = { 0xAD, 0xEF, 0x01, 0x23 };
uint8_t rx[4] = { 0 };
struct spi_ioc_transfer tr[2];
tr[0].tx_buf = (unsigned long)tx;
tr[0].rx_buf = (unsigned long)rx;
tr[0].len = 4;
tr[0].delay_usecs = delay;
tr[0].speed_hz = speed;
tr[0].bits_per_word = 32;
tr[0].cs_change = 0;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
我曾尝试编译 xilinx 驱动程序 xilinx-spi.c 但是当我尝试安装它时(在 Linux 中使用“modprobe xilinx_spi”)它说“设备或资源忙”。
如何让它支持 32 位,以便我可以一次传输/接收 32 位?有人可以帮我吗?谢谢!
兄弟。雅各布