Standart Olmayan Seri Sinyali Verimli Bir Şekilde Kod Çözme


12

Ben RF ileten bir ASIC ve sonuçta bir PC'ye veri göndermesi gereken kablosuz alıcısı içeren bir proje üzerinde çalışan bir araştırma ekibinin lisans üyesiyim.

Alıcı hızlı , sürekli, eşzamansız, standart olmayan bir seri sinyal (yani SPI, I2C, UART, vb.) Çıkarır, bu yüzden işim alıcıyı bilgisayara arayüzlemek için mikrodenetleyici yazılımı yazmaktır. Şu anda benim yaklaşımım, verileri dairesel bir arabellek içine yerleştirmek ve ana döngüde tüm bit-bit kod çözme işlemini yapmak için kenar tetiklemeli kesmeler kullanmaktır. Mikrodenetleyici, USB (sanal com port) kullanarak bu verileri aynı anda bilgisayara vermelidir.

İşte yaşadığım bir sorun ve tahmin ettiğim bir sorun:

  1. Çok güçlü 72 MHz ARM Cortex M3 işlemcimle bile arabelleğe alınan verileri yeterince hızlı işleyemiyorum. Bit hızı 400 Kb / sn'dir (2,5 us / bit). Bit başına sadece 180 devir bırakan referans için (kod çözme VE ISR, ~ 30 devir havai ahır içeren!). MCU ayrıca ana döngüde sorguladığı diğer birçok görevi de yerine getirmelidir.

  2. USB sanal com port sürücüsü de kesinti tabanlıdır. Bu, sürücünün sonunda işlemcinin o kadar uzun süre kesileceğini ve birazcık iletilebileceği 2.5 mikrosaniye (180 döngü) penceresini kaçıracağından neredeyse emin olmamı sağlıyor. Bunun gibi kesinti çatışmalarının / ırklarının normal olarak nasıl çözüldüğünden emin değilim.

Yani soru şu ki, bu sorunları çözmek için ne yapılabilir ya da bu doğru bir yaklaşım değil midir? Daha az yazılım merkezli yaklaşımları da düşünmeye hazırım. Örneğin, kod çözme için bir tür donanım durum makinesine sahip özel bir USB çipi kullanmak, ancak bu alışılmadık bir bölgedir.


Söylemeliyim ki, sevdiğim birçok önerinin hızlı bir şekilde cevap verdiğini, sorunuzla iyi konuştuğunu görmek nadirdir. Veri yanıkları hakkında daha fazla bilgi edinmek isterim. Patlamışlar mı, aniden tam hız ve sonra düşük veri periyotları mı yoksa sürekli verilerle uzun bir süreye gidecek misiniz?
Kortuk

ASIC güce sahip olduğu sürece sürekli bir veri akışı gönderir. Hiç patlamamış. Bir bilgisayar okuma ile gerçek zamanlı tıbbi algılama uygulaması. Hiç EKG gördünüz mü?
Keegan Jay

Burada çok büyük cevaplar var. Kesintilerde değişiklik içeren çözümler ile özel donanım / dijital mantık içeren çözümler arasında net bir ayrım gördüm. FPGAs ve Verilog gibi şeylere aşinayım, ancak henüz tecrübeli değilim, bu da uzun vadede kaydedilmeleri gerektiği anlamına geliyor. Kısa vadede @rocketmagnets daha az kesinti-ağır yöntem iyidir. Dijital görevleri mantıksal görevlere ayırmanın ve ARM'yi gerçek hesaplama için kaydetmenin zarafetini seviyorum. Gelecekte, ARM'nin gücü kablosuz seri verilerin analizi ve filtrelenmesi için kullanılacaktır.
Keegan Jay

Sinyal eşzamanlı mı yoksa eşzamansız mı?
markrages

Asenkron. 4 başlangıç ​​biti, 10 veri biti, 2 durdurma biti. İletilen ASIC'in doğası gereği, HI ve LO süreleri çipten çipe büyük ölçüde değişir. Baud hızını çıkarmak için zaten bir algoritma yazdım.
Keegan Jay

Yanıtlar:


5

Başka bir cevap: Kesmeleri kullanmayı bırakın.

İnsanlar kesintileri çok kolay kullanmak için atlar. Şahsen, onları nadiren kullanıyorum çünkü keşfettiğiniz gibi aslında çok fazla zaman harcıyorlar.

Her şeyi o kadar hızlı yoklayan bir ana döngü yazmak genellikle mümkündür, çünkü gecikme spesifikasyonlar dahilindedir ve çok az zaman harcanır.

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

Döngüde diğerlerinden çok daha sık meydana gelen bazı şeyler olabilir. Belki de gelen bitler, bu durumda, bu testlerden daha fazlasını ekler, böylece işlemcinin daha fazlası bu göreve adanır.

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

Bu yaklaşımın gecikmesinin çok yüksek olduğu bazı olaylar olabilir. Örneğin, çok doğru bir şekilde zamanlanmış bir etkinliğe ihtiyacınız olabilir. Bu durumda, o olayı yarıda kesin ve döngüdeki diğer her şeyi yapın.


Cevabınızı diğer Rocketmagnet kişisinin cevabından daha çok seviyorum. Daha fazla hadrware, daha hızlı donanım, daha başka bir şey yerine, Rocketmagnet size şunları önerir: daha az, daha iyi, daha basit yapın.

Pekala, birçok vakanın kesintilerin çözümü çok daha iyi hale getirdiğini gördüm. Harika şeyler yapıyorlar, iyi yapılandırılmış kodlara, düşük gecikmelere ve diğer birçok avantaja izin veriyorlar, ancak burada sizinle aynı fikirdeyim. Sürecin o kadar yoğun olduğu görülüyor ki 1 denetleyicinin dikkatini her bitine seri akışı işlemek için ayırması gerekebilir. Dijital ön uç benim için ideal görünüyor, ancak çoğu zaman bir okul projesi olduğunda biraz mikronunuz var ve FPGA'nız yok, muhtemelen bir mikroyu önce benim için kullanmaya ve daha sonra bir FPGA'ya yerleştirmeye çalışacağım maliyet.
Kortuk

Muhtemelen kısa vadede devam edeceğim çözüm budur. Bundan kaçınmayı umuyordum çünkü mevcut seri sürücülerin bir kısmını yeniden yazmayı içeriyor, ancak kısa bir zaman dilimi içinde yeteneklerim dahilinde zarif bir çözüm.
Keegan Jay

1
@JayKeegan - Evet, muhtemelen bir çözüme giden en hızlı yol. PSoC ve FPGA bir sonraki projeye yaklaşım olabilir.
Rocketmagnet

6

Kablosuz veri akışının kodunu çözmek ve arabelleğe almak için bir Mikrodenetleyici yerine bir FPGA kullanabilirsiniz. Ardından, FPGAs tamponlarını temizlemek için ARM işlemcisini kullanın (örn. Bir SPI arayüzü kullanarak) ve içeriği USB İletişim portundan dışarı gönderin. İşe yarıyor, ancak bir FPGA, donanım arabelleklerinin taşmadığını (veya protokolün daha yüksek bir düzeyinde bırakılan verilerle başa çıkabileceğinizi) garanti edecek kadar sık ​​servis verebildiğiniz sürece kolayca devam edebilmelidir. ).


Bu uzun vadede mükemmel bir çözüm olabilir. Yazılım çözümlerine ek olarak birçok dijital mantık / donanım çözümü almayı umuyordum çünkü şimdi bunları öğrenmek için bir bahanem var! Ne yazık ki FPGA'larla ilgili bir deneyimim yok.
Keegan Jay

6

Kolay: PSoC5 Mikrodenetleyici kullanın .

PSoC

Bir mikro denetleyicinin tüm kullanım kolaylığına sahipsiniz, ayrıca bir CPLD içerir, böylece Verilog'da kendi donanım çevre birimlerinizi yazabilirsiniz. Seri veri kod çözücünüzü verilog'a yazın ve DMA'yı USB bağlantı noktasına yayınlamak için kullanın.

Bu arada, güçlü 32 bit ARM çekirdeği Başparmak cihazlarını döndürüyor olabilir.


Genel bakış sayfasında şüphelerimi artıran saat frekansları listelenmiyor. Veri sayfası 40MHz diyor (6MHz'de 6mA da not aldım). OP'nin şu an sahip olduğu şeyin yarısı. "MCU'nun birçok başka görevi de yerine getirmesi gerekiyor", bu yüzden bunun iyi bir fikir olup olmadığına bağlı olabilir.
stevenvh

67MHz'e kadar çıkıyorlar. Bu yüzden OP'nin mevcut işlemcisi kadar hızlıdır, ancak işin çoğu donanımda yapılacak ve CPU'yu çok daha fazla boş zaman bırakacaktır.
Rocketmagnet

1
Ben bakmadı tüm bilgi formu. İlk aldığım 40MHz dedi.
stevenvh

@stevenvh - Farklı hız dereceleri var. PN'deki üçüncü sayı hız derecesidir. (4 = 48MHz, 6 = 67MHz).
Rocketmagnet

1
Bu aynı zamanda FPGA fikri gibi uzun vadede harika bir çözümdür. Bu tür çipleri hiç duymadım ama kartımın geri kalanındaki birçok işlevi tek bir çipe getiriyor. Gelecekte bu, tüm alıcının bir proje sürücüsünün vizyonu olan başparmak sürücüsünün boyutuna sığdığı anlamına gelebilir. Gelecek dönem Verilog öğreneceğim.
Keegan Jay

4

Sanırım klasik bir mühendislik seçeneğiniz var: hızlı, ucuz, çalışıyor: iki tane seçin.

@ vicatcu'nun çözümü kesinlikle iyi bir çözümdür, ancak daha fazla donanım ekleyemiyorsanız veya eklemezseniz (ve bu daha hızlı bir işlemci içerir), bir seçim yapmanız gerekir. Eğer bu seri bağlantı en önemliyse, tüm bitler toplanana kadar ISR'de oturmalısınız. Bit başına 180 talimat aslında hiç de fena değil, ama her şeyi yapmaya çalışmayın. Bir aktarımın başlangıcını algıladığınızda, aktarım tamamlanana kadar döndürün. Sonucu bir FIFO'ya doldurun ve normal işleme devam edin.

Her iletimin ne kadar uzun olduğunu söylemezsiniz, ancak kısa ve patlamışlarsa bu uygun bir çözüm olacaktır. Sanal COM bağlantı noktası uygulamanızın bazı donanım tamponlamalarına da sahip olduğuna bahse girmeye hazırım, bu yüzden "laggy" bir kesme hizmeti çok fazla sorun göstermemelidir. MCU'nun yapması gerekenin geri kalanıyla ilgili olarak ... vermeniz gereken bazı tasarım kararlarınız var.


Bu çözüm, roketmanın yazılım yaklaşımını kesme tabanlı sürücülerin sayısını azaltarak tamamlar. Kesinti tabanlı olarak belirttiğim ana seri sürücüsünü tutabilirim. Ayrıca bahsettiğiniz gibi tüm kare okunana kadar dönmeyi deneyeceğim.
Keegan Jay

3

Her şeyden önce, buradaki cevapların bazılarını zaten beğendim ve bazıları oyumu aldı.

Ama sadece başka bir olası çözüm atmak için: projenizin kısıtlamaları göz önüne alındığında, ikinci bir mikrodenetleyici eklemek kötü olur (bu başka bir tahta çalıştırmayı içerir mi)? Belki de Cortex-M3'ünüze SPI gibi hızlı bir çevre birimi aracılığıyla bağlanan basit bir 8 bit mikrodenetleyici. Seçtiğiniz 8 bitlik denetleyici, seçilen yanıttaki gibi bitler ve form baytları için yoklanır, ancak bir bayta sahip olduğunda, aktarım için SPI veri kaydına dökebilir.

Korteks-M3 tarafı, alınan SPI verilerini basitçe keser. Bu, önceki 400 KHz harici kenar tetiklemeli kesmenizi 50 KHz'e indirir.

Bunu önermemin iki nedeni, diğer yöntemlerin (PSoC veya eklenen FPGA) biraz pahalı olması (düşük hacimli bir akademik proje için önemli olmasa da) ve bazılarını korumanıza izin verebilmesidir. mevcut kodunuzun yapısı.

Bunun dışında, PSoC fikrinin DMA'dan USB'ye kendi özel çevresel aktarımınızla harika olduğunu düşünüyorum.


Bu aslında bunu gönderirken aklıma gelen bir plan. Kesintilere (seçilen cevap) bağımlılığı azaltarak yazılımı düzene sokamazsam, kesinlikle yapacağım şey budur. Ama evet, muhtemelen iki tane başka bir tahta çalışması gerektirecek, çünkü tasarımlarımı ilk seferde doğru bir şekilde almayı emiyorum.
Keegan Jay

@JayKeegan, haha ​​kulübe hoş geldiniz!
Jon L

2

Veri biçiminiz bir UART'a benziyor, ancak öngörülemeyen ancak tutarlı bir baud hızında, eğimim, gelen verilerin her sözcüğünü SPI veya standart zaman uyumsuz biçime dönüştürmek için bir CPLD kullanmak olacaktır. CPLD dünyasına girmenin bir gereği olduğunu düşünmüyorum. Aslında, ayrık mantık bile neredeyse işe yarayabilir. İstediğiniz veri hızının 5 katından daha fazla smidgin olan bir saat oluşturabilirseniz, birkaç kapı ile beşe bölün ve 16'ya bölün sayacı kullanabilirsiniz. Beşe bölme sayacını, giriş boşta ve 16'ya bölme sayacı sıfır olduğunda sıfırlanacak şekilde düzenleyin. Aksi takdirde bir SPI saat darbesi oluşturun ve beşe bölme sayacı 2'ye çarptığında bölme 16 bölmesini çarpın.

5x saat göz önüne alındığında, bir 16V8 (şu anda mevcut olan en küçük ve en ucuz programlanabilir mantık cihazı) kullanılarak SPI saati üretilebilir. İkinci bir 16V8 veya 22V10, 5x saati oluşturmak için kesirli bir hız bölücü olarak kullanılabilir veya biri biraz daha büyük bir çip (CPLD) kullanabilir ve her şeyi bir arada yapabilir.

Düzenleme / Zeyilname

Daha fazla dikkate alındığında, eğer bir kişi CPLD kullanacaksa, devreye kolayca birkaç ilave iyileştirme eklenebilir. Örneğin, en az 1.5 bit stop biti, ardından 3.5 bit start biti gelene kadar devre duraklaması için oldukça kolay bir mantık eklenebilir; çok kısa bir başlangıç ​​biti alırsa, durdurma bitini aramaya geri dönmelidir. Ayrıca, SPI kullanılıyorsa, alıcı cihazın doğru çerçeveli verileri görmesini sağlamak için / CS sinyali kullanılabilir. SPI verilerini alan aygıt 10 bitlik çerçeveleri işleyebiliyorsa, bu tür çerçeveler doğrudan gönderilebilir. Aksi takdirde, her on bitlik kare, LSB setiyle (7 bit veri) 8 bitlik bir çerçeve ve tüm LSB açık olan bir çerçeve (3 bit veri) olarak gönderilebilir; SPI saati durdurma bitleri sırasında hızlandırılacaktır, böylece tüm veriler gönderilecektir.

Bazı mikrodenetleyiciler, harici bir sinyalle sıfırlanabilme ve zamanlamalarını böyle bir sinyalin serbest bırakılmasıyla senkronize etme gibi şeyleri içeren oldukça çok yönlü PWM oluşturma modüllerine sahiptir. Mikrodenetleyiciniz bunu yapabilirse, kesin özelliklerine bağlı olarak, bu CPLD veya zamanlama oluşturma devresini önemli ölçüde basitleştirebilir.

Rocketmagnet'in bir şekilde değindiği bir başka yaklaşım, tek amacı seri verileri deşifre etmek ve ana mikro tarafından kullanılabilecek bir formata dönüştürmek olan küçük bir mikroya sahip olmak olacaktır. 400KHz veri hızınız yazılım kod çözme için oldukça hızlıdır, ancak PIC gibi bir şey aynı anda başka bir şey yapması gerekmiyorsa bunu başarabilir. Hangi cihazları bildiğinize bağlı olarak, bu bir CPLD kullanmaktan daha kolay veya daha zor olabilir.


Kod çözme için dijital mantık tasarlarken bunların hepsi çok değerli olacaktır. Gerçekten de SPI olarak çıktı alacağım. Şimdilik, kod çözmeyi bağımsız bir MCU (zaman kısıtlamaları) kullanarak yapıyorum. Teşekkür ederim!
Keegan Jay
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.