我是一个非常新的SoC,我目前正在使用评估平台Zedboard。我在我的块设计中包含了一个四SPI,并希望通过在其中一个ARM处理器上运行的Linux与它进行通信。我需要SPI在一个突发中发送/接收32位,并处理来自C ++的通信。但是,我无法让它发挥作用。
四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写入器件文件时,我从四SPI中获得8位突发但有32个时钟周期,即我得到的第一个字节输出对应于32位突发的1/4(见调试探针)在Vivado)。我想我看到了这一点,因为事务宽度设置为32位。
但是,当我想将突发更改为32位(bits_per_word = 32)时,它不起作用 - 我在Linux终端中收到消息“xilinx_spi_setup_transfer,unsupported 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位?有人可以帮帮我吗?谢谢!
溴。雅各布