簡體   English   中英

Raspberry Pi spidev.h SPI通信

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM