V-USB, bir ATmega328p'nin yerleşik SPI'sını nasıl vidalayabilir?


14

ATmega328p kullanarak Klavye olarak görünen bir V-USB projesi üzerinde çalışıyorum. USB kısmı harika çalışıyor (bu benim ilk V-USB projem değil), ancak V-USB yığınını ile başlattıktan sonra usbInit()SD kart kütüphanesine yapılan tüm çağrılar başarısız oluyor. Daha önce aynı işlevleri çağırırsam usbInit(), her şey mükemmel çalışır.

Diavolino adlı bir Arduino klonu kullanıyorum, ancak Arduino / kablolama çerçevesi yok. USB'yi dijital I / O 2 ve 3'e ve SD kartı 10-13'e (dahili SPI hatları) bağlıyorum.

SD kart kütüphanesine baktım ve başka herhangi bir kesinti veya kayıt kullanarak hiçbir iz bulamadım SPxx. Ayrıca grepV-USB kodunu da kullandım, ancak SPxxkayıtlara bile dokunmuyor .

Sorunun ilk işareti, SD karta erişmesi gerektiğinde cihazın bağlantısının kesilmesiydi. Daha sonra tüm SD kart kullanma döngülerini koydum usbPoll()ve wdt_reset()çağırdım ve yazı olması durumunda, kartın son iki baytı (CRC-16) gönderdikten sonra karttan onay beklediğini buldum.

Kullandığım SD kart kütüphanesi sd_rawRoland Riegel.


2
Anladığım kadarıyla V-USB çok CPU yoğunluklu ve muhtemelen SPI rutinlerine kabul edilemez gecikmeler getiriyor. Normalde, SPI işlemleri zamanlamaya duyarlı değildir, ancak SPI FLASH üzerinde yazma ve silme işlemleri kesinlikle doğrudur.
Dave Tweed

Sorun, okuma işlemlerinin bile çoğu zaman çalışmadığı ve okuduğumda, veri ve kontrol kayıtları çalışan kod tarafından ayarlanır ayarlanmaz SPI iletişimleri bağımsız olarak yapılır.
dnet

@DaveTweed - kartı beklemek zorunda kalma açısından zamana duyarlı evet, ancak kartı programınız için bekletememek açısından ??
Chris Stratton

2
Muhtemelen gerçekleşemeyecek ya da tespit edilemeyen bir şey bekliyorsunuz; örneğin, G / Ç pini yeniden yapılandırılmış olabilir ve artık bir girdi olmayabilir veya karta istenmeyen veriler / kartlar istenmeyen bir duruma getirilmiş olabilir. Ayrıca, SD kitaplığının gerekli gecikmeleri gerçekleştirdiği mekanizmanın bozulmadığından veya hızlandırılmadığından emin olun.
Chris Stratton

3
Gürültü veya güç kaynağı sorunları da yaşıyor olabilirsiniz. Raylarınızı bir kapsamla kontrol edin ve neler olduğunu görmek için SD hatlarını bir mantık analizörü ile kontrol edin.
Jim Paris

Yanıtlar:


1

USART ile böyle bir sorun yaşadım ve saat köpeği ayarlarını değiştirerek çözdüm. Bildiğiniz gibi V-USB bir saat köpeği kullanıyor ve bir işlemde fazladan zaman koyarsanız, saat köpeği etkinleştirilir. İzleme köpeğini devre dışı bırakmayı deneyin ve her şeyin yolunda gittiğini görürseniz, izleme köpeği süresini değiştirebilir veya müdahale eden kodu (sizin durumunuzdaki SD kart kodları) daha küçük parçalara bölebilir ve izleme köpeğini aralarında "Sıfırlayabilirsiniz". Ancak hata ayıklamadan sonra saat köpeğinizi yeniden etkinleştirmeyi unutmayın, çünkü bu olmadan V-USB kullanılması önerilmez.


Sorunun SD koduna wdt_reset () çağrıları eklendiğinden bahsettiğine dikkat edin; tabii ki bunun her yerde yapılmaması mümkündür.
Chris Stratton

1
Evet ama saat köpeğini devre dışı bırakarak kodu denemeye değer. Bazen özellikle geri dönen veriler bir kesme rutininde işlendiğinde, kod orada sıkışır ve izleme köpeği sıfırlanmadan önce etkinleştirilir
Ağustos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.