- I2C İletişim Protokolü nedir?
- I2C İletişimi Nasıl Çalışır?
- I2C İletişimi Nerelerde Kullanılır?
- Nuvoton N76E003 üzerinde I2C - Donanım Gereksinimi
- AT24LC64 ile Nuvoton N76E003'ün Arayüzü - Devre Şeması
- Nuvoton N76E003 üzerindeki I2C Pinleri
- N76E003'te I2C İletişimi
- I2C İletişimi için N76E003'ün Programlanması
- Kodu ve Çıkışı Yanıp Sönme
Gömülü uygulamalardan oluşan geniş sistemde, hiçbir mikrodenetleyici tüm faaliyetleri tek başına gerçekleştiremez. Zamanın bir aşamasında, bilgi paylaşmak için diğer cihazlarla iletişim kurması gerekir, bu bilgileri paylaşmak için birçok farklı iletişim protokolü vardır , ancak en çok kullanılanlar USART, IIC, SPI ve CAN'dır. Her iletişim protokolünün kendi avantajı ve dezavantajı vardır. Şimdilik IIC kısmına odaklanalım, çünkü bu eğitimde öğreneceğimiz şey bu. Burada yeniyseniz, N76E003 Mikrodenetleyicinin her çevre birimini çok temel başlangıç eğitiminden tartıştığımız Nuvoton Eğitimlerine göz atın. I2C'yi diğer mikrodenetleyicilerle nasıl kullanacağınızı öğrenmek istiyorsanız aşağıdaki bağlantılara göz atabilirsiniz.
- Arduino'da I2C nasıl kullanılır: İki Arduino Kartı arasında iletişim
- PIC Mikrodenetleyici PIC16F877 ile I2C İletişimi
- I2C kullanarak 16X2 LCD'yi ESP32 ile arayüzleme
- MSP430 Launchpad ile I2C iletişimi
- LCD'yi I2C kullanmadan NodeMCU ile arayüzleme
- Tek bir Arduino programında çoklu iletişim (I2C SPI UART) nasıl yönetilir
I2C, Philips (şimdi NXP) tarafından geliştirilen önemli bir iletişim protokolüdür. Bu I2C protokolünü kullanarak, bir MCU birden fazla cihaza bağlanabilir ve iletişimi başlatabilir. I2C, SDA ve SCL olmak üzere yalnızca iki kabloyla çalışır. SDA, Seri veri ve SCL, Seri Saat anlamına gelir. Bununla birlikte, bu iki pim, VCC voltaj seviyesine kadar yukarı çekme dirençleri gerektirir ve yeterli bir kaldırma direnci ile, veri yolu, benzersiz bir adrese sahip 127 cihazı destekleyebilir.
I2C İletişim Protokolü nedir?
IIC terimi, " Inter Integrated Circuits " anlamına gelir. Normalde I2C veya I kare C olarak veya hatta bazı yerlerde 2 telli arayüz protokolü (TWI) olarak belirtilir, ancak hepsi aynı anlama gelir. I2C, senkronize bir iletişim protokolüdür, yani bilgiyi paylaşan her iki cihaz da ortak bir saat sinyalini paylaşmalıdır. Biri saat sinyali için, diğeri ise veri göndermek ve almak için kullanılan bilgileri paylaşmak için sadece iki tele sahiptir.
I2C İletişimi Nasıl Çalışır?
I2C iletişimi ilk olarak Phillips tarafından tanıtıldı. Daha önce de belirtildiği gibi, iki teli vardır, bu iki tel iki cihaza bağlanacaktır. Burada bir cihaz ana cihaz olarak adlandırılır ve diğer cihaz bir bağımlı cihaz olarak adlandırılır. İletişim her zaman ikisi arasında, bir Master ve bir Slave arasında olmalıdır ve olacaktır. I2C iletişiminin avantajı, bir Master'a birden fazla slave'in bağlanabilmesidir.
Tam iletişim, Seri Saat (SCL) ve Seri Veri (SDA) olmak üzere bu iki kablo üzerinden gerçekleşir.
Seri Saat (SCL): Master tarafından üretilen saat sinyalini slave ile paylaşır
Seri Veri (SDA): Verileri Master ve slave arasında ve arasında gönderir.
Herhangi bir zamanda, yalnızca kaptan iletişimi başlatabilir. Veriyolunda birden fazla slave olduğundan, ana birimin her bir slave'e farklı bir adres kullanarak başvurması gerekir. Ele alındığında, yalnızca bu belirli adrese sahip merhem, bilgilerle yanıt verirken diğerleri sessiz kalır. Bu şekilde, birden fazla cihazla iletişim kurmak için aynı veri yolunu kullanabiliriz.
I2C İletişimi Nerelerde Kullanılır?
I2C iletişimi yalnızca kısa mesafeli iletişim için kullanılır. Akıllı hale getirmek için senkronize bir saat darbesine sahip olduğu için kesinlikle güvenilirdir. Bu protokol esas olarak sensörle veya bir ana bilgisayara bilgi göndermesi gereken diğer cihazlarla iletişim kurmak için kullanılır. Bir mikrodenetleyicinin diğer birçok slave modülle minimum yalnızca kablo kullanarak iletişim kurması gerektiğinde çok kullanışlıdır. Uzun menzilli iletişim arıyorsanız, RS232'yi denemelisiniz ve daha güvenilir iletişim arıyorsanız, SPI protokolünü denemelisiniz.
Nuvoton N76E003 üzerinde I2C - Donanım Gereksinimi
Bu projenin gereği N76E003 kullanarak I2C iletişimini öğrenmek olduğundan, I2C veri hattına bağlanacak bir EEPROM kullanacağız. Bazı verileri EEPROM'da saklayacağız ve aynı şekilde okuyup UART ekranını kullanarak görüntüleyeceğiz.
Depolanan değer UART'ta yazdırılacağından, her türlü USB'den UART'a dönüştürücü gereklidir. N76E003'te UART iletişiminde yeniyseniz, Nuvoton ile UART hakkındaki öğreticiye de göz atabilirsiniz. Uygulamamız için CP2102 UART - USB dönüştürücü kullanacağız. Yukarıdakilerin dışında aşağıdaki bileşenlere de ihtiyacımız var:
- EEPROM 24C02
- 2 adet 4.7k direnç
Yukarıdaki bileşenlerin dışında bir N76E003 mikro denetleyici tabanlı geliştirme panosuna ve Nu-Link Programlayıcıya ihtiyacımız var. Ek olarak, tüm bileşenleri bağlamak için devre tahtası ve bağlantı kabloları da gereklidir.
AT24LC64 ile Nuvoton N76E003'ün Arayüzü - Devre Şeması
Aşağıdaki şemada görebileceğimiz gibi, EEPROM I2C hattına iki yukarı çekme direnci ile bağlanmıştır. En solda, programlama arayüzü bağlantısı gösterilmektedir.
AT24LC64 IC için bir devre tahtası kullandım ve IC'yi jumper kabloları kullanarak nuvoton programlayıcı kartıma bağladım. Nu-ink programcısı ile birlikte donanım kurulumum aşağıda gösterilmiştir.
Nuvoton N76E003 üzerindeki I2C Pinleri
N76E003'ün pin şeması aşağıdaki resimde görülebilir.
Gördüğümüz gibi her bir pinin farklı özellikleri vardır ve her bir pim birden fazla amaç için kullanılabilir. Bununla birlikte, pin 1.4 bir I2C SDA pini olarak kullanılır, PWM'yi ve diğer işlevleri kaybeder. Ancak bu bir problem değildir çünkü bu proje için başka bir işlevsellik gerekli değildir. Aynı şey P1.3 için de olacak, I2C'nin SCL pinidir.
I2C pinleri bir GPIO görevi gördüğünden yapılandırılması gerekir. Tüm GPIO pinleri aşağıda açıklanan modda yapılandırılabilir.
Veri sayfasına göre, PxM1.n ve PxM2. n, G / Ç bağlantı noktasının kontrol işlemini belirlemek için kullanılan iki kayıttır. Veri sayfasında, I2C işlevselliğini kullanmak için I / O modlarının I2C ile ilgili iletişimler için Açık drenaj olarak kullanılması gerektiği belirtilmektedir.
N76E003'te I2C İletişimi
I2C çevre birimi, I2C özelliklerini destekleyen herhangi bir mikro denetleyici birimi için önemli bir şeydir. Birçok farklı mikro denetleyici türü, yerleşik bir I2C çevre birimi ile birlikte gelir. Ancak bazı durumlarda I2C, I2C ile ilgili donanım desteğinin mevcut olmadığı durumlarda yazılım kontrolü kullanılarak manuel olarak yapılandırılabilir (Örneğin, birçok 8051 mikro denetleyici). Bununla birlikte, nuvoton N76E003, I2C çevresel destek ile birlikte gelir.
M76E003, I2C modlarında dört tür işlemi destekler - Ana Verici, Ana Alıcı, Bağımlı Verici ve Bağımlı Alıcı. Ayrıca I2C hattı için standart (100kbps) ve hızlı (400kbps'ye kadar) hızları destekler. I2C, SCL ve SDA sinyal hatlarında birkaç genel kuralla çalışır.
Başlatma ve Durdurma Durumu:
I2C iletişiminde önemli bir şeydir. Veriler I2C hattına aktarıldığında, başlangıç koşuluyla başlar ve bir durdurma koşuluyla biter.
Başlangıç koşulu, SCL hattı yüksek olduğunda SDA üzerindeki yüksekten alçağa geçiş ve durdurma koşulu, SCL hattı yüksek olduğunda SDA'daki düşükten yükseğe geçiştir. Bu iki koşul, ana cihaz tarafından oluşturulur (MCU veya diğer bağımlı cihazları kontrol eden herhangi bir şey). Veriyolu hattı, başlatma koşulu başlatıldığında bu durumda meşgul kalır ve durdurma koşulu başlatıldığında tekrar serbest kalır.
Başlatma ve Durdurma koşulu, N76E003 veri sayfasında sinyal perspektifinde mükemmel bir şekilde gösterilir.
Veri Biçimli 7 Bit Adres:
N76E003, 7 bitlik bir adresi ve veri formatını destekler. Başlatma koşulu başlatıldıktan sonra, ana cihazın verileri I2C hattına göndermesi gerekir. İlk veriler önemlidir. Bu veriler uygun şekilde oluşturulmaz veya iletilmezse, bağlı cihaz tanımlanmayacak ve daha fazla iletişim yapılamayacaktır.
Veriler, SLA olarak belirtilen 7 bit uzunluğunda bir bağımlı adresinden oluşur. Veriyoluna birden fazla cihaz bağlıysa, bu 7 bitlik uzun adresin her cihaz için benzersiz olması gerekir. 7 bitlik adresten sonra 8. bit, veri yönü bitidir. Bunun anlamı, 8. bite bağlı olarak, ana cihaza, verilerin bağımlı cihaza yazılıp yazılmayacağı veya verilerin bağımlı cihazdan okunup okunmayacağı hakkında bilgi gönderir. Sekizinci bit, Okuma veya Yazma bildiricisi olarak adlandırılan R / W bitidir. Hepimizin bildiği gibi, 8-bit bilgi 128 tip olabilir, dolayısıyla 128 cihazı destekler, ancak I2C aynı veri yolu üzerinde 127 tip cihazı destekler ancak 128'i desteklemez. Çünkü 0x00 adresi, genel çağrı adresi olarak adlandırılan ayrılmış bir adrestir. Master tüm cihazlara bilgi göndermek isterse,0x00'ü adresleyecektir ve her cihaz, bağımsız yazılım yapılandırmalarına göre aynı şekilde yeniden oynatacaktır.
Bu nedenle, veri iletimi aşağıdaki gibi görünür:
Onaylayın:
Yukarıdaki veri adresi görüntüsünde, 9. bit ve ardından R / W biti, onay biti olarak adlandırılır. Bu önemlidir, çünkü bu biti kullanarak, master veya slave, SDA hattını aşağı çekerek veri ileticisine yanıt verir. Onay bitini almak için vericinin SDA hattını bırakması gerekir.
I2C İletişimi için N76E003'ün Programlanması
Bu eğitimde kullanılan programın tamamı, bu sayfanın alt kısmında bulunabilir. Koddaki önemli bölümlerin açıklaması aşağıdaki gibidir:
Pinleri Açık Tahliye olarak ayarlayın ve I2C için Yapılandırın:
Önce I2C pin bölümüyle başlayalım. Daha önce açıklandığı gibi, I2C SCL ve SDA bağlantı noktalarının açık boşaltma yapılandırması olarak yapılandırılması ve ayarlanması gerekir. Bunu yapmak için, I2C.c kaynak dosyasıyla birlikte bir I2C.h başlık dosyası kullanıyoruz. Kod pasajı şuna benzer
{P13_OpenDrain_Mode yapın; P14_OpenDrain_Mode; clr_I2CPX;} süre (0)
Yukarıdaki kod, P13 ve P14'ü Açık Drenaj pini olarak ayarlamaktır ve clr_I2CPX , P13 ve P14'ü P1.3'te SCL pini ve P1.4'te SDA pini olarak seçmek için kullanılır.
Bu I2CPX, I2C kontrol yazmacı I2CON'un 0. bitidir. Bu I2C_PX 1 olarak ayarlanırsa, pinler SCL olarak P0.2 ve SDA olarak P1.6 olarak değiştirilir. Ancak P13 ve P14 kullanacağız. Burada alternatif pimler kullanılmamaktadır.
I2C Kontrol Kaydı I2CON:
I2C kontrol kaydı I2CON, I2C işlemlerini kontrol etmek için kullanılır. İlk bit, I2C pin seçim bitidir. 0 olarak ayarlamak, I2C pinini P13 ve P14 olarak yapılandırır.
AA biti, Acknowledge assert bayrağıdır, AA bayrağı ayarlanmışsa, SCL satırının onay saati darbesi sırasında bir ACK döndürülür. Temizlenirse, SCL hattının onaylanan saat darbesi sırasında bir NACK (SDA'da yüksek seviye) döndürülür.
Sonraki bit, I2C durum kesmesi olan SI'dır. I2C Durum Kesmesi etkinleştirilirse, kullanıcı hangi adımın geçtiğini belirlemek için I2STAT kaydını kontrol etmeli ve eylemi gerçekleştirmelidir.
STO, ana modda ayarlanan STOP bayrağıdır. STOP durumu algılandığında, STO donanım tarafından otomatik olarak temizlenir.
Sonraki bit, STA bitidir. Bu bayrak ayarlanırsa, veri yolu boşsa I2C bir BAŞLAT koşulu oluşturur. Veriyolu meşgulse, I2C bir DURDURMA koşulu için bekler ve ardından bir BAŞLAT koşulu oluşturur. STA, I2C zaten ana moddayken ayarlanırsa ve bir veya daha fazla bayt iletilir veya alınırsa, I2C tekrarlanan bir BAŞLATMA koşulu oluşturur. STA'nın yazılım tarafından manuel olarak temizlenmesi gerekir.
Sonuncusu, I2CEN, I2C veriyolu etkinleştirme veya devre dışı bırakma bitidir.
EEPROM 24C02:
Şimdi, 24C02'ye geliyor. N76E003'ün kart destek paketi, 24LC64 için bir I2C koduna sahiptir ve kolayca değiştirilebilir. Bununla birlikte, I2C işlevini anlamak için basit bir yöntem kullanacağız.
EEPROM 24C02 ile detaylı arayüz kullanmak isteyen biri olursa, BSP'deki EEPROM programı kullanılabilir.
N76E003'ün master olacağı ve EEPROM'un da slave olacağı I2C'de yalnızca 24C02'yi bağlayacağız. Böylece herhangi bir veriyi EEPROM adresine yazacağız ve aynısını okuyacağız.
24C02 EEPROM pin çıkışı aşağıda gösterilmiştir -
A0, A1 ve A2, üç adres seçim pinidir. WP pinleri Yazma koruma pinleridir ve EEPROM'da yazmayı etkinleştirmek için VSS ile bağlanmaları gerekir.
Bayt Yazma işlevi aşağıdaki resimde gösterilmektedir.
Tam yazma döngüsü bir başlangıç bitiyle gerçekleşir. Bundan sonra, Kontrol baytının gönderilmesi gerekir. Kontrol baytında aşağıdaki şeyler gereklidir:
Başlangıç bitinden sonra, slave adresinden oluşur. 1010 statik ve A0, A1 ve A2, donanım bağlantısı tabanlı adrestir. Üç pin GND veya VSS kaynağı ile bağlanırsa 0 olarak okunur. Aksi takdirde VCC ile bağlanırsa 1 olarak okunur. Bizim durumumuzda tüm A0, A1 ve A2 VSS ile bağlıdır. Böylece tüm bunlar 0 olacaktır.
Okuma veya yazma koşulu için harcama. Okuma veya Yazma bitli adresin değeri Yazma için - 0xA0 ve okuma için 0xA1 olacaktır. Sonraki, Onay bitidir ve bundan sonra, verilerin depolanması gereken yerde ve son olarak ilgili konumda depolanacak olan 8 bitlik bir adres iletilecektir. Bunlar, ana işlevde adım adım bir formatta yapılır.
Ana İşlev ve Döngü Sırasında:
void main (void) {char c = 0x00; Başlangıç UART0_Timer3 (115200); TI = 1; // Önemli, çıktı işlevinin kullanılması TI = 1 olarak ayarlanmalıdır; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Okunan değer% x", c & 0xff); }; }
Ana işlev basittir, adres 1'deki EEPROM'a sürekli olarak değerler yazmak ve verileri okumaktır. Veriler daha sonra printf işlevi kullanılarak yazdırılır. Printf, değeri onaltılık olarak yazdırıyor.
EEPROM yazma işlevi, EEPROM bölümünde açıklanan aşağıdaki şeylerden oluşur:
void EEPROM_write (işaretsiz karakter adresi, işaretsiz karakter değeri) {I2C_start (); I2C_write (0xA0); I2C_write (adres); I2C_write (değer); I2C_stop (); }
I2C başlatma işlevi aşağıdaki şeylerden oluşur:
void I2C_start (void) {işaretli int zaman = zaman aşımı; set_STA; clr_SI; while ((SI == 0) && (zaman> 0)) {zaman--; }; }
Bu işlevde, SI durumu önceden tanımlanmış zaman aşımı süresiyle birlikte kontrol edilir (önceden tanımlanmış sürenin 1000 olarak ayarlandığı I2C.h'de tanımlanır). Başlatma işlevi, STA'nın ayarlanması ve SI'nın temizlenmesi ile başlar.
void I2C_stop (void) {işaretli int zaman = zaman aşımı; clr_SI; set_STO; while ((STO == 1) && (zaman> 0)) {zaman--; }; }
Başlat ile aynı, durdurma işlevi kullanılır. Durdurma işlevi SI temizleyerek ardından STO kurarak başlatılır. Aşağıdaki işlev I2C okuma işlevidir.
işaretsiz karakter I2C_read (işaretsiz karakter ack_mode) {imzalı int zaman = zaman aşımı; işaretsiz karakter değeri = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {zaman--; }; değer = I2DAT; eğer (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {zaman--; }; } geri dönüş değeri; }
Ack_mode ve I2C_NACK , hem I2C başlık dosyasında sırasıyla 0 ya da 1 olarak tanımlanmaktadır.
Benzer şekilde, yazma işlevi oluşturulur.
void I2C_write (işaretsiz karakter değeri) {işaretli int zaman = zaman aşımı; I2DAT = değer; clr_STA; clr_SI; while ((SI == 0) && (zaman> 0)) {zaman--; }; }
Kodu ve Çıkışı Yanıp Sönme
Kod 0 uyarı ve 0 Hata döndürdü ve Keil tarafından varsayılan yanıp sönme yöntemi kullanılarak yanıp söndü. Yeniyseniz, kodun nasıl yükleneceğini anlamak için nuvoton eğitimine başlama bölümüne göz atın. Kodun derleme bilgileri aşağıda bulunabilir.
I2C_EEPROM.c'yi derleyen 'I2C_EEPROM' hedefini oluşturun… I2C.c'yi derliyor… bağlanıyor…. \ Çıktı \ I2C_EEPROM "- 0 Hata (lar), 0 Uyarı (lar). Geçen Derleme Süresi: 00:00:04 Toplu Oluşturma özeti: 1 başarılı, 0 başarısız, 0 atlandı - Geçen Süre: 00:00:04
Donanım bir devre tahtasında kuruluyor ve beklendiği gibi çalışıyor. Aşağıdaki görselde görebileceğiniz gibi EEPROM üzerine bir değer yazıp hafızadan okuyup seri monitörde görüntüleyebildik.
Kartın bu kod için nasıl çalıştığının tam bir gösterimi için aşağıda verilen videoyu izleyin. Öğreticiden keyif aldığınızı ve herhangi bir sorunuz varsa faydalı bir şeyler öğrendiğinizi umuyoruz, aşağıdaki yorum bölümüne bırakın. Diğer teknik soruları göndermek için forumlarımızı da kullanabilirsiniz.