C 树莓皮spidev.h SPI通信
我尝试建立从RPi主设备到EtherCAT设备从设备的spi通信 数据传输得到了一个方案 我必须传输2个字节的地址寄存器和以下字节传输数据,直到芯片选择终止通信 这是我创造的尝试。有了cs_更改,我可以告诉我的spi通信在下一次传输开始之前取消选择芯片选择C 树莓皮spidev.h SPI通信,c,communication,raspberry-pi,spi,C,Communication,Raspberry Pi,Spi,我尝试建立从RPi主设备到EtherCAT设备从设备的spi通信 数据传输得到了一个方案 我必须传输2个字节的地址寄存器和以下字节传输数据,直到芯片选择终止通信 这是我创造的尝试。有了cs_更改,我可以告诉我的spi通信在下一次传输开始之前取消选择芯片选择 char transfer(UINT8 data, char last) { char last_transfer = last; int ret; uint8_t tx[] = { data }; uint8_t rx[ARRAY_SIZE
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 first为时已晚。
所以我的第一个问题是:有没有其他方法来控制我的芯片选择信号,也许我可以使用另一个库
第二个问题:
我想读spi而不写在上面,我怎么能用一个简单的readfd实现这一点
我希望你们能支持我:现在,这就是你们所指的spidev_test.c应用程序。该实现似乎可以工作,因为在上次传输后,将取消选择从属SPI设备。它将一直保持选中状态,直到消息中的最后一次传输之后。 当每个SPI设备未处于活动使用状态时,会取消选择该设备,从而允许其他驱动程序与其他设备对话,因为您的SPI总线可能在其他从属SPI设备之间共享。 此外,您将使用全双工。 标准的读取操作显然只是半双工的。
因此,每当您的SPI从设备想要向SPI controllerMaster发送数据时,然后它必须有一些中断机制,以便您的驱动程序/应用程序可以将SPI控制器设置为SPI_IOC_RD_模式,并可以使SPI_IOC_消息仅提供rx_buf,或者您可以只进行简单的读取操作,因为在将SPI控制器设置为读取模式后,传输将是半双工的-Sumeet您可以使用SPI\u NO\u CS模式,并使用wiringPi库将CS引脚切换为GPIO。。。从