繁体   English   中英

Raspberry Pi spidev.h SPI通信

[英]Raspberry Pi spidev.h SPI Communication

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

数据传输有了一个方案。

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

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

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];
} 

第一个问题:我认为在新传输时先取消选择片选已经为时已晚。 所以我的第一个问题是:有没有其他方法可以控制片选信号,也许我可以使用另一个库?

第二个问题:我想不写就从spi读取内容,我怎么能意识到这一点呢(用一个简单的read(fd ...)?!)

我希望你们能支持我:)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM