2013-12-19 179 views
0

我嘗試建立從RPi(主站)到EtherCAT設備(從站)的spi通信。Raspberry Pi spidev.h 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沒寫寫讀,我怎麼能認識到(用一個簡單的讀取(FD)?!)

我希望你們能支持我: )

回答

0

現在這是您所指的spidev_test.c應用程序。實施似乎工作,因爲從屬SPI設備將在您上次傳輸後取消選擇。它保持選擇狀態,直到消息中的最後一次傳輸完成。 每個SPI器件在未處於活動狀態時都會被取消選擇,允許其他驅動器與其他器件通信,因爲您的SPI總線可能與其他從器件SPI器件共享。 此外,你正在尋求全雙工。標準讀取()操作顯然只是半雙工。 因此,只要您的SPI從設備想要將數據發送到SPI控制器(主設備),它就必須具有一些中斷機制,以便您的驅動程序/應用程序可以將SPI控制器設置爲「SPI_IOC_RD_MODE」,並使「SPI_IOC_MESSAGE」只提供rx_buf或者您可以只進行簡單的讀取()操作,因爲在將SPI控制器設置爲讀取模式後,傳輸將爲half_duplex。 -Sumeet

0

可以作爲GPIO使用wiringPi庫...(從http://wiringpi.com/

使用SPI_NO_CS模式,以及切換CS引腳