UART alıcı saat hızı


14

UART'ın temellerini anlamaya çalışıyordum.

  • Eşzamansız bir iletişim protokolüdür ve bu nedenle TX ve RX saatleri birbirinden bağımsızdır
  • Veri alımı, başlangıç ​​biti ve bir veya daha fazla durdurma biti kullanımı ile garanti edilir.Ayrıca, alıcı , alım için kullanılan SIPO kaydını sürmek için uygun bir saat oluşturmak için veri hızının farkında olmalıdır .

Buradaki sorular

Verileri kurtarmak için normal olarak 16X'lik bir bit hızının kullanıldığı belirtilmektedir. Yani nasıl dönüşüm bps için saat frekansının mümkün? Lütfen bana UART alıcısında kullanılan saat mekanizmasını incelemek için bazı referanslar verin.

Yanıtlar:


18

Verici ve alıcı saatler, bağımsız olarak üretildikleri şekilde birbirlerinden bağımsızdırlar, ancak düzgün iletim sağlamak için iyi eşleştirilmelidirler.

Düşük olan başlangıç ​​biti ve yüksek olan durdurma biti, iki bayt arasında her zaman alıcının senkronize edebileceği yüksek ila düşük bir geçiş olduğunu garanti eder, ancak bundan sonra kendi başına: daha fazla zaman yok birbirini izleyen bitleri birbirinden ayırmak için kullanabileceği ipuçları. Sahip olduğu tek şey kendi saati. Bu yüzden yapılacak en basit şey, zamanın ortasında her bit başlangıç ​​biti örneğinden başlamaktır. Örneğin, 9600 bps'de bit süresi 104 µs, daha sonra başlangıç ​​bitini + 52 µs'de, ilk veri bitini + 52 µs + 104 µs'de, ikinci veri bitini + 52 µs + 2'de 104 µs vb. , başlangıç ​​bitinin düşen kenarıdır. Başlangıç ​​bitini örneklerken gerçekten gerekli değildir (T 0 T 0 × T 0T0T0T0×T0düşük olduğunu bilin ) başlangıç ​​kenarının ani bir artış olmadığını tespit etmek yararlıdır.

resim açıklamasını buraya girin

52 µs zamanlaması için 9600 bps saat frekansının iki katı veya 19200 Hz gerekir. Ancak bu sadece temel bir tespit yöntemidir. Daha gelişmiş (okuma: daha doğru) yöntemler, sadece bir sivri uçtan kaçınmak için arka arkaya birkaç örnek alacaktır. O zaman , bir bitin ortasında ne olması gerektiğini, örneğin, 5, vb kullanabilirsiniz, her bit için 16 keneler almak için gerçekten 16 9600 Hz saat gerekebilir. Ve yüksek veya düşük olarak okunup okunmayacağını görmek için bir oylama sistemi kullanın.×

Eğer doğru hatırlıyorsam, 68HC11 başlangıçta, ortasında ve bir bit sonunda birkaç örnek aldı, ilk ve son muhtemelen bir seviye değişikliği varsa (garanti edilmez) yeniden senkronize etmek.

Örnekleme saati bit hızından türetilmemiştir, bunun tersi de geçerlidir. 9600 bps için, örnekleme saatini mikro denetleyicinin saat frekansından bir ön ölçekleyici aracılığıyla türeteceğiniz 153 600 Hz olarak ayarlamanız gerekir. Sonra bit saati 16'dan başka bir bölünme ile elde edilir.

eşsiz saatler
Alıcının saati vericiyle senkronize değilse ne olur:

resim açıklamasını buraya girin

Alıcının saati% 6,25 yavaştır ve sonraki her bit için örneklemenin daha sonra ve daha sonra olacağını görebilirsiniz. Tipik bir UART iletimi 10 bitten oluşur: 1 başlangıç ​​biti, 8 veri biti yük kapasitesi ve 1 durdurma biti. Sonra biraz ortasında örnek eğer son bit, yarım bit biraz kapalı göze alabilirsiniz. On bitte yarım bit% 5 olduğundan,% 6,25 sapmamızla sorun yaşayacağız. Bu resimde açıkça görülmektedir: zaten üçüncü veri bitinde kenarın yakınında örnekleme yapıyoruz.


Yardımı takdir ediyorum. Başlangıç ​​biti T0 + 52us yerine T0 + 104us'ta örneklenmemeli mi?
Vivek Maran

1
@ Vivek27 - hayır, çünkü 104 biz başlangıç ​​bitinin süresidir ve daha sonra ortasından ziyade sonunda örnekleme yaparsınız. Bana birkaç dakika verirsen resimlerimi güncelleyeceğim. :-)
stevenvh

1
@Vivek: Aslında başlangıç ​​biti gerçekten "örneklenmiş" değil. Tüm amacı, karakterin geri kalanının göreceli olarak zamanlanmış olduğu satır boşta ilk geçişi sağlamaktır. "Değer" her zaman boş satırın tersidir ve kendi başına herhangi bir veri içermez.
Olin Lathrop

7
@Olin - I , başlangıç biti örnek olmak tek başlangıç kenarı olan bir sivri uç değildi kontrol etmek için.
stevenvh

1
@downvoter - Burada neyin yanlış olduğunu söylersen, düzeltebilirim. Ama sonra bize bir şey söylemelisin . (Bugün de diğer cevabımı reddeden aynı kişi siz misiniz?)
stevenvh

11

Biraz geriye gidelim ve UART'lar tarafından kullanılan düşük seviye sinyal protokolü hakkında konuşalım. TX ve RX, saat değil veri hattıdır. Saatler sadece her UART'ın içindedir, bu yüzden baud hızının ne olduğu konusunda anlaşmaya varılmalıdır.

İletim olmadığında, hat boşta kalır. Bir bayt iletmek için (örneğin, diğer veri genişlikleri mümkündür), verici önce başlangıç ​​bitini gönderir . Alıcı, karakterin geri kalanının kodunu çözmek için başlangıç ​​bitinin ön kenarının zamanını ve bilinen baud hızını kullanır. Diyelim ki 100 kBaud kullanılıyor. Bu, her bit süresinin 10 µs uzunluğunda olduğu anlamına gelir. Bu, başlangıç ​​bitini, veri bitlerini ve durdurma bitlerini içerir. Bu nedenle, ilk veri bitinin ortası, başlangıç ​​bitinin ön kenarından 15 saniye sonra, ikincisi 25 µs'de olacaktır.

Alıcı ve verici saatleri aynı olduğu sürece, bu sonsuza kadar devam edebilir. Ancak, asla tam olarak aynı olmayacaklar, böylece sonsuza kadar devam edemezler. Alıcının saatinin vericinin saatine yeniden senkronizasyonuna izin vermek için veri karakteri biter, çizgi bir süre boşta kalır, daha sonra işlem tekrarlanır. Zamanlama hataları başlangıç ​​bitinin ön kenarından başlayarak birikir, bu nedenle maksimum sapma son bit olur. Bu karakter bittiğinde, alıcı bir sonraki başlangıç ​​bitini bekleyerek sıfırlanır ve işlem tekrarlanır.

8 veri biti ile zamanlama için en kötü durum son biti örneklemektir. Bu, başlangıç ​​bitinin ön kenarı olan zamanlama referansından 8.5 bit süredir. Alıcı 1/2 bit veya daha fazla kapalıysa, farklı bir bit sırasında son biti örnekleyecektir. Açıkçası bu kötü. Bu, 8 1/2 bitlik 1/2 bit veya% 5.9'luk bir saat frekansı uyuşmazlığında olur. Bu uyumsuzlukta başarısız olacağının garantisidir. Güvenilirlik için, genellikle alıcının vericiyi bunun yarısına veya% 2.9'a eşlediğinden emin olmak istersiniz. Bu, son bitte 1/4 bit zaman hatasını temsil eder.

Ancak, o kadar basit değil. Yukarıda açıklanan senaryoda, alıcı esas olarak başlangıç ​​bitinin ön kenarında bir kronometre başlatır. Bu teorik olarak analog elektronikte yapılabilir, ancak bu karmaşık ve pahalıdır ve dijital yongalara kolayca entegre edilemez. Bunun yerine, çoğu dijital UART uygulamasında beklenen bit hızının 16 katında çalışan bir dahili saat bulunur. "Kronometre" bu 16x döngüyü sayar. Bu, tüm bit örnekleme sürelerine 1/16 bit ek olası bir hata olduğu anlamına gelir; bu, son bitte başka bir% .7 saat uyuşmazlığı gibi.

Umarım bu, durma bitinin ne olduğunu, bit zamanlamanın nasıl çalıştığını ve 16x saatin ne hakkında olduğunu netleştirir. Çoğunlukla stop bitlerinin üzerine atladım, ama belki de neden kendiniz için en az bir stop bitinin gerekli olduğunu görebilirsiniz. Temel olarak durdurma bitleri, karakterler arasındaki minimum zorunlu satır boşta kalma süresidir. Bu, alıcının bir karakter almayı bitirdiği ve bir başlangıç ​​bitinin bir sonraki ön kenarı için hazır olduğu zamandır. Durdurma biti yoksa, son veri biti başlatma bitiyle aynı polariteye sahip olabilir ve alıcının kronometresini açacak kenarı olmayacaktır.

Uzun zaman önce bu protokol kamlar, kaldıraçlar ve çıkrıklarla çözülmüştü. Mekanizmanın sıfırlanmasına izin vermek için genellikle iki durdurma biti kullanıldı. Günümüzde her şey dijital mantıkla yapılır ve 1 stop biti hemen hemen evrensel olarak kullanılır. Sık sık 8-N-1 şeklinde yazılmış düşük seviyeli protokolü görürsünüz, yani 8 veri biti, parite biti yoktur (bunları unutun, bugün nadiren kullanılırlar) ve 1 durdurma biti. Başlangıç ​​biti, hiçbir seçenek olmadığı için ima edilir.

8-N-1 kullanarak 8 bitlik bir baytın gönderilmesi aslında 10 bit sürer. Bu, "bit hızı" ile "baud hızı" arasında bir ayrımın olmasının bir nedenidir. Baud hızı, başlatma ve durdurma bitleri dahil olmak üzere ayrı bit sinyal zamanlarını ifade eder. 100 kBaud'da, iletilen her bit, başlatma ve durdurma bitleri dahil 10 µs alır. Bu nedenle, tüm karakter 100 µs alır, ancak sadece 8 bit gerçek veri aktarılır. Baud hızı 100 k'dır, ancak daha yüksek seviyeler açısından veri aktarım bit hızı sadece 80 kBits / s'dir.


5

Aktarım için bit hızı saat hızına bölünür (tipik olarak söylediğin gibi) 16. Çerçeve bitleri için bazı veri olmayan bitleriniz de vardır (başlangıç, eşlik, durdurma). 16000Hz'lik bir saat için saniyede 1000 bit elde edersiniz, ancak minimum çerçeveleme bitlerinden sonra yalnızca 800 veri biti veya saniyede 100 bayt eklenir.

Alım için, alıcı başlangıç ​​biti 16'nın saatlerinin ortasından sayar ve hattın "ilk veri bitini" gördüğü şeyi çağırır. bu sayımı tekrarlar ve sembolün tamamını okumak için yeterince kez tekrarlar, daha sonra durdurma bitinin varlığını onaylar ve bir sonraki başlangıç ​​bitini beklemeye başlar.

Alıcı saat verici saat hızına yakın olduğu sürece, örnekleme iletilen sinyalin doğru parçalarına çarpacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.