'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]:~#
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]:~#
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]:~#
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
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]:~#
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.
- Neden 0xAA, 0x81 ve 0x00, 0x00 iletilir:
Aslında iki soru vardır?
- Neden (geridöngü kullanarak) orijinal kod, verileri rx tamponlarına geri alabilir, ancak 2 bayta indirilirse veri alınmaz?
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 –
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
SPI_MASTER_HALF_DUPLEX ayarlanmamış. – stede