c - 树莓派 spidev.h SPI 通信

标签 c communication raspberry-pi spi

我尝试建立从 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 Controller (主设备)发送数据时,它必须具有某种中断机制,以便您的驱动程序/应用程序可以将 SPI Controller 设置为“SPI_IOC_RD_MODE”,并且可以使“SPI_IOC_MESSAGE”仅提供 rx_buf 或您只能进行简单的 read() 操作,因为在将 SPI Controller 设置为读取模式后,传输将为 half_duplex。 -苏米特

关于c - 树莓派 spidev.h SPI 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20688711/

相关文章:

c++ - 为什么 malloc 总是返回 NULL

c - 递归选择排序在 C 中输出不正确的值

sql - 两个数据库之间的通信

hardware - cpu如何与外设通信?

c++ - 如何在 C/C++ 中进行更多预处理

c - 如何在C中对数组元素进行分类

Android 应用程序 - 与 PC 应用程序通信

linux - Uinput 和树莓派

c# - Raspberry Pi+MonoDevelop如何从串口读取数据?

c - GPU_FFT : in unmpamem: control reaches end of non-void function