Biraz beceriyor


26

Mikrodenetleyici programlamasında yeniyim. ATmega32-A denetleyicisi ve CodeVisionAVR derleyicisini kullanıyorum. SPI iletişimini kullanarak bir sinüs dalgası sinyali üretmek için dalga form üretecini (AD9833) kullanıyorum. Sinüs dalgasını başarıyla üretebiliyorum. Şimdi bu sinyali sensöre iletiyorum. Sensör çıkışı çoklayıcıdan seçilir ve ADC'ye gönderilir. Şimdi SPI iletişimini kullanarak ADC değerlerini okumak istiyorum. ADC sicillerini kurmak için çok şey denedim. Hala çalışmıyor. SPI iletişimini görmek için Kod, önceki yazıma bir ADC kayıtlarımı spi iletişimi kullanarak kaydettirdi . PC’de (PuTTY) değerleri yazdırmak için USART (RS232) iletişimi kullanıyorum.

Birisi bana biraz beceriksiz kullanmamı önerdi. Bu konsepte yeniyim. Herhangi biri bana SPI iletişiminin bit çarpmasına örnek bir kod verebilir mi? Bu prosedür nasıl başlatılır? Herhangi biri bana iyi bir materyal sağlayabilir mi? Herhangi bir harici donanıma ihtiyacım var mı?

Bunu pin bağlantıları da dahil olmak üzere yazdım:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}


Kodunuz saatin dışında ayrı görünüyor, düşük çıkış bit ayarından ve gecikmeden önce olmalıdır. Zamanlamayı düzeltmek için birkaç gecikmeye ihtiyacınız var (saatin az / yüksek olduğu aynı saatte) Steven'ın koduna tekrar bakın. Siz de okumak istiyorsanız bunun için kod eklemeniz gerekir.
Oli Glaser

@OliGlaser Kayıtları ayarlamak için normal SPI Kodu yerine doğrudan bu kodu kullanabilir miyim.
verendra

@ verendra - "normal SPI kodu" ile neyi kastettiğinizden emin değilsiniz. Eğer donanım SPI'sı yerine demek istiyorsan, ADC, protokollerin ve zamanlamanın kabul ettiği sürece darbelerin nasıl üretildiğini önemsemez.
Oli Glaser

Yanıtlar:


25

Bit çarpması, mikrodenetleyicinin içindeki bir donanıma güvenmek yerine, yazılımdaki tüm darbeleri oluşturur.

Pek çok mikrodenetleyicinin bir donanım SPI'si vardır ve tek yapmanız gereken çıktı kaydına bir bayt yazmaktır ve SPI denetleyicisi verileri değiştirir ve aynı zamanda slave'den veri alır. Aktarım tamamlandığında bir kesinti alabilir ve sonra alınan verileri okuyabilirsiniz.

Ancak bazı mikroişlemcilerde SPI donanımı yoktur ve daha sonra her şeyi manuel olarak yaparak bunu simüle etmeniz gerekir. SPI'nin birçok farklı modu vardır, bu darbe diyagramını örnek olarak kullanacağım:

görüntü tanımını buraya girin

Bu nedenle, özel bir SPI denetleyicisi tüm darbeleri, verileri değiştirmeyi ve zamanlamayı önemserken, bit-boğuşurken her işlemi kendi başınıza yapmanız gerekir:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

Bit-bang SPI nispeten basittir, örneğin bit-I2C kodlaması daha karmaşık olacaktır ve bir şekilde bir zamanlayıcıya ihtiyacınız olacak, eğer UART protokolünü bit-bit yapmak istiyorsanız.


2
Örnek bir c kodu verebilir misiniz?
verendra

1
@verendra - Kolayca C'ye çevirmeniz gereken bir sözde kod örneği ekledim
stevenvh

SPI iletişimini kullanarak başarılı bir şekilde Wavefrom üretiyorum. Yalnızca SPI kullanarak ADC değerlerini okumakta sorun yaşıyorum. Hem ADC değerlerini okumak için hem de sadece ikisini birden biti kullanmam gerekiyor. 8 bit göndermek için koduma bir göz atabilir misin? ama nasıl kullanılacağını karıştırıyorum. Bu kaydı doğrudan SPI kodumun yerine kurulum kaydına koyabilir miyim?
verendra,

@Steven - gösterdiğiniz şema ilk önce MSB'dir, bu yüzden 7'den sola kaymaya ve 0'dan sola kaymaya bırakmalısınız. İlk önce LSB olabileceğinden, standart olmadığını biliyorum, ancak çoğu SPI çevre birimlerinin bunu bu şekilde yaptığını düşünüyorum. .
Oli Glaser

2
@Oli - iyi nokta, bunu özledim. Düzelteceğim, geribildirim için teşekkürler. Standart olmamanın nedeni, aktarılan bitlerin sayısı, kaydırma yazmacı uzunluğuna eşit olduğu sürece farketmemesidir. Son zamanlarda bazı mikrodenetleyiciler (NXP Cortec-M3 gibi) değişken uzunluk kaydırma kaydına sahiptir ve yön önemli olabilir. AVR’de IIRC, önce MSB’yi, önce LSB’yi seçebilirsiniz.
stevenvh

6

Bit-çarpması, bir cihazdan çıkan veya bir cihaza giren sinyallerin donanımdan ziyade yazılım tarafından üretildiğini / örneklendiğini gösterir. Açıkçası, bazı donanımlar gereklidir, ancak bit-banging kullanılırken, her çıktı için tek donanım açıkça yazılım tarafından ayarlanabilen veya silinebilen bir mandaldır ve her giriş için tek donanım, yazılımın olup olmadığını test etmesine izin verecek bir arayüzdür. yüksek veya düşük (ve genellikle bir durum için diğerini değil koşullu bir dalı uygular).

Bit çarpması ile elde edilebilecek maksimum hız genellikle amaca yönelik donanım ile elde edilebileceklerin bir kısmı olacaktır, ancak işlemci hızının getirdiği sınırlamalar dışında, bit çarpması çok daha yönlüdür ve durumlarda kullanılabilir Genel amaçlı donanımın çok uygun olmadığı ve özel amaçlı donanımın uygun maliyetli olmadığı durumlarda.

Örneğin, birçok kontrol cihazında esasen aşağıdaki gibi davranan bir "SPI tarzı" bağlantı noktası bulunur: belirli bir sicile bir bayt yazıldığında, donanım, bir veri bitini zaman aşımına uğratan bir miktar saat atımı (tipik olarak sekiz) üretecektir. Her saat darbesinin ön kenarı ve sondaki kenardan gelen bir veri bitini örnekleme. Genel olarak, denetleyicilerin SPI tarzı bağlantı noktaları çeşitli özelliklerin yapılandırılmasını sağlar, ancak bazı durumlarda bir işlemciyi olağandışı bir şey yapan bir cihazla arabirim oluşturmak gerekebilir. Bir cihaz, veri bitlerinin sekiz haricindeki katlarda işlenmesini gerektirebilir veya verinin aynı saat kenarında hem çıktısını almasını hem de örneklenmesini gerektirebilir veya olağan dışı bir gereksinime sahip olabilir. Kumandadaki bir donanımın kullandığı donanım, birinin kesin gereksinimlerini destekleyebilirse, great (bazıları yapılandırılabilir sayıda bit, ayrı ayrı konfigüre edilebilir aktarım ve zamanlama vb. sağlar). Değilse, bit-vuruş yardımcı olabilir. Denetleyiciye bağlı olarak, bir SPI-ish arabiriminin bit-bitmesi, genellikle donanımın ele almasına izin verdiği sürece 2-10 kat alır, ancak gereksinimler donanıma uygun değilse, veri alışverişinin daha yavaş yapılması daha iyi olabilir. hiç yapamamak.

Bit-çarptılmış tasarımlarla dikkat edilmesi gereken önemli bir nokta, iletişim kurulan cihazların tüm zamanlamalarını oluşturmak için bit-çarpma kontrolöründe beklediği veya kontrolörün izin vereceği yerde olması gereken durumlarda en basit ve en sağlam olmalarıdır. dikkatin dağılmadan, bir etkinliğin gerçekleşmesi için beklemek, başka bir etkinlik gerçekleşmeden önce, bu etkinlikle yapması gereken her şeyi yapabileceği yeri beklemek. Bir cihazın nispeten kısa bir zaman dilimi içinde dış uyaranlara tepki vermesi gerekebileceği durumlarda çok daha az dayanıklıdır, ancak bu uyaranları izlemek için enerjisinin% 100'ünü uygulayamaz.

Örneğin, bir işlemcinin, saat hızına göre çok yüksek bir hızda seri olarak UART tarzı verileri seri olarak iletmesini istediğini varsayalım (örneğin, saniyede 8,192 komut çalıştıran bir PIC 1200 bps'de veri vermek istiyor). Kesinti etkin değilse, bu aktarım zor değildir (her yedi komut işleminde bir bit saat). Bir PIC, gelen bir 1200bps veri baytını beklemekten başka bir şey yapmıyorsa, başlangıç ​​bitini bekleyen 3-döngülü bir döngüyü yürütebilir ve ardından yedi-döngü aralıklarında verilerde zamana geçebilir. Aslında, eğer bir PIC gelen bir veri baytı geldiğinde göndermeye hazır bir veri baytına sahipse, bit başına yedi döngü PIC'nin gelen baytı okumakla aynı anda veri baytını göndermesi için yeterli bir zaman olacaktır. Aynı şekilde,eğer böyle bir cevap orijinal iletime göre sabit zamanlamaya sahipse . Öte yandan, bit-bang iletişimini hızlandıran PIC'lerin her iki cihazın da uygun gördüğü herhangi bir zamanda iletilmesine izin verecek şekilde (bu göründüğünde iletebilecek bir cihazın olmasına karşı) izin verilecek şekilde idare edilemezdi. sığdırmak ve ne zaman iletmek istemediysen onu yap, ve zamanının çoğunu ilk cihazdan iletimi beklemek dışında hiçbir şey yapmadan geçirmek zorunda kalacak bir cihaz).

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.