Raspberry Pi spidev.h SPI通信

时间:2013-12-19 18:08:11

标签: c communication raspberry-pi spi

我尝试建立从RPi(Master)到EtherCAT设备(Slave)的spi通信。

数据传输得到了一个方案。

我必须传输2个字节的地址寄存器和随后的字节传输数据,直到芯片选择终止通信。

这是我创造的尝试。使用cs_change,我可以告诉我的spi通信在下一次传输开始之前取消选择Chip Select。

char transfer(UINT8 data, char last)
{
char last_transfer = last;
int ret;
uint8_t tx[] = { data };
uint8_t rx[ARRAY_SIZE(tx)] = { };

struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = (unsigned long)rx,
        .len = ARRAY_SIZE(tx),
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
        .cs_change = 0,
    };

if (last_transfer)
    tr.cs_change = 1;

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
    printf("can't send spi message");

return rx[tr.len-1];
} 

第一个问题: 我认为在新的转让中首先取消选择Chip Select为时已晚。 所以我的第一个问题:是否有另一种方法来控制我的芯片选择信号,也许还有另一种我可以使用的库?!

第二个问题: 我想从spi读取而不写它,我怎么能意识到(用一个简单的读取(fd ...)?!)

我希望你们能支持我:)。

2 个答案:

答案 0 :(得分:0)

现在这是你指的spidev_test.c应用程序。实现似乎有效,因为在您上次传输后将取消选择从属SPI设备。它一直保持选中状态,直到最后一次传输消息。 每个SPI设备在未处于活动状态时都会被取消选择,允许其他驱动程序与其他设备通信,因为您的SPI总线可能与其他从设备共享。 而且你要去全双工。 标准的read()操作显然只是半双工。 因此,每当您的SPI从设备想要将数据发送到SPI控制器(主设备)时,它必须具有一些中断机制,以便您的驱动程序/应用程序可以将SPI控制器设置为“SPI_IOC_RD_MODE”并且可以使“SPI_IOC_MESSAGE”仅提供rx_buf OR你可以只进行简单的read()操作,因为在将SPI控制器设置为读模式后传输将是half_duplex。 -Sumeet

答案 1 :(得分:0)

您可以使用SPI_NO_CS模式并使用wiringPi库将CS引脚切换为GPIO ...(来自http://wiringpi.com/