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