我希望找到一些帮助,即使此问题可能比软件相关的硬件更多(我们将会看到)。我正在开发基于Freescales P1021处理器(ppc,e500v2核心)的定制板。外部PCB将被连接并可通过SPI进行配置。这个外部PCB的规格读取,因为它期望在全双工模式下的2字节命令,并且只有最后一个字节用于在MISO上传回数据。Spidev不会使用ioctl同时写入/读取
了解到这一点,我目前正在准备一些软件来测试此设备。所以我从众所周知的spi_test计划开始。
[email protected]:~# ./spi_test -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00
[email protected]:~#
的信号示出了608个时钟,它似乎有仅在第一半数据。我决定用loopback进行调查和测试 - 将MOSI-MISO循环切回数据到rx缓冲区。结果:
[email protected]:~# ./spi_test -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
[email protected]:~#
这个信号显示,整个电报重复任何原因(我不知道为什么)。但是,程序正确显示了控制台中接收到的数据,因此可能是spi_test预期的。
另外我操纵,这将在该程序被向下发送到2个字节的模式(模拟请求的命令格式I瞄准)所示:
#ifdef ORIG
uint8_t tx[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
0xF0, 0x0D,
};
#else
uint8_t tx[] = {
0xAA, 0x81,
};
#endif
但作为没想到32位被移位输出到SPI总线 - 而不是16个。在前两个字节中,MOSI提供来自tx []的两个字节,而另外两个字节则为低/ 0。下面是控制台输出的结果和信号:
[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
00 00
[email protected]:~#
即使我回环MOSI到MISO没有数据被接收(控制台输出仍是相同的接收“00 00”):
(仅发送)我周围的所有参数有点玩,并决定改变测试程序使用半双工模式:
#ifdef ORIG
uint8_t tx[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
0xF0, 0x0D,
};
#else
uint8_t tx[] = {
0xAA, 0x81,
};
#endif
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
#ifdef ORIG
.rx_buf = (unsigned long)rx,
#else
.rx_buf = 0,
#endif
因为这是编译和执行的东西是像预期的那样。 SPI_CLK为16位循环16次,MOSI按预期提供数据。 Cosole输出没有显示出接收到的数据和信号都像预期:
[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
00 00
[email protected]:~#
其实在我看来,与其做2个字节的全双工传输我做了N字节,发送随后由一个N字节接收。
其实有两个问题:
- 为什么和0xAA,0x81表示和0×00,0×00传输?
- 为什么(使用回送)原始代码能够将数据返回到rx缓冲区,但是如果减少到2个字节,则不会接收到数据?
邮政别处的图像和链接添加到他们的答案 - 那么高代表用户可以编辑您的答案,包括他们 – 2013-04-09 16:51:42
我会检查今天,如果spidev与SPI_MASTER_HALF_DUPLEX标志编译启用,强制spi设备半双工。 – stede 2013-04-11 05:47:09
SPI_MASTER_HALF_DUPLEX未设置。 – stede 2013-04-11 14:47:31