2013-04-09 14 views
6

'u kullanarak aynı anda yazmayın/okumaya çalışmayın. Bu sorun yazılımla ilişkili olandan daha fazla donanım olsa bile bazı yardımlar bulmayı umuyorum (göreceğiz). Freescales P1021 işlemcisine (ppc, e500v2 çekirdeği) dayalı özel bir kart üzerinde çalışıyorum. Harici bir PCB bağlanır ve SPI tarafından yapılandırılabilir. Bu harici PCB'nin özellikleri, tam dupleks modda 2 baytlık bir komut beklediğinden ve yalnızca son bayt MISO'ya veri aktarmak için kullanıldığından okur.Spidev, ioctl

Bunu bildiğim için, bu cihazı test etmek için bazı yazılım parçaları hazırlamaya çalışıyorum. Bu yüzden iyi bilinen spi_test programına başladım.

[email protected]:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 
[email protected]:~# 

Pic1

sinyal 608 saatleri gösterir ve ilk yarıda sadece veri yoktur görünüyor. Araştırmayı ve geridöngü ile test etmeye karar verdim - MOSI-MISO kısaltması verileri rx tamponuna geri çevirir. Sonuçlar:

[email protected]:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

FF FF FF FF FF FF 
40 00 00 00 00 95 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
DE AD BE EF BA AD 
F0 0D 
[email protected]:~# 

Pic2

Bu sinyaller, tüm telgraf herhangi bir nedenle tekrarlanır ki (neden bilmiyorum) oranlarına. Ancak, program alınan verileri konsolda doğru şekilde gösterir, bu yüzden beklenen spi_test olabilir.

#ifdef ORIG 
    uint8_t tx[] = { 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 
     0xF0, 0x0D, 
    }; 
#else 
    uint8_t tx[] = { 
     0xAA, 0x81, 
    }; 
#endif 

Ama beklemiyorduk gibi 32bit kaydırılır:

Ben 2 bayt aşağı bu programda gönderilecektir desen işlemek Daha bunun gibi (I nişan istenen komut biçimini taklit etmek) SPI veriyoluna - yerine 16 - İlk iki bayt MOSI sırasında tx [] ve diğer 2 bayttan her iki byte sağlar düşük/0.

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic3

Ve hiçbir veri Miso için Mosi geri döngü bile alınır (konsol çıkışı hala aynı alıcı "00 00" dır): Burada konsol çıkış sonuçları ve sinyallerdir

Pic4

tüm parametrelerle biraz etrafına oynamak ve yarım dubleks kullanmak test programı değiştirmeye karar (iletmek için) modu:

#ifdef ORIG 
    uint8_t tx[] = { 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 
     0xF0, 0x0D, 
    }; 
#else 
    uint8_t tx[] = { 
     0xAA, 0x81, 
    }; 
#endif 
    uint8_t rx[ARRAY_SIZE(tx)] = {0, }; 
    struct spi_ioc_transfer tr = { 
     .tx_buf = (unsigned long)tx, 
#ifdef ORIG  
     .rx_buf = (unsigned long)rx, 
#else 
     .rx_buf = 0, 
#endif 

Bu şekilde derlendiği ve yürütüldüğü gibi beklenen bir şeydir. SPI_CLK, 16 bit için 16 kez döngü yapar ve MOSI, verileri beklendiği gibi sağlar. Cosole çıktı hiçbir veri alınan gösterir ve sinyalleri beklenen gibidir:

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic5

Pic6

Aslında yerine 2 byte tam dubleks transferi yapmanın ben takiben N bayt verici yapmak geliyor bana N bayt tarafından alınır.

  1. Neden 0xAA, 0x81 ve 0x00, 0x00 iletilir:

    Aslında iki soru vardır?

  2. Neden (geridöngü kullanarak) orijinal kod, verileri rx tamponlarına geri alabilir, ancak 2 bayta indirilirse veri alınmaz?
+0

Mesaj başka görüntüler ve cevap onlara bağlantılar eklemek - bir yüksek temsilcisi kullanıcı o zaman bugün kontrol eder, onlara –

+0

içerecek şekilde cevap düzenleyebilir spidev SPI_MASTER_HALF_DUPLEX bayrağıyla derlendiği takdirde Spi cihazı yarım çift yönlü zorlar. – stede

+0

SPI_MASTER_HALF_DUPLEX ayarlanmamış. – stede

cevap

1

Eh, post ezici sessiz. Sadece birkaç parça okudum ve son zamanlarda Linux'ta SPI ile bağlantı kurdum. Ancak, https://www.kernel.org/doc/Documentation/spi/spidev 'da belirtildiği gibi, async read/write kullanıcı alanında mevcut değildir. AFAIK read/write, fcntl'nin etrafındaki sarıcıdır. Bu nedenle, async I/O'yu elde etmek için kendi çekirdek modülünüzü yazmanız gerekir.

+0

Bu cevap yanlış görünüyor. Https://www.kernel.org/doc/Documentation/spi/spidev makalesinde özellikle "ioctl() isteklerinin kullanılması, tam çift yönlü aktarımlar ... var" yazıyor. " Ve spi testi (ör. Https://github.com/KnCMiner/spi-test/blob/master/spi-test.c#L97) bu ioctl() öğesini kullanır. –

0

Bu çok eski bir iplik olduğunu biliyorum ama RT5350 çalışan OpenWRT üzerinde spidev kullanıyorum. Seninle tam olarak aynı sonuçları alıyorum; Sadece tam bir dubleks transfer gerçekleşemiyorum. RT5350 veri sayfasını okumak, donanımın sadece yarım çift yönlü SPI transferleri yapabileceğini gösteriyor. Her aktarım bir yazım (MOSI üzerindeki çıkış baytı, hiçbir şey okuma) veya bir okumadır (MOSI üzerinde çıkış sıfırları, MISO oku).

P1021 çipinizin veri sayfasını alamıyorum, ancak sonuçlarımızın benzerliğini göz önünde bulundurarak donanım SPI'sinin benzer şekilde uygulandığını söyleyebilirim.

Bu çekirdek modülü cevap (ioctl SPI_IOC_MESSAGE sonunda spi_async çağırır() zaten) olmadığı anlamına gelir. Tam çift yönlü SPI yapmanın tek yolu GPIO'ları yazılımda kullanmaktır.

RT5350 referansı: http://forum.vocore.io/viewtopic.php?f=3&t=72#p233

İlgili konular