Soru:
I2C üzerinden Slave veya Master ile veri gönderimi nasıl sonlandırılır?
alt-rose
2019-11-19 10:47:41 UTC
view on stackexchange narkive permalink

Bir Slave veya Master'ın I2C veriyolunda alıcıya birden çok bayt gönderdiğini ve bayt sayısının önceden tanımlanmadığını varsayalım.Öyleyse, gönderen alıcıya gönderecek başka veri olmadığını nasıl söyleyecektir?

Şu ana kadar anladığım şey, gönderenin Master olması durumunda, Slave'e (Alıcı) gönderilecek başka veri olmadığını söylemek için bir NACK göndermesidir.NACK'i gönderdikten sonra oturumu bitirmek için STOP koşulunu gönderir.

Ancak, Slave gönderen ve Master alıcı olduğunda ve yalnızca Slave (gönderen) alıcıya gönderilecek daha fazla veri olmadığını bildiğinde, bu el sıkışma bir Master ve Slave arasında nasıl gerçekleşir acaba?

Altı yanıtlar:
Passerby
2019-11-19 12:35:50 UTC
view on stackexchange narkive permalink

Ancak, Slave gönderen ve Master alıcı olduğunda ve yalnızca Slave (gönderen) alıcıya gönderilecek daha fazla veri olmadığını bildiğinde, bu el sıkışma bir Master ve Slave arasında nasıl gerçekleşir acaba?

Bunun olmaması gerekiyor. i2c çok tanımlı bir protokoldür ve her bir bağımlı cihaz her bir yönetici tarafından bilinmelidir. Tipik olarak, ana birim ikincil birimden iletim yapmasını ister ve mesaj boyutu sabittir, mesaj sıralıdır veya mesaj kaç bayt gönderileceğini içerir.

  1. Master bir kayıt adresi yazar, ardından master okumaya geçer ve slave bir bayt gönderir. Ustanın tüm istediği bu, bir durdurma gönderiyor.

  2. Master bir kayıt adresi yazar, sonra master okumaya geçer ve slave bir bayt gönderir, sonra master tekrar okur, böylece slave sonraki baytı (veya aynı baytı) gönderir. Usta, keyfi olarak kaç tane istediğini okur ve sonra bir durdurma gönderir.

  3. Master bir kayıt adresi yazar, ardından master okumaya geçer ve slave bir bayt gönderir. Bu bayt, yöneticiye o yazmacın kaç bayta sahip olması gerektiğini söyler. Usta okur ve köle o kadar çok şey gönderir, sonra usta durur.

Tüm iletişim , yönetici tarafından kontrol edilir. Köle, efendinin yapmasını istemediği hiçbir şeyi yapmaz. Ana birim, saatin hızını (saatin esnemesine dayanmaz) ve kaç bayt okunacağını kontrol eder. Hiçbir zaman, ana birim söylemediği halde köle veri hattını zorlamayı denememelidir. Veri yapısı önceden bilinmelidir.

Kesinlikle.Köleniz efendi ile konuşmak istiyorsa, I2C değil başka bir şey kullanıyor olmalıdır.Belki farklı bir G / Ç'ye bir kesme hattı.Aksi takdirde, sizinle konuşulana kadar bekleyin.
Hatta kölenin kendi saat kaynağına sahip olmaması ve tamamen usta tarafından sağlanan I2C saatine bağlı olması bile olabilir.
@Michael Tehlikeli görünüyor.Çok bağımlı bir ortamda bu, bağımlı saatin uzatılması durumunda farklı bir aygıtın kilitleneceği anlamına gelir.Böyle bir i2c IC gördüğümden emin değilim.
Justme
2019-11-19 11:39:23 UTC
view on stackexchange narkive permalink

Bunlar iki seçenek.

Bağımlı alıcı daha fazla veri kabul etmezse, baytı NAK olarak alabilir, ancak ana birim yine de durdurma koşulunu göndermekten sorumludur.

Bağımlı bir verici için herhangi bir şeyin durması için sinyal veremez, önceden bilinmesi gerekir veya verilerde kodlanabilir, ör.metin dizesi sıfır ile sonlandırılır, böylece ikincil birim ana durana kadar sıfırları iletebilir.

Genellikle, bu nadirdir ve bilinen bir protokol olduğundan, ana cihaz, ne kadar aktarım yapılacağını cihazlar arasında sabit boyutlu bir başlığın aktarılması anlamına gelse bile, tek bir işlemde kaç bayt okuyacağını veya yazacağını her zaman önceden bilmelidir.

Mitu Raj
2019-11-19 11:41:47 UTC
view on stackexchange narkive permalink

Bir Slave veya Master'ın alıcıya birden çok bayt gönderdiğini varsayalım I2C veriyolunda ve bayt sayısı elden önce tanımlanmamıştır. E sonra gönderen alıcıya daha fazla verisi olmadığını nasıl söyleyecek gönderilsin mi?

Gönderen Master ise, kaç bayt gönderilmesi gerektiğini bilir. Master, son baytı gönderdikten sonra bir DURDUR koşulu göndererek veri transferinin bittiğini işaret edecek ve işlemi sonlandıracaktır.

Master'ın bunu her zaman yapabileceğini unutmayın. Slave, artık veri almak istemediğini söylemek için NACK gönderebilir. Ancak bu işlemin durdurulup durdurulmayacağına yalnızca Usta karar verir.

Ama merak ediyorum bir usta arasında bu anlaşma nasıl oluyor? ve Slave gönderen olduğunda ve Master alıcı olduğunda ve yalnızca Slave Slave (gönderen), cihaza gönderilecek daha fazla veri olmadığını bilir. alıcı?

Gönderen Slave ise, Master, kaç bayt alınması gerektiğini önceden bilmelidir. Master, son baytı aldıktan sonra bir NACK göndererek bunu sinyal verecektir, böylece slave artık SDA hattını kullanmayacaktır. Master artık bir DURDURMA koşulu başlatabilir ve işlemi sonlandırabilir.

Buradan iyi okuyun: TEXAS i2c

KingDuken
2019-11-19 11:50:48 UTC
view on stackexchange narkive permalink

Gönderinizin tamamını yavaş yavaş özetleyeceğim ...

Bir Slave veya Master'ın alıcıya birden çok bayt gönderdiğini varsayalım I2C veriyolunda ve bayt sayısı önceden tanımlanmamıştır.

Ancak tanımlanmalıdır. Rastgele bilgi gönderiliyor veya alınıyorsa, bunları asla yorumlayamazsınız.

Öyleyse, gönderen alıcıya artık verisi olmadığını nasıl söyleyecek? göndermek için?

Üretici, slave'den kaç bit alması gerektiğini belirler. Ana, genellikle bir mikro denetleyici, CPU vb. Gibi bazı mantık aygıtları tarafından yazılır.

Şu ana kadar anladığım kadarıyla, gönderenin Master daha sonra Slave'e (Alıcı) bir NACK gönderir. gönderilecek başka veri yok.

Hayır, tamamen doğru değil. Master bu biti slave'e gönderdikten sonra slave'den hiçbir şey "duymadığında" bir "NACK" oluşur. Telefonda olup "Merhaba, orada mısın?" Demek gibi.

Ama merak ediyorum bir usta arasında bu anlaşma nasıl oluyor? ve Slave gönderen olduğunda ve Master alıcı olduğunda ve yalnızca Slave Slave (gönderen), ne zaman gönderilecek daha fazla veri olmadığını bilir. alıcı?

Gönderen ve alıcı tanımınız çarpık. Hem efendi hem de köle, hem gönderen hem de alıcı olarak hareket eder. Master, sırasıyla yazma veya okuma işlemlerine bağlı olarak hem gönderip alabilir hem de alabilir.


İyi tavsiye: Herhangi bir I2C bağımlı veri sayfasını okumayı düşünün. "Mesaj" anahtar kelimesini arayın. Bu, efendinin köleye gönderdiği bilgidir.

enter image description here Buradan bir resim ... benim resmim değil.

Ana birim, ikincil birimin veri sayfası tarafından tanımlanan, ikincil birimle aynı uzunluktaki adres çerçevesini okuyacak şekilde programlanmalıdır.Ayrıca, bir kölenin adresini de ayarlayabilirsiniz, ancak genellikle fazla değil.Bu, iki kölenin aynı adresi paylaşması durumunda anlaşmazlığın giderilmesine yardımcı olacaktır.


İşte kısa süre önce üzerinde çalıştığım bir parça örneği, bu bir ADM1276 çalışırken değiştirilebilir denetleyici.PMBUS spesifikasyonlarına uyar ancak I2C topolojisi hala geçerlidir.Bayt gönderirken, alırken, okurken ve yazarken efendi ve kölen arasındaki etkileşimleri size söyler.

enter image description here

gbarry
2019-11-19 13:42:21 UTC
view on stackexchange narkive permalink

i2c protokolünde bu sorunu çözen hiçbir şey yoktur.Çalışmasını sağlayabilirsiniz, ancak bunu yapmak için bazı yazılımlar kullanacaksınız.İ2c, genellikle sabit boyutlu yazmaçları içeren donanım iletişimi için tasarlandığından, değişken uzunluktaki verileri işlemek için hiçbir şey sağlanmadı.Bunu kendim buldum ve düşündüğünüz sorunu çözmek zorunda kaldım.

Master her şeyi kontrol ettiğinden, slave'in yapabileceği tek şey, ona ne kadar veri göndermesi gerektiğine dair ipuçları göndermektir.Benim için en çok işe yarayan şey, kölenin uzunluğu ilk bayt olarak göndermesini sağlamaktır.O zaman usta kaç bayt istemesi gerektiğini bilir.

Erinell Barba
2020-04-30 05:51:56 UTC
view on stackexchange narkive permalink

Protokolün kendisi böyle bir eyleme izin vermez, ancak programlamayla çözülemeyen hiçbir şey değildir.

Muhtemelen iki olası seçenek:

  1. Öğretmenin ilk olarak bu tam sayı durumunda (255'ten küçük) bir değer talep etmesi ve bu, daha sonra yapacağınız sonraki aramada göndereceğiniz verilerin boyutu olacaktır.

  2. Gönderilecek verinin maksimum uzunluğu hakkında bilginiz varsa, bunu referans olarak alın, bir diziye veya dizeye dönüştürün ve nerede olduğunu işaretlemek için alacağınız belirli bir karakter ekleyin.veriler sona erer ve kullandığınız veri türüne göre ana dosyada yeniden dönüştürürsünüz.En küçük verilerle dizenin geri kalanını özel karakteriniz ve işinizle doldurun, her zaman aynı boyutta bir dizi göndereceksiniz.



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 4.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...