[英]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.