Alamat budak I2C tidak diakui (kadang-kadang)

11

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): masukkan deskripsi gambar di sini

Alamat FRAM I2C tidak diakui (alamat budak dikirim dengan benar): masukkan deskripsi gambar di sini

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:

Skema 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.

  1. Level I2C shifter dimasukkan ke dalam mode tiga keadaan sebelum kartu yang menyematkan FRAM dimasukkan. Sinyal FRAM_SDA dan FRAM_SCL ditarik rendah.
  2. 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).
  3. Level I2C shifter diaktifkan.
  4. 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.
  5. 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.

Johnny
sumber
Bisakah Anda memposting skema? Coba frekuensi bus yang lebih lambat untuk melihat apakah itu membuat perbedaan.
Suirnder
Apakah masalah terjadi hanya setelah memasukkan dan tidak di waktu lain? Seberapa cepat "sesaat setelah"?
Kaz
Selain eksperimen lainnya, Anda bisa mencoba menghapus budak lain dan melihat apakah itu mempengaruhi perilaku.
Ben Gartner
Apakah kedua pin alamat ditarik dengan benar rendah, atau dibiarkan mengambang?
fm_andreas
@ Suirnder Saya telah memposting skema dalam jawaban saya.
johsey

Jawaban:

6

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!

Buzby
sumber
Bukan ide yang buruk untuk menambahkan "algoritma pemulihan bus" ini sebelum menginisialisasi master. Saya akan menerapkannya. Terima kasih.
johsey
2

Untuk FRAM:

  • pertama-tama hubungkan GND dan Vcc;
  • kemudian pastikan A1, A2 dan WP memiliki level yang benar;
  • hanya kemudian hubungkan pin data.

Menghubungkan pin selain catu daya sebelum chip dinyalakan dapat menyebabkan masalah.

jippie
sumber
2

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?

Scott Seidman
sumber
Saya mengurangi resistor pull-up menjadi 3.3k dan itu tidak membantu. Saya tidak tahu tentang drifting ini.
johsey
Itu terlihat kecil di layar, tetapi sekitar 250 mV, saya pikir. Anda mungkin mengalami masalah catu daya di sisi 3.3V
Scott Seidman
Anda benar, arus sekitar 300mV di kedua sisi level I2C. Catu daya + 3.3V tampaknya berfungsi dengan baik (tidak ada penyimpangan dalam outputnya ketika penyimpangan pada sinyal SCL terjadi). Mungkinkah itu terkait dengan shifter level I2C?
johsey
Tidak yakin sama sekali. Dari mana 3.3V berasal? Pengalih konverter? Bagaimanapun, itu mencurigakan. Apakah Anda menggambar MINIMUM saat ini yang diperlukan oleh perangkat yang menyediakan 3.3V per lembar data? Jika tidak, muat suplai Anda dengan resistor. Apa yang terjadi jika Anda menunggu satu atau dua detik sebelum memulai komunikasi?
Scott Seidman
3.3V berasal dari SMPS (LM3103MH dari TI). Saya bukan ahli pasokan listrik, tetapi seperti yang saya pahami, dengan perangkat ini, tidak ada arus minimum yang diperlukan karena dapat beroperasi dalam mode konduksi terputus dengan beban ringan. Masalah yang sama terjadi jika saya menunggu dua detik sebelum memulai komunikasi.
johsey
2

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.

Gbarry
sumber
Hanya ada satu master di bus I2C dan papan yang menanamkan FRAM hanya terhubung ke bus ini. Jadi, saya pikir tidak mungkin ada hal lain yang mencoba berbicara dengannya. Ya, saya meletakkan breakpoint sebelum urutan berhenti. Saya akan mencoba mengganti awal yang berulang ini dengan berhenti / mulai seperti yang Anda sarankan dan akan mengujinya lagi. Menurut datasheet-nya, FRAM harus mendukung start berulang. Apakah Anda berpikir bahwa jika saya mengisolasi FRAM (misalnya, pada bus I2C khusus) ini pada akhirnya bisa menyelesaikan masalah ini?
johsey
Dewan FRAM hanya menanamkan FRAM. Ini adalah papan "ISA like". Sulit untuk mengukur sinyal secara langsung pada pin FRAM karena kartu ini tertanam dalam plastik. Bagaimanapun, saya akan mencoba menemukan cara untuk mengukur sinyal-sinyal ini sedekat mungkin dengan FRAM.
johsey
Mendapatkan ke sisi FRAM dari U13 akan menjadi langkah besar.
gbarry
2

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.

Kaz
sumber
0

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?

Ben Gartner
sumber
Perangkat saya ada di "Mode Standar" (frekuensi SCL 100kHz). Memang, frekuensi ini ada di perbatasan mode ini. Saya akan mencoba menguranginya dengan faktor dua dan melakukan beberapa tes.
johsey
0

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.

gman
sumber
3
Apakah Anda mengetik ini di ponsel lama hanya dengan antarmuka sembilan tombol?
angelatlarge
FRAM yang digunakan adalah FM24C04B . Di mana Anda mendapatkan informasi ini mengenai kepekaan daya dari memori ini? Bisakah Anda memberi saya lebih banyak input? Tidak ada decoupling pada pin 8. Desain modul ini telah dilakukan beberapa tahun yang lalu dan kami harus mengkonsumsi seluruh produksi. Menurut pengukuran yang dilakukan dengan osiloskop, tampaknya tidak ada kesalahan pada jalur SCL ketika modul FRAM terhubung dan level-shifter diaktifkan.
johsey
1
Saya menyadari respons ini sangat terlambat, tetapi info saya mengenai sensitivitas Vcc berasal dari dukungan aplikasi untuk Ramtron, tahun lalu. Saya tidak ingat detail pastinya, tetapi di bawah laju dan suhu ramp tertentu, chip pada dasarnya terkunci dan tidak memungkinkan komunikasi I2C sampai Anda menyalakannya dengan ramp 'baik'. Tidak memiliki tutup decoupling yang dekat dengan chip tidak baik. Anda mungkin menemukan bahwa menggunakan decoupling 0.1uF vs 10uF mengubah jalan Vcc di mana satu bekerja dan yang lainnya tidak. @angelatlarge, ya maaf saya mengetik jawaban pertama saya dari telepon.
gman