Saya mencoba untuk berkomunikasi dengan FRAM yang terhubung dari jarak jauh (FM24C04 dari Ramtron) dengan menggunakan I2C. Memori ini tertanam pada papan yang dapat dimasukkan dan dihapus kapan saja ke / dari sistem (komunikasi dihentikan dengan benar sebelum memori dihapus).
Masalahnya adalah: tepat setelah memasukkan kartu yang berisi FRAM, kadang-kadang , ia tidak mengetahui alamatnya.
Pengukuran sinyal
Saya mengukur sinyal untuk melihat apa yang terjadi dan tampaknya timingnya OK dalam kedua kasus (bekerja dan tidak bekerja).
Komunikasi I2C yang benar (pembacaan 3 byte):
Alamat FRAM I2C tidak diakui (alamat budak dikirim dengan benar):
Tindakan sudah dilakukan untuk menyelesaikan masalah ini (tanpa hasil)
- Penundaan ditambahkan setelah kartu dengan FRAM yang disematkan dimasukkan untuk memastikan bahwa urutan daya dihormati.
- I2C menghentikan pembuatan setelah pendeteksian alamat slave bukan pengakuan
Konfigurasi bus I2C
- Satu master (mikrokontroler STM32F205 dari ST)
- Tiga budak (EEPROM 24AA1025 dari Microchip, RTC DS1339C dari Maxim IC dan FRAM jarak jauh FM24C04 dari Ramtron
- Satu level I2C shifter (MAX3373E dari Maxim IC) digunakan untuk memungkinkan komunikasi antara master dan FRAM
- Frekuensi bus diatur ke 100 kHz
Diedit (2013-04-17)
Pertama, terima kasih atas komentar Anda.
Karena ada banyak saran, berikut adalah deskripsi investigasi yang telah saya lakukan.
Skema
Gambar berikut ini menunjukkan skema sederhana dari bus I2C:
Sinyal I2C_SDA dan I2C_SCL terhubung langsung ke mikrokontroler dan sinyal FRAM_SDA dan FRAM_SCL terhubung ke FRAM. Perhatikan bahwa sinyal SDA dan SCL yang terhubung ke FRAM difilter dengan menggunakan ferrites BLM18 dari Murata.
FRAM terhubung sebagai berikut:
- NC (pin 1) -> tidak terhubung
- A1 (pin 2) -> GND
- A2 (pin 3) -> GND
- VSS (pin 4) -> GND
- SDA (pin 5) -> FRAM_SDA
- SCL (pin 6) -> FRAM_SCL
- WP (pin 7) -> GND (tidak dilindungi penulisan)
- VDD (pin 8) -> + 5V
Deskripsi kartu FRAM
Kartu ini adalah kartu "ISA like" yang hanya menyematkan FRAM.
Investigasi
Memperlambat frekuensinya
Saya menjalankan tes dengan frekuensi SCL diatur ke 50kHz dan 10kHz. Saya mengukur sinyal SCL dengan osiloskop untuk memastikannya pada frekuensi yang diharapkan.
Modifikasi ini tidak menyelesaikan masalah. Saya memeriksa timing dan mereka berada dalam spesifikasi lembar data FRAM.
Memastikan urutan daya
@ jippie.
- Level I2C shifter dimasukkan ke dalam mode tiga keadaan sebelum kartu yang menyematkan FRAM dimasukkan. Sinyal FRAM_SDA dan FRAM_SCL ditarik rendah.
- Setelah "kartu FRAM" dimasukkan, penundaan 100 ms ditambahkan untuk memastikan bahwa catu daya stabil (setidaknya diperlukan 11 ms sebelum kondisi mulai pertama menurut lembar data).
- Level I2C shifter diaktifkan.
- Penundaan 1ms ditambahkan untuk memastikan bahwa level shifter I2C diaktifkan dan bahwa garis ditarik ke atas (~ 4us diperlukan oleh datasheet). Sinyal FRAM_SDA dan FRAM_SCL ditarik.
- FRAM diakses.
Sinyal FRAM_SDA dan FRAM_SCL telah diukur setelah setiap langkah.
Masalahnya masih terjadi.
Kondisi berhenti / mulai alih-alih mulai berulang
@barry.
Saya mencoba untuk menghentikan sebelum mulai berulang selama transfer byte. Saya mengukur transfer byte dengan osiloskop: kondisi STOP diikuti oleh kondisi START OK.
Sayangnya, solusi ini tidak menyelesaikan masalah.
Pikiran
Masalah ini terjadi hanya setelah kartu yang menyematkan FRAM terhubung. Saya menjalankan beberapa ribu akses baca yang berhasil (slave addressing and reading) setelah "kartu FRAM" dimasukkan dan ditangani dengan benar.
Bagi saya, ini terdengar seperti masalah perangkat keras. Tapi saya tidak tahu apakah itu bisa terkait dengan level-I2C atau budak lain di bus I2C.
Apakah Anda punya ide atau saran lain?
Diedit (2013-04-18)
Masalahnya tampaknya diselesaikan
Saya mengganti konektor modul FRAM dan menemukan cara untuk melakukan pengukuran langsung pada FRAM. Tampaknya semua berfungsi baik dengan konektor baru ini.
Saya akan melakukan lebih banyak tes untuk memastikan bahwa masalahnya berasal dari hubungan yang buruk.
sumber
Jawaban:
Meskipun Anda mengatakan comms Anda dihentikan dengan benar sebelum penyisipan atau pemindahan, mungkin ada baiknya mencoba solusi ini, karena ada situasi di mana bus I2C dapat memberikan masalah setelah reset hanya satu perangkat di bus.
Sebelum menginisialisasi perangkat keras Master I2C, atur SDA sebagai input dan uji untuk SDA rendah.
Jika rendah maka setel pin SCL tinggi.
Kemudian ganti pin SCL rendah dan tinggi hingga SDA menjadi tinggi (yaitu, clock bit yang tersisa yang mungkin masih coba dikirim oleh peripheral). Ini tidak dapat berlangsung lebih dari 8 siklus clock - jika ya maka ada beberapa masalah lain.
Saya tidak dapat menjamin ini akan menyelesaikan masalah Anda, tetapi itu menyelesaikan masalah saya!
sumber
Untuk FRAM:
Menghubungkan pin selain catu daya sebelum chip dinyalakan dapat menyebabkan masalah.
sumber
10k tampaknya agak besar untuk pullup Anda, dan ujung depan Anda terlihat lambat. Kurangi resistor menjadi sekitar 3k dan lihat apakah itu membantu.
Juga, mengapa tegangan mati melayang dengan waktu?
sumber
Adakah kemungkinan ada hal lain yang mencoba berbicara dengan dewan itu? Saya pernah punya masalah seperti itu; Saya bisa mendapatkan ack 60% dari waktu, tapi saya tidak ingat pernah bisa melihat tabrakan. Saya curiga i2c yang saya berikan entah bagaimana terisolasi dari bus internal yang sebenarnya. Saya bisa menjalankannya terus menerus, dan itu hanya akan menjatuhkan 30% dari pesan. Masalahnya hilang ketika kita mulai berbicara langsung ke perangkat (catu daya) tanpa "backplane" yang mengintervensi.
Saya tidak melihat urutan berhenti setelah kesalahan NAK Anda. Saya kira Anda memiliki breakpoint yang menghentikan program pada saat itu?
Terakhir, jika Anda pikir hanya Anda yang berada di dalam bus, Anda dapat mencoba mengganti awal yang diulang dengan berhenti / mulai. Saya telah melihat perangkat (terutama FPGA khusus) yang tidak cukup tahu cara menangani RS.
[Menanggapi komentar]: Ada banyak yang tidak Anda katakan tentang papan FRAM, seperti apakah itu hanya memori atau seluruh subsistem. Tetapi jika Anda dapat menempatkan 'lingkup tepat pada arahan perangkat i2c yang memberi Anda masalah, dan Anda masih melihat apa yang digambarkan, maka saya akan mengesampingkan gangguan. I2C cukup sederhana sehingga jika Anda melihat sinyal yang tepat pada input, maka chip harus bermain dengan benar kecuali jika memiliki masalah internal.
Khususnya, Anda ingin mendapatkan sisi FRAM dari level shifter itu. Terobosan pada sinyal lebih mungkin terjadi daripada sesuatu yang terjadi yang biasanya dianggap sebagai tabrakan.
Saya akan menunjukkan bahwa siklus NAK tidak dapat dibedakan dari chip yang tidak ada di sana. EEPROM akan melakukan ini untuk menunjukkan mereka sibuk. Saya mencari waktu menulis pada FRAM dan lebih cepat daripada data i2c tunggal ... jadi itu tidak masalah.
sumber
Karena masalah, ketika bereproduksi, adalah kegagalan permanen yang hanya dihapus dengan menghapus dan memasukkan kembali perangkat, maka itu salah satu dari dua hal: perangkat sedang dalam kondisi buruk yang hanya pulih pada siklus daya, atau ada kontak yang buruk.
Jika perangkat berada dalam kondisi buruk yang pulih pada siklus daya, Anda dapat memiliki sirkuit tambahan yang memungkinkan MCU untuk mematikan perangkat. Firmware kemudian, setelah tidak mendapat pengakuan dari perangkat, dapat menjalankan prosedur pemulihan di mana ia mematikan chip untuk beberapa waktu, menyalakannya lagi, dan kemudian mencoba lagi.
Jika ini adalah kontak yang buruk, maka mungkin Anda harus melihat keandalan konektor dan menemukan sesuatu yang lebih baik. Jika Anda menggunakan konektor yang sama untuk membuat lebih banyak dari papan ini, mungkin ada masalah di lapangan. Bagaimanapun, mungkin ada prosedur manusia untuk menangani situasi. Operator yang bekerja dengan perangkat harus mengetahui potensi masalah dengan penyisipan kartu, dan harus dipasang kembali agar beroperasi dengan benar.
Perangkat utama Anda dapat memiliki cara untuk meningkatkan alarm yang menunjukkan bahwa itu tidak dapat berbicara dengan FRAM: LED "masalah" pada panel dan / atau bip atau apa pun. Atau sebaliknya: lampu yang menyala, memberikan umpan balik kepada pengguna bahwa FRAM telah diterima dan komunikasi telah terjalin. Jika FRAM jauh dari perangkat master, lampu dapat ditemukan pada modul FRAM: chip I2C lain yang menggerakkan LED.
sumber
Sifat sporadis dari masalah menunjukkan itu bisa menjadi masalah waktu.
The datasheet daftar dua set timing, satu untuk "Standard Mode" dan satu untuk "Fast Mode". Dari pengukuran Anda sepertinya Anda berada di perbatasan waktu "Mode Standar". Saya tidak tahu dari membaca sepintas datasheet bagaimana tepatnya chip dimasukkan ke dalam mode baik.
Saya tidak akan berasumsi bahwa perangkat Anda dalam Mode Cepat. Bisakah Anda mengurangi timing dengan faktor 2-4, pastikan Anda berada dalam timing mode standar untuk waktu tahan kondisi mulai, jam periode tinggi dan jam periode rendah dan lihat apakah masalah ini masih terjadi?
sumber
Apakah Anda memiliki 24c04a, b, atau c? Jika a c04a, itu adalah desain yang kuat. Bagian b memiliki sensitivitas terhadap ramp catu daya. Apa decoupling yang Anda lakukan pada pin8 ke gnd? Saya akan mengatakan sesuatu tentang level sinyal tetapi saya melihat bahwa Anda menggunakan penerjemah level. Anda mungkin ingin memeriksa bahwa Anda tidak mendapatkan kesalahan pada SCL bahwa chip akan menafsirkan sebagai jam tambahan.
sumber