如何正确调试无效的SPI读取?

时间:2018-01-31 14:08:33

标签: c linux spi

我已经打了一会儿反对这个,我真的很感激一些意见。我有两个基于Arietta G25(基于AT91SAMA5x)的完全相似的硬件。在SPI0上CS0是一个设备,我有一个示例程序,它使用spidev内核驱动程序。

两个单位中的一个正在运行一个库存debian映像,内核版本4.9.60。另一个是使用busybox运行一个vanilla linux内核(完全相同的版本)。两者都使用相同的工具链进行编译。

在设备A(debian)上,程序设法读取SPI。在器件B上,程序始终从SPI器件读取0。

尝试以下方法:

  • 交换内核不会改变结果。
  • 相同的设备树不会改变结果
  • 相同的引导加载程序不会改变结果
  • 完全交换文件系统只会更改哪个网关失败

我之前从未见过这样的事情,并且完全陷入了可能造成这种情况的僵局。我正处于开始认为debian在内核之外做某种魔术以使spidev表现不同的地步,但我无法看到它并且真的很欣赏一些关于什么的输入到底是怎么回事。

代码(来自第三方,简化)如下:

void spi_read(void *spi_target, uint8_t address, uint8_t *data) {
    int spi_device;
    uint8_t out_buf[3];
    uint8_t command_size;
    uint8_t in_buf[ARRAY_SIZE(out_buf)];
    struct spi_ioc_transfer k;

    spi_device = *(int *)spi_target;
    out_buf[0] = READ_ACCESS | (address & 0x7F);
    out_buf[1] = 0x00;
    command_size = 2;
    memset(&k, 0, sizeof(k)); /* clear k */
    k.tx_buf = (unsigned long) out_buf;
    k.rx_buf = (unsigned long) in_buf;
    k.len = command_size;
    k.cs_change = 0;
    a = ioctl(spi_device, SPI_IOC_MESSAGE(1), &k);
    *data = in_buf[command_size - 1];
 }

SPI设置完全相同:

spidev spi32766.0: setup: bpw 8 mode 0x0 -> csr0 00000002
spidev spi32766.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
spidev spi32766.0: spi mode 0
spidev spi32766.0: setup: bpw 8 mode 0x0 -> csr0 00000002
spidev spi32766.0: setup mode 0, 8 bits/w, 8000000 Hz max --> 0
spidev spi32766.0: setup: bpw 8 mode 0x0 -> csr0 00000002
spidev spi32766.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
spidev spi32766.0: msb first
spidev spi32766.0: setup: bpw 8 mode 0x0 -> csr0 00000002
spidev spi32766.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
spidev spi32766.0: 0 bits per word

在工作箱上输出样本读数(使用完整调试):

[ 3857.890625] spidev spi32766.0: activate 8, mr 000e0031
[ 3857.890625] atmel_spi f0004000.spi:   start pio xfer c7226e00: len 2 tx c736d000 rx c739c000 bitpw 8
[ 3857.890625] atmel_spi f0004000.spi:   start pio xfer c7226e00: len 2 tx c736d000 rx c739c000 bitpw 8
[ 3857.890625] spidev spi32766.0:   xfer c7226e00: len 2 tx c736d000/0x00000000 rx c739c000/0x00000000
[ 3857.890625] spidev spi32766.0: DEactivate 8, mr 000f0031

在破碎的盒子上:

spidev spi32766.0: activate 8, mr 000e0031
atmel_spi f0004000.spi:   start pio xfer c7be7600: len 3 tx c7101000 rx c7141000 bitpw 8
atmel_spi f0004000.spi:   start pio xfer c7be7600: len 3 tx c7101000 rx c7141000 bitpw 8
atmel_spi f0004000.spi:   start pio xfer c7be7600: len 3 tx c7101000 rx c7141000 bitpw 8
spidev spi32766.0:   xfer c7be7600: len 3 tx c7101000/0x00000000 rx c7141000/0x00000000
spidev spi32766.0: DEactivate 8, mr 000f0031

谢谢!

0 个答案:

没有答案