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.