SRAM yang mana dua chip dapat membaca / menulis

9

Saya sedang mencari perangkat SRAM kecil, 32KB atau lebih yang dapat dibaca atau ditulis oleh dua MCU (pada dua waktu yang berbeda; saya tidak perlu membaca / menulis secara bersamaan.) Akan lebih baik jika menggunakan antarmuka serial juga.

Masalah yang saya coba selesaikan adalah mengirim data antara dua perangkat tanpa perangkat lain harus berhenti untuk menerima ini. Saya akan mentransfer sampel audio ke buffer, kemudian chip lain, seperti yang diperlukan, akan membaca audio keluar, dan melakukan sesuatu dengannya.

Saya telah menemukan SRAM serial seperti Microchip 23A256 / 23K256, namun, mereka tampaknya memiliki antarmuka serial tunggal. Apakah ada cara untuk memiliki dua chip mengakses ini?

Selain itu, perangkat penerima hanya memiliki memori data 2KB gratis (maksimum) sehingga sepertinya menggunakan DMA atau mekanisme transfer serupa melalui I2C atau antarmuka lainnya tidak akan berfungsi.

Thomas O
sumber

Jawaban:

10

Anda tidak perlu RAM port ganda atau bahkan RAM serial dengan dua antarmuka; Untuk SPI itu sedikit rumit, tetapi I2C memungkinkan beberapa master "di luar kotak." Apa pun itu, perangkat lunak Anda harus memantau kondisi bus untuk melihat apakah busnya hilang dan jika demikian, tunggu kesempatan lain.

Untuk SPI, garis MOSI, CS dan CLK harus tri-dinyatakan (atau kolektor terbuka) dengan resistor pull-up untuk menjaga garis dari mengambang. Anda juga akan memerlukan semacam arbitrase bus. Ini bisa sesederhana GPIO tunggal antara dua master sehingga yang dengan prioritas tinggi memberi sinyal master prioritas rendah bahwa bus tidak tersedia, tetapi solusi yang lebih elegan akan menjadi jalur kolektor terbuka tunggal antara master. Saat bus dalam keadaan diam, tidak ada master yang menyentak antrean turun sehingga melayang tinggi dengan pull-up. Logikanya adalah jika jalurnya tinggi, bus tersedia. Master yang ingin menggunakan memori akan melihat baris "bus available" dan jika tinggi, drive baris rendah dan tunggu beberapa ms untuk memastikan master lain tidak meraih bus pada saat yang sama. Jika jalur RAM SPI CS masih tidak aktif, aman untuk mengasumsikan bahwa bus itu milikmu. Lakukan transfer, lakukan tri-state jalur MOSI / CLK Anda dan lepaskan sinyal "bus active".

"Tunggu beberapa ms setelah menyentak jalur permintaan bus rendah" diperlukan karena kedua master mungkin dapat mengambil garis pada saat yang sama.

Jika Anda hanya pernah menggunakan satu perangkat bersama dan perangkat itu tidak memerlukan banyak transfer, Anda dapat menggunakan jalur CS-nya sebagai sinyal "bus tersedia", tetapi ini tidak sekuat itu.

akohlsmith
sumber
Tetapi jika mereka berdua mengambil garis pada waktu yang sama, dan menunggu untuk jumlah waktu yang sama sebelum mentransmisikan, bukankah sama dengan tidak menunggu sama sekali?
endolith
Idenya adalah untuk menunggu beberapa ms + beberapa ms acak. Agaknya mereka akan menjalankan perangkat lunak yang berbeda dan berbagai latensi / interupsi / dll akan berkontribusi pada keacakan keterlambatan.
akohlsmith
2
Dalam pengalaman saya, I2C bekerja dengan baik di lingkungan multi-master. Namun, ini tidak secepat SPI, jadi jika sasaran kinerja Anda membutuhkan transfer burst lebih dari 400 kb / s, Anda harus mengejar SPI.
RBerteig
1
@endolith: Jika kedua perangkat mengirimkan hal yang sama, mereka tidak akan mengetahui keberadaan satu sama lain. Jika mereka mentransmisikan hal-hal yang berbeda, perangkat pertama yang mentransmisikan "1" sementara yang lain mentransmisikan "0" akan mendeteksi bahwa ia telah kehilangan arbitrase, segera menghentikan transmisi, dan kemungkinan besar berharap untuk mentransmisikan kembali seluruh perintahnya dari awal.
supercat
3

Cara termudah adalah dengan mengimplementasikan bus multi-master SPI. Anda bisa menggunakan dua jalur I / O tambahan antara master untuk arbitrasi menggunakan mekanisme jabat tangan.

mjh2007
sumber
2

Saya melihat dua solusi yang mungkin untuk masalah Anda:

1) Temukan chip FIFO yang sesuai dengan kebutuhan Anda (satu contoh ). Mungkin tidak sederhana / mungkin digunakan karena saya tidak tahu apakah chip FIFO dengan antarmuka sederhana (seperti SPI) ada. FIFO yang saya tahu memiliki antarmuka paralel.

2) Bagikan SRAM yang disebutkan dari Microchip dengan dua master SPI (dalam dua uControllers). Ketika pertama kali digunakan, port SPI di uController lain harus dalam impedansi tinggi dan berlawanan ketika uController kedua akan menggunakan SRAM. Anda akan memerlukan beberapa antarmuka jabat tangan sederhana antara uControllers (seperti membaca permintaan / membaca dilakukan / baris sibuk). Ini dapat diimplementasikan menggunakan 2 atau 3 koneksi searah antara uControllers. Imajinasi Anda adalah batasnya.

mazurnifikasi
sumber
1

Secara kebetulan, satu pendekatan yang belum disebutkan untuk digunakan dengan memori paralel adalah memiliki dua perangkat atau lebih yang diberi slot waktu tetap untuk mengakses data. Pendekatan ini digunakan di banyak komputer berbasis 6502 yang dibuat oleh Apple, Commodore, dan beberapa vendor lainnya (tidak, menariknya, Atari). Mikroprosesor 6502 yang populer menggunakan clock dua fase, dan selalu melakukan akses memorinya pada paruh kedua setiap siklus (alamat itu tersedia selama paruh pertama, tetapi data akan ditulis pada paruh kedua atau terkunci pada akhir babak kedua). Mesin Apple dan Commodore dengan demikian akan selama paruh pertama dari setiap siklus memori menggunakan alamat yang dihasilkan oleh sirkuit video, mengunci data di akhir setengah; selama paruh kedua setiap siklus mereka akan menggunakan alamat yang dihasilkan oleh CPU,

Pendekatan ini membutuhkan memori yang dua kali lebih cepat daripada yang diperlukan tanpa interleaving memori, dan membutuhkan penambahan driver 3-negara pada output alamat prosesor (output alamat 6502 selalu didorong tinggi atau rendah) tetapi sebaliknya bekerja sangat lancar untuk membuat memori yang sama tersedia untuk prosesor dan ke sirkuit eksternal.

supercat
sumber
0

Ada beberapa cara untuk melakukan apa yang Anda inginkan.

  • Program lain "buffer MCU" untuk duduk di antara dua CPU Anda dan buffer komunikasi - sesuatu seperti "Baudrate converter" yang ditampilkan di http://www.romanblack.com/PICthread.htm . Program itu untuk menyajikan "dual-port" antarmuka independen di setiap sisi. SRAM (internal atau eksternal) terhubung langsung hanya ke buffer MCU ini.
  • Memprogram ulang MCU "pemancar" Anda untuk menyimpan buffer di SRAM, alih-alih langsung mengirimnya ke penerima, dan bertindak sebagai budak untuk menarik data dari buffer itu dan mengirimkannya hanya ketika MCU "penerima" Anda (bertindak sebagai master) meminta Itu. Buffer SRAM (eksternal atau internal) terhubung langsung hanya ke pemancar. (yaitu, menggabungkan fungsi dari apa yang sedang dilakukan penerima Anda sekarang, dan "buffer MCU" di atas).
  • Gunakan beberapa jalur GPIO, seperti yang disarankan Andrew Kohlsmith dan mjh2007, untuk menengahi antara pemancar dan penerima yang mendapatkan akses ke chip 32 KByte SRAM eksternal bersama seperti RAMTRON FM24C256.
davidcary
sumber