Bagaimana V-USB mengacaukan SPI built-in dari ATmega328p?

14

Saya sedang mengerjakan proyek V-USB yang muncul sebagai Keyboard menggunakan ATmega328p. Bagian USB berfungsi dengan baik (ini bukan proyek V-USB pertama saya), tetapi setelah saya memulai tumpukan V-USB usbInit(), semua panggilan ke perpustakaan kartu SD gagal. Jika saya memanggil fungsi yang sama sebelumnya usbInit(), semuanya berfungsi dengan baik.

Saya menggunakan klon Arduino yang disebut Diavolino, tetapi tanpa kerangka kerja Arduino / kabel. Saya memiliki USB yang terhubung ke I / O 2 dan 3 digital, dan kartu SD ke 10-13 (jalur SPI bawaan).

Saya melihat-lihat perpustakaan kartu SD dan tidak menemukan tanda-tanda menggunakan interupsi atau register selain SPxx. Saya juga sudah grepmemikirkan kode V-USB, tetapi bahkan tidak menyentuh SPxxregister.

Tanda pertama dari masalah adalah ketika perangkat terputus ketika seharusnya mengakses kartu SD. Kemudian saya meletakkan usbPoll()dan wdt_reset()memanggil semua loop penanganan kartu SD, dan menemukan bahwa dalam kasus penulisan, kartu menunggu selamanya untuk pengakuan dari kartu setelah mengirim dua byte terakhir (CRC-16).

Perpustakaan kartu SD yang saya gunakan adalah sd_rawoleh Roland Riegel.

Dnet
sumber
2
Ini adalah pemahaman saya bahwa V-USB sangat intensif CPU, dan mungkin memperkenalkan penundaan yang tidak dapat diterima ke dalam rutinitas SPI. Biasanya, operasi SPI tidak sensitif terhadap waktu, tetapi operasi menulis dan menghapus pada SPI FLASH pasti.
Dave Tweed
Masalahnya adalah bahwa bahkan operasi baca tidak bekerja sebagian besar waktu, dan seperti yang saya baca, komunikasi SPI dilakukan secara independen segera setelah data dan register kontrol ditetapkan oleh kode yang sedang berjalan.
dnet
@DaveTweed - waktu sensitif dalam hal harus menunggu kartu ya, tetapi dalam hal tidak dapat menjaga kartu menunggu program Anda ??
Chris Stratton
2
Kemungkinan Anda sedang menunggu sesuatu yang tidak dapat terjadi atau tidak dapat dideteksi; misalnya, pin I / O mungkin telah dikonfigurasi ulang dan tidak lagi menjadi input, atau data / jam palsu dapat dikirim ke kartu, membuatnya dalam keadaan yang tidak diinginkan. Pastikan juga bahwa mekanisme di mana perpustakaan SD mencapai penundaan yang diperlukan belum rusak atau dipercepat.
Chris Stratton
3
Anda mungkin mengalami masalah kebisingan atau catu daya. Periksa rel Anda dengan cakupan dan periksa garis SD dengan penganalisa logika untuk melihat apa yang terjadi.
Jim Paris

Jawaban:

1

Saya punya masalah seperti itu dengan USART dan menyelesaikannya dengan mengubah pengaturan anjing penjaga. Seperti yang Anda ketahui V-USB menggunakan anjing penjaga dan jika Anda memberikan waktu ekstra dalam satu operasi, anjing penjaga akan diaktifkan. Coba nonaktifkan anjing jaga dan jika Anda melihat semuanya berjalan dengan baik, Anda dapat mengubah waktu anjing jaga atau Anda dapat membagi kode yang mengganggu (kode kartu SD dalam kasus Anda) menjadi bagian-bagian yang lebih kecil dan "Mengatur ulang" anjing jaga di antara mereka. Tapi jangan lupa untuk mengaktifkan kembali anjing penjaga Anda setelah debug karena tidak disarankan untuk menggunakan V-USB tanpa itu.

Agustus
sumber
Perhatikan bahwa pertanyaan tersebut menyebutkan panggilan wdt_reset () dimasukkan ke dalam kode SD; walaupun tentu saja itu mungkin tidak dilakukan di mana-mana.
Chris Stratton
1
Ya tetapi sangat layak untuk mencoba kode dengan menonaktifkan anjing penjaga. Kadang-kadang terutama ketika data yang kembali diproses dalam rutinitas interupsi, kode macet di sana dan anjing penjaga diaktifkan sebelum direset
Ags