首页 文章

Raspberry Pi spidev.h SPI通信

提问于
浏览
0

我尝试 Build 从RPi(主站)到EtherCAT设备(从站)的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

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

  • 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

相关问题