Merhaba sevgili ziyaretçiler. Bu yazımın konusu PIC18F4550 Mikrodenetleyicilerinde I2C protokolü ile ilgili olacak. I2C bağlantısı genellikle aynı devre kartı üzerindeki bir mikrodenetleyici ve bir veya birden fazla aygıt arasında kısa mesafeli haberleşmeyi mümkün kılar. I2C, “Inter Integrated Circuit” (yani Entegre Devreler Arası) ifadesinin kısaltmasıdır.
I2C Protokolü
I2C protokolü cihazlar arasındaki veri haberleşmesini sağlamak için iki hat kullanır (SCL ve SDA). Bu yüzden I2C zaman zaman iki hatlı arayüz (Two Wire Interface – TWI) olarak da anılır. Aşağıdaki şekil birden fazla cihazın aynı mikrodenetleyiciye bu iki hatlı arayüzün üzerinden nasıl bağlandığını göstermektedir.
Bu hatlara bağlı cihazlar birbirinin aynı olmak zorunda değil ancak bağlı her cihazın I2C’yi desteklemesi gerekir. Bu çizimde görüleceği üzere her bir cihazın kendine has bir adresi mevcut. Burada birden fazla cihaz arasında kontrolü mümkün kılan adres bilgisinin verilmesidir.
UART veya SPI bağlantılarından farklı olarak, I2C bağlantılarında SCL ve SDA hatlarının her ikisi de “Open Drain” durumundadır. Yani bu her iki hattın da yalnızca LOW konumuna çekilebileceği, HIGH konumuna çekilemeyeceği anlamına gelir. Bu yüzden her iki hat da sürekli HIGH seviyede tutulmalıdır. Bunun için her ikisi de +5V kaynağına pull-up dirençleriyle bağlanmalıdır.
Bir direnç SCL hattından, bir direnç de SDA hattından +5V hattına çekilmelidir. Yukarıdaki çizimde görüldüğü üzere I2C hattına bağlı tüm cihazlar için yalnızca iki adet direnç yeterlidir. Her bir cihaz için ayrı direnç gerekmez.
Dirençlerin değerinin çok önemi yok. 1.8k ile 4.7k aralığında değere sahip herhangi bir direnç kullanılabilir. Dirençlerin bu aralıktaki değerleri hattın uzunluğuna bağlı olarak değişir. Ancak eğer dirençler olmazsa SCL ve SDA hatlarının voltaj değeri daima 0V (LOW) civarında olacak ve I2C hattı çalışmayacaktır.
I2C hattı daha çok mikrodenetleyici ve haberleşeceği cihaz tercihen aynı PCB üzerinde bulunacak uzaklıkta olduğunda uygun bir tercihtir. Bu cihazlar genelde bellek modülleri, sıcaklık sensörleri, gerçek zaman saatleri, DAC ve ADC çeviriciler ve IO genişleticiler vs.dir.
SPI moddaki seri haberleşmeye benzer şekilde I2C moddaki veri transferi de senkron ve çift yönlüdür. Ancak I2C’de veri aktarımı için yalnızca iki pin kullanılır. Bu pinler, verinin iletimi için SDA (Serial DAta), ve iletim senkronizasyonunu sağlamak için de SCL (Serial CLock) pinleridir.
I2C haberleşme aynı hat üstünde azami 112 cihazı desteklemektedir (Standartlarda 128 adete kadar cihazın desteklendiği bildirilmiştir ancak bunların 16’sı ayrılmış adreslerdir). İletişim hızı Standart modda 100 kbit/s, Hızlı modda ise 400 kbit/s’dir ancak revize edilmiş yeni standartlarla birlikte Yüksek Hızlı modda azami 3.4 Mbit/s veri transferi mümkündür.
I2C senkron seri haberleşme yaptığından her iki cihazın işlemlerini senkron etmek için gereken saat sinyali master cihaz (mikrodenetleyici) tarafından üretilir ve bu saat sinyalinin frekansı baud oranını doğrudan etkiler. Master ve slave cihazlar saat sinyaliyle senkronize olduğunda master veri aktarımını başlatır. MSSP modülü aktifleştirildiğinde bir Başlangıç durumunun oluşmasını bekler. Master cihaz öncelikle SDA pini üzerinden bir BAŞLA biti (lojik sıfır – LOW) gönderir ardından seçilecek slave cihazın 7-bitlik adresini ve son olarak aygıta yazma (0 – LOW) ya da aygıttan okuma (1 – HIGH) yapmak için gereken biti gönderir.
Diğer bir ifadeyle BAŞLA
bitini takip eden bu sekiz bit SSPSR
yazmacına gönderilir. SSPSR
yazmacı adından da anlaşılacağı üzere (Synchron Serial Port Shift Register) bir shift registerdir (kaydırmalı kaydedici). Bu yazmaca yazılan her bilgi her saat sinyalinde bir bit kaydırılarak iletilir. Aynı iletim hattını paylaşan tüm cihazlar Master tarafından gönderilen bu ilk baytı alır ancak yalnızca gönderilen adresin eşleştiği cihaz tüm veriyi alır.
İlk bayt gönderildiğinde (8-bit aktarıldığında) master cihaz alma moduna geçer ve adres eşleşmesinin gerçekleştiği cihazdan kabul (ACK
) sinyali bekler. Eğer slave cihaz kabul veri bitini (lojik 1) gönderirse master cihaz (mikrodenetleyici) DUR
bitini gönderene kadar veri aktarımı devam eder.
Bu veri iletişim protokolunu en basit haliyle aşağıdaki gibi özetleyebiliriz:
MASTER’dan bir SLAVE’e Yazma:
1-BAŞLA
biti (mantıksal sıfır) gönder.
2-Slave cihazın adresini Oku/Yaz biti (LOW
) ile birlikte gönder (çift adres).
3-Verinin yazılması istenilen yazmacın adresini gönder.
4-Veri baytını gönder.
5-DUR
dizisini gönder.
MASTER Tarafından bir SLAVE’den Okuma:
1-BAŞLA
bitini gönder.
2-Slave cihazın adresini Oku/Yaz biti (low) ile birlikte gönder (çift adres).
3-Verinin okunması istenilen yazmacın adresini gönder.
4-Yeniden bir BAŞLA
sekansı gönder (tekrar başlat).
5-Slave cihazın adresini Oku/Yaz biti (HIGH
) ile birlikte gönder (tek adres).
6-Slave cihazdan gelen veri baytını oku.
7-DUR
dizisini gönder.
Görüleceği üzere I2C haberleşme zor değil ve derleyicilerin birçoğu da tüm I2C fonksiyonlarını kullanmayı sağlayacak metotlar sunmakta. Simdi genel olarak I2C protokolunden bahsettikten sonra PIC18 serisi mikrodenetleyicilerde nasil isledigine bakalim.
PIC18 Serisi Mikrodenetleyicilerde I2C Protokolünün Kullanımı
Burada ben PIC18F2550 denetleyicisini kullandım. Haliyle temel kaynağım PIC18F2550‘ye ait datasheet belgesidir. Ayrıca kaynaklarda belirttiğim sitelerden de faydalandım.
PIC Mikrodenetleyicilerinde SPI ve I2C haberleşme için MSSP
(Master Syncronous Serial Port) modülü kullanılıyor. PIC18F2550 denetleyicisinde I2C işlemleri için
- Senkronizasyon sinyalinin sağlandığı Serial clock (SCL) hattı için
RB1
(PORTB.1
) pini - Verinin gönderildiği Serial Data (SDA) hattı için
RB0
(PORTB.0
) pini
Kullanılmaktadır.
DİKKAT! Bu pinler mutlaka ilgili TRIS
yazmaçları vasıtasıyla “INPUT
” olarak ayarlanmalıdır.
Bununla birlikte PIC18F2550 denetleyicisinde I2C işlemleri için altı adet yazmaç kullanılmaktadır. Bu yazmaçlar:
MSSP
Control Register 1 (SSPCON1
),MSSP
Control Register 2 (SSPCON2
),MSSP
Status Register (SSPSTAT
),- Serial Receive/Transmit Buffer Register (
SSPBUF
), MSSP
Shift Register (SSPSR
) (Doğrudan erişim yoktur),MSSP
Address Register (SSPADD
)
SSPCON1
, SSPCON2
ve SSPSTAT
yazmaçları I2C moddaki işlemlerde kontrol ve durum yazmaçları olarak görev yaparlar. SSPCON1
ve SSPCON2
yazmaçları okunabilir ve yazılabilir yazmaçlar olup SSPSTAT
yazmacının düşük değerli altı biti salt-okunur, yüksek değerli iki biti ise okunabilir ve yazılabilir bitlerdir.
SSPSR
(Syncronous Serial Port Shift Register) yazmacı veriyi içeri veya dışarı doğru kaydırmak için kullanılan kaydırma yazmacı; SSPBUF
yazmacı ise veri baytlarının yazıldığı veya okunduğu tampon yazmacıdır.
MSSP modülü I2C Slave moda konfigüre edildiğinde SSPADD
yazmacı, Slave cihaz adresini tutar. Master moda konfigüre edildiğinde ise SSPADD
yazmacının ilk yedi biti baud oranı üretecinin reload değeri olur.
Veri alma işlemlerinde SSPSR
ve SSPBUF
yazmaçları birlikte çift-tamponlu bir alıcıyı oluştururlar. SSPSR
bir tam bayt aldığında onu SSPBUF
yazmacına aktarır ve SSPIF
kesmesini set eder.
Veri aktarım işlemlerinde ise SSPBUF
yazmacı çift tamponlu (double buffered) değildir. SSPBUF
yazmacına yazma işlemi SSPBUF
ve SSPSR
yazmaçlarının her ikisine de yazma ile sonuçlanacaktır.
PIC18F2550 MSSP Yazmaçları
SSPSTAT: MSSP Durum Yazmacı (I2C Mod)
7. Bit - SMP
: Çevrim hızı kontrol bitidir. Master veya Slave modda çalışır.1
= Standart Hız modu için çevrim hızı kontrolü kapalı (100 kHz ve 1MHz).0
= Yüksek Hızlı mod için çevrim hızı kontrolü açık (400 kHz).
6. Bit - CKE
: SMBus Seçme bitidir. Master veya Slave modda çalışır.1
= SMBus’a özgü girişler açıktır.0
= SMBus’a özgü girişler kapalıdır.
5. bit - D/A
: Gönderilen veya alınan son baytın Veri veya Adres olduğunu gösteren bittir. Yalnızca Slave modda çalışır.1
= Aktarılan veya alınan son baytın veri olduğunu gösterir.0
= Aktarılan veya alınan son baytın adres olduğunu gösterir.
4. bit - P
: Stop bitidir. SSPEN “0” yapıldığında veya Mikrodenetleyici resetlendiğinde bu bit “0” olur.1
= Aktarımın sonunda DUR biti alındığını gösterir.0
= Aktarımın sonunda DUR biti alınmadığını gösterir.
3. bit - S
: Start Biti. SSPEN “0” yapıldığında veya Mikrodenetleyici Resetlendiğinde bu bit “0” olur.1
= Aktarımın sonunda BAŞLA biti alındığını gösterir.0
= Aktarımın sonunda BAŞLA biti alınmadığını gösterir.
2. bit - R/W
: Okuma veya Yazma Durum Biti. I2C modunda okuma mı, yazma mı yapıldığının bilgisini tutan bit.
Slave Modunda;1
= Oku0
= Yaz
Master Modunda;1
= Veri aktarımı yapılıyor.0
= Veri aktarımı yapılmıyor.
1. bit - UA
: Adres Güncelle Biti. 10 Bit Slave modunda adres güncelleme bitidir.1
= SSPADD
yazmacı içinde gösterilen adres güncellenir.0
= Adresin güncellenmesi gerekmez.
0. bit - BF
: Tampon Durum Biti. SSP Tamponun doluluk/boşluk durum bilgisini verir.
Gönderim modunda; 1
= SSPBUF
yazmacı doludur.0
= SSPBUF
yazmacı boştur.
Alma modunda;1
= SSPBUF
yazmacı doludur (ACK
ve Stop bitleri dahil değil).0
= SSPBUF
yazmacı boştur (ACK
ve Stop bitleri dahil değil).
SSPCON1: MSSP Kontrol Yazmacı 1 (I2C Modda)
7. bit - WCOL (Write Collision Bit)
: Yazma Çakışması Bitidir. SSPBUF
yazmacının aktarıma uygun olup olmadığını gösterir.
Master modunda çalışırken:1
= I2C hattının durumu veri aktarımının başlaması için uygun olmadığı halde SSPBUF
yazmacına yazma girişiminde bulunulduğunu gösterir. Yazılımsal olarak sıfırlanmalıdır.0
= Herhangi bir çakışma yok.
Slave modunda çalışırken:1
= Bir önceki aktarım işlemi hala devam ederken SSPBUF
yazmacına veri yazıldığını gösterir. Yazılımsal olarak sıfırlanmalıdır.0
= Herhangi bir çakışma yok.
6. bit - SSPOV (SSP Overflow Bit)
: Veri alma işleminde taşma oluştuğunu gösterir.
Veri alma modunda çalışırken:1
= SSPBUF yazmacı hala önceki veriyi tutuyorken yeni bir veri alındığını gösterir. Yazılımsal olarak sıfırlanmalıdır.0
= Herhangi bir taşma yok.
Veri gönderme modunda çalışırken bu bit gözardı edilebilir.
5. bit - SSPEN (SSP Enable Bit)
: MSSP modülünü aktifleştirme bitidir.1
= MSSP modülü etkindir. SDA ve SCL pinleri SSP pinleri olarak ayarlanır.0
= MSSP modülü etkin değildir. SCL ve SDA pinleri Giriş/Çıkış pinleri olarak ayarlanır.
NOT: MSSP modülü aktifleştirildiğinde SDA ve SCL pinleri giriş veya çıkış olarak uygun şekilde konfigüre edilmiş olmalıdır.
4. bit - CKP
: SCL hattını serbest bırakmak için kullanılan kontrol bitidir. Slave modda etkindir, Master modda kullanılmaz.1
= Saat serbest durumdadır0
= Verinin hazırlanması süresince saati lojik sıfır (LOW) seviyesinde tutar.
3-0 bitler - SSPM3:SSPM0 (SSP Mode Selection Bits)
: MSSP
Mod Seçme bitleridir.1111
= Start ve Stop bit kesmeleri etkinleştirilmiş 10-bit adresli I2C Slave modu.1110
= Start ve Stop bit kesmeleri etkinleştirilmiş 7-bit adresli I2C Slave modu.1011
= Yazılım denetimli Master modu (Slave boştadır)1000
= I2C Master modu, saat frekansı= Fosc/(4 * (SSPAD + 1))
0111
= 10-bit adresli I2C Slave modu.0110
= 7-bit adresli I2C Slave modu.
NOT: Rezerve edilmiş veya SPI moda özel bit kombinasyonları listelenmemiştir.
SSPCON2: MSSP Kontrol Yazmacı 2 (I2C Master Modu)
7. bit - GCEN (General Call Enable Bit)
: Genel Çağrı Etkin bitidir. Yalnızca Slave modunda kullanılır. Master modda kullanılmaz.
6. bit - ACKSTAT (Acknowledge Status Bit)
: Onay Durum bitidir. Yalnızca Master Aktarım modunda kullanılır.1
= Slave cihazdan onay gelmedi0
= Slave cihazdan onay geldi
5. bit - ACKDT (Acknowledge Data Bit)
: Onay Veri bitidir. Yalnızca Master Alma modunda kullanılır. Kullanıcı bir veri alma işlemi sonunda bir Onay dizisi başlattığında iletilecek olan değerdir.1
= Kabul edilmedi0
= Kabul edildi
4. bit - ACKEN (Acknowledge Enable Bit)
: Onay Dizisini aktifleştirme bitidir. Eğer I2C modülü etkinse, bu bitler set edilemeyebilir ve SSPBUF
yazmacına yazılamayabilir (veya SSPBUF
‘a yazma devre dışı bırakılmıştır).1
= SDA ve SCL pinleri üzerinde Onay dizisini başlatır ve ACKDT
veri bitini aktarır. Donanım tarafından otomatik olarak sıfırlanır (LOW yapılır).0
= Onay dizisi boşta
3. bit - RCEN (Receive Enable Bit)
: Alma Etkinleştirme bitidir. Yalnızca Master Alma modunda çalışır. Eğer I2C modülü etkinse, bu bit set edilemeyebilir ve SSPBUF yazmacına yazılamayabilir (veya SSPBUF’a yazma devre dışı bırakılmıştır).1
= I2C için Alma modunu etkinleştirir0
= Alma boşta
2. bit - PEN (Stop Enable Bit)
: Durma Koşulu Etkinleştirme bitidir. Eğer I2C modülü etkinse, bu bit set edilemeyebilir ve SSPBUF
yazmacına yazılamayabilir (veya SSPBUF
‘a yazma devre dışı bırakılmıştır).1
= SDA ve SCL pinlerinde durma koşulunu başlatır. Donanım tarafından otomatik olarak sıfırlanır (LOW
yapılır).0
= Durma koşulu boşta
1. bit - RSEN (Repeated Start Enable Bit)
: Tekrarlanan Başlatma Koşulu Etkinleştirme bitidir. Eğer I2C modülü etkinse, bu bit set edilemeyebilir ve SSPBUF
yazmacına yazılamayabilir (veya SSPBUF
‘a yazma devre dışı bırakılmıştır).1
= SDA ve SCL pinlerinde Tekrarlanan Başlatma koşulunu başlatır. Donanım tarafından otomatik olarak temizlenir (LOW
yapılır).0
= Tekrarlanan Başlatma koşulu boşta.
0. bit - SEN (Start Enable Bit)
: Başlatma Koşulu/Clock Stretching Etkinleştirme bitidir. Eğer I2C modülü etkinse, bu bit set edilemeyebilir ve SSPBUF
yazmacına yazılamayabilir (veya SSPBUF
‘a yazma devre dışı bırakılmıştır).1
= SDA ve SCL pinlerinde Başlatma durumunu başlatır. Donanım tarafından otomatik olarak temizlenir (LOW
yapılır).0
= Başlatma koşulu boşta.
SSPCON2: MSSP Kontrol Yazmacı 2 (I2C Slave Modu)
7. bit – GCEN (General Call Enable Bit): Genel Çağrı Etkin bitidir. Yalnızca Slave modunda çalışır.
1 = SSPSR yazmacında genel bir çağrı adresi (0000h) alındığında ilgili kesmeyi etkinleştir
0 = Genel çağrı adresi devre dışı.
6. bit – ACKSTAT (Acknowledge Status Bit): Onay Durum bitidir. Slave modunda kullanılmaz.
5-2. bitler – ADMSK5, ADMSK2 (Address Mask Bits): Slave Adres Maskesi Seçim bitleri
1 = SSPADD’nin karşılık gelen bitlerinin maskelenmesi etkinleştirildi
0 = SSPADD’nin karşılık gelen bitlerinin maskelenmesi devre dışı.
1. bit – ADMSK1 (Address Mask Bit): Slave Adres Maskesi seçme biti
7 Bit Adres modundayken:
1 = SPADD <1> biti maskeleme etkin
0 = SPADD <1> biti maskeleme devre dışı
10 Bit Adres modundayken:
1 = SSPADD <1: 0> bitleri maskeleme etkin
0 = SSPADD <1: 0> bitleri maskeleme devre dışı
0. bit – SEN (Stretch Enable Bit): Saat Germe Etkinleştirme bitidir. Eğer I2C modülü etkinse, bu bit ayarlanmamış olabilir ve SSPBUF yazılmayabilir (veya SSPBUF’a yazma devre dışı bırakılmıştır).
1 = Saat germe, hem Master aktarım hem de Slave alım için etkinleştirilir (germe etkin)
0 = Saat germe devre dışı
PIC18F2550 I2C Master Mod Haberleşme
Master modunda haberleşme, SSPCON1 yazmacındaki uygun SSPM bitlerini HIGH veya LOW yaparak ve SSPEN bitini HIGH yaparak etkinleştirilir. Master modda, SCL ve SDA hatlarına ait TRIS bitleri önceden ayarlanmış olsa bile MSSP modülü tarafından değiştirilir.
Master mod operasyonları, Başlatma ve Durdurma koşullarının algılanması üzerine üretilen kesme ile desteklenir. Stop (P) ve Start (S) bitleri Reset sırasında veya MSSP modülü devre dışı bırakıldığında silinir (LOW yapılır). I2C veriyolunun kontrolü, hem S hem de P bitleri LOW iken P biti set edildiğinde veya veriyolu boştayken alınabilir.
Yazılım kontrollü Master modda, kullanıcı kodu tüm I2C veri yolu işlemlerini Başlatma ve Durdurma bit durumlarına göre yürütür.
Master mod etkinleştirildiğinde kullanıcının altı seçeneği vardır:
- SDA ve SCL hatlarında bir Başlangıç koşulu belirtir.
- SDA ve SCL hatlarında Tekrarlanan Başlatma koşulunu belirtir.
- Veri / adres iletimini başlatan SSPBUF yazmacına yazar.
- I2C portunu veri alacak şekilde ayarlar.
- Alınan bir bayt verinin sonunda bir Onay koşulu oluşturur.
- SDA ve SCL hatlarında bir Durdurma koşulu oluşturur.
NOT: MSSP modülü, I2C Master modunda yapılandırıldığında olayların kuyruğa alınmasına izin vermez. Örneğin, kullanıcının bir Başlatma koşulu oluşturmasına ve Başlatma koşulu tamamlanmadan iletimi başlatmak için hemen SSPBUF yazmacına yazmasına izin verilmez. Bu durumda, SSPBUF’a veri yazılmaz ve SSPBUF’a bir yazma gerçekleşmediğini ifade eden WCOL biti HIGH yapılır.
Aşağıdaki olaylar, MSSP Kesme Bayrak bitinin (SSPIF) HIGH yapılmasına (ve etkinleştirilirse MSSP kesmesinin oluşmasına) neden olur:
• Başlangıç koşulu
• Durma koşulu
• Aktarılan / alınan veri aktarım baytı
• Onay İletimi
• Tekrarlı Başlangıç
I2C Clock Stretching (Saat Germe) Nedir?
I2C iletişiminde, saat hızını Master cihazın belirlediğinden bahsetmiştik. RS232’den farklı olarak I2C hattı, Master ve Slave’in önceden tanımlanmış bir baud hızıyla tam olarak senkronize olmasını engelleyen sabit bir saat sinyali sağlar. Bundan dolayı, Slave’in Master tarafından sunulan saat hızı ile çalışamadığı bu nedenle Master’in biraz yavaşlaması gereken durumlar olur. Bazı Slave aygıtlar, Master’ın veri göndermesini geciktirmek için (ya da Master saat üretmeyi denemeden önce, Slave’in verileri hazırlamak için daha fazla zamana gereksinim duyduğunda) saat sinyalini LOW seviyede kalmaya zorlayabilir. Bu işlem clock stretching (saat germe) olarak adlandırılan bir mekanizma ile yapılır.
I2C Master Mod Çalışma
Master mod çalışma durumunda ana cihaz tüm seri saat darbelerini, Başlatma ve Durdurma koşullarını oluşturur. Aktarım Durdurma koşulu veya Tekrarlanan Başlatma koşulu ile sona erer. Tekrarlanan Başlatma koşulu da bir sonraki seri aktarımın başlangıcı olduğundan, I2C veri yolu serbest bırakılmaz.
Master Gönderici modunda, seri veri SDA üzerinden çıkarken, seri saat de SCL üzerinden çıkar. İletilen ilk bayt, alıcı cihazın Slave adresini (yedi bit) ve Okuma/Yazma (R/W) bitini içerir. Bu durumda, R/W biti lojik ‘0’ (LOW) olacaktır. Seri veri bir seferde sekiz bit olarak iletilir. Her bir bayt iletildikten sonra, bir Onay biti alınır. Başlatma ve Durdurma koşulları, seri aktarımın başlangıcını ve sonunu belirtmek için çıkarılır.
Master Alıcı modunda, aktarılan ilk bayt Slave cihazın (7 bitlik) adresini ve R/W bitini içerir. Bu durumda, R/W biti lojik “1” (HIGH) olacaktır. Bu nedenle, iletilen ilk bayt 7 bitlik Slave adresini takiben alma bitini belirten lojik “1” (HIGH) olur. Seri veri SDA üzerinden alınırken, SCL seri saati verir. Seri veri bir seferde sekiz bit olarak alınır. Her bir bayt alındıktan sonra, bir Onay biti gönderilir. Başlatma ve Durdurma koşulları, iletimin başlangıcını ve sonunu gösterir.
SPI modu işlemi için kullanılan Baud Rate Generator, 100 kHz, 400 kHz veya 1 MHz I2C işlemi için SCL saat frekansını ayarlamak amacıyla kullanılır.
Tipik bir master mod veri aktarım işlem sırası aşağıdaki gibi gerçekleşir:
- Kullanıcı, Başlatma Etkin biti olan SEN (SSPCON2 <0>) bitini set ederek (HIGH) bir Başlatma koşulu oluşturur.
- SSPIF biti HIGH durumdadır. MSSP modülü, başka herhangi bir işlem yapılmadan önce gerekli başlama zamanını bekleyecektir.
- Kullanıcı, SSPBUF yazmacını gönderilecek slave adresiyle yükler.
- Gönderilecek slave adresi, sekiz bitin tümü iletilene kadar, SDA pininden dışarı doğru kaydırılır (shift-out).
- MSSP modülü, ACK bitini slave cihazdan içeri doğru kaydırarak (shift-in) alır ve değerini SSPCON2 yazmacına (SSPCON2 <6>) yazar.
- MSSP modülü, dokuzuncu saat döngüsünün sonunda SSPIF bitini ayarlayarak bir kesme oluşturur.
- Kullanıcı, SSPBUF’u sekiz bitlik veriyle yükler.
- Veriler, sekiz bitin tümü iletilene kadar SDA pininden dışarı doğru kaydırılır (shift-out).
- MSSP modülü, ACK bitini slave cihazdan içeri doğru kaydırarak (shift-in) alır ve değerini SSPCON2 yazmacına (SSPCON2 <6>) yazar.
- MSSP modülü, dokuzuncu saat döngüsünün sonunda SSPIF bitini ayarlayarak bir kesme oluşturur.
- Kullanıcı, Durdurma Etkin biti olan PEN bitini (SSPCON2 <2>) set ederek (HIGH) bir Durdurma koşulu oluşturur.
- Durdurma koşulu tamamlandığında kesme oluşturulur.
BAUD ORANI
I2C Master modunda, Baud Rate Generator (BRG) yeniden yükleme (reload) değeri SSPADD yazmacının alt yedi bitine yerleştirilir. SSPBUF’a bir yazma gerçekleştiğinde, Baud Rate Generator otomatik olarak saymaya başlar. BRG, SSPADD içine yüklenen reload değerinden başlayarak “0” a doğru sayar ve başka bir yeniden yükleme işlemi gerçekleşene kadar durur. BRG sayısı, Q2 ve Q4 saatlerinde komut döngüsü (TCY) başına iki kez azaltılır. I2C Master modunda, BRG otomatik olarak yeniden yüklenir.
Aktarım işlemi tamamlandığında (yani, son veri bitinin iletiminin ardından gelen ACK alındığında), dahili saat otomatik olarak saymayı durduracak ve SCL pini son durumunda kalacaktır.
Yukarıdaki tabloda, komut saat döngüleri ve SSPADD’ye yüklenen BRG değerini temel alan saat hızları gösterilmiştir.
PIC18F4550 İçin I2C’yi programlama
Uzunca bir kitabi girişten sonra biraz da pratik yapalım.
I2C’yi Başlatma
- PORTB.0 ve PORTB.1 pinleri giriş (INPUT) olarak ayarlanır.
- Ayrıca, SSPSTAT ve SSPCON2 yazmaçları da ayarlanır.
- SSPCON1 yazmacındaki SSPEN biti ayarlanarak I2C’yi etkinleştirilir. Ayrıca master/slave mod belirlenir.
- Master modda SSPADD yazmacına değer yükleyerek I2C iletişiminin frekansı ayarlanır.
void i2c_init() { TRISB0 = 1; /* I2C hatlarını kullanacağımız PORTB.0 ve PORTB.1 pinlerini input yapıyoruz */ TRISB1 = 1; SSPSTAT = 0x80; SSPCON1 = 0x28; /* SSP portunu I2C master mod için etkinleştir, clock = FOSC / (4 * (SSPADD+1))*/ SSPCON2 = 0; SSPADD = Bit_rate; /* 100 kHz bus hızı */ SSPIE = 1; /* SSPIF kesmesini kullanacağız */ SSPIF = 0; }
I2C iletişimini başlatma
- SSPCON2 yazmacındaki SEN bitini set ederek (HIGH) slave cihaza Başlat sinyali gönderilir.
- SEN biti temizlenene kadar (LOW) beklenir.
- Ayrıca, SSPSTAT yazmacındaki, Başlat bitinin algılanıp algılanmadığını gösteren, S biti kontrol edilir.
- Ardından, yazma işlemiyle birlikte slave aygıtın adresi gönderilir ve onay (ACK) işareti kontrol edilir.
char i2c_start(char addr) { SSPCON2bits.SEN=1; /* başlatma etkin işareti gönder */ while(SSPCON2bits.SEN); /* başlatma etkin işaretinin tamamlanmasını bekle */ SSPIF=0; if(!SSPSTATbits.S) /* başlat sinyalinin algılanıp algılanmadığına bak */ return 0; /* başlatmanın başarısız olduğunu gösteren 0 döndür */ return (I2C_Write(addr)); /* slave cihaz adresini yaz */ }
Veriyi Yazma / Aktarma
Bir baytın iletimi / alımı tamamlandığında set (HIGH) olan BF bayrağını veya SSPIF’yi izlememiz gerekiyor.
I2C Veriyolu Hazır
I2C veriyolunun hazır olup olmadığını anlamak için SSPSTAT yazmacındaki BF bayrağı ve R/W biti kontrol edilmelidir.
void i2c_ready() { while(BCLIF); /* bit çarpışma kesme bayrağı set olana kadar bekle */ /* tampon dolu veya oku/yaz bayrakları set olana kadar bekle */ while(SSPSTATbits.BF || (SSPSTATbits.R_nW)); SSPIF=0; /* SSPIF kesme bayrağını temizle */ }
Ayrıca SSPIF bayrağı, tam bayt gönderme/alma durumunu sorgulamak için kullanılabilir. SSPIF kesme bayrağının yazılımsal olarak temizlenmesi (LOW) gerekir.
void i2c_ready() { while(!SSPIF); /* işlemin tamamlanana kadar bekle */ SSPIF=0; /* işlem tamamlandı, SSPIF kesme bayrağını temizle */ }
Verileri aktarım için SSPBUF yazmacına yazıyoruz ve aktarımın tamamlanmasını bekliyoruz.
char i2c_write(unsigned char data) { SSPBUF=data; /* veriyi SSPBUF yazmacına yaz */ i2c_ready(); if (ACKSTAT) /* alındı (ACK) bitini kontrol et */ return 1; else return 2; }
Yazma işleminden sonra eğer I2C iletişimini durdurmak istiyorsak SSPCON2 yazmacındaki PEN bitini set ederiz ve PEN bitinin temizlenmesini bekleriz. Ayrıca, SSPSTAT yazmacındaki, durdurma bitinin algılandığını gösteren, P bitini kontrol ederiz.
char i2c_stop() { i2c_ready(); PEN=1; /* iletişimi durdur */ while(PEN); /* durdurma etkin bitinin set edilmesini bekle */ SSPIF = 0; if (!SSPSTATbits.P) /* durdur sinyalinin algılanıp algılanmadığına bak */ return 0; /* eğer algılanmadıysa başarısız olduğunu gösteren 0 gönder */ }
Veri Okuma / Alma
- SSPCON2 yazmacında bulunan RCEN bitini set ederek veri alma modunu etkinleştirin.
- Ardından tam bir bayt alındığında set edilecek olan Buffer bayrağının set edilmesini bekleyin.
- Hemen tamponu (buffer) okuyun.
- Bir baytı okuduktan sonra, sonraki veriyi okumak istiyorsak bir onay sinyali gönderin, aksi takdirde bir sonraki veriyi okumak istemediğimizi söyleyen olumsuz onay gönderin.
- Bunu yapmak için ACKDT = 1 veya 0 ve ACKEN etkinleştirilmelidir.
/* Verileri slave cihaza yazılan yazmaç konumundan okur ve flag parametresine bağlı olarak ack (0) veya nack (1) gönderir */ char i2c_read(char flag) { int buffer=0; RCEN=1; /* Enable receive *//* Bayt tamamlandığında alınan tampon dolu işaretini bekle */
while(!SSPSTATbits.BF);
buffer=SSPBUF; /* SSPBUF'yi arabelleğe kopyala */
/* Okumaya devam etmek veya okumayı bırakmak için veriyi okuduktan sonra onay veya olumsuz onay gönder*/
if(flag==0)
i2c_ack();
else
i2c_nack
();i2c_ready();
return(buffer);
}
Alındı Onay/Kabul
void i2c_ack
()
{
ACKDT=0; /* Veri alındı 1:NACK, 0:ACK */
ACKEN=1; /* ACK gönderim için etkinleştir */
while(ACKEN);
}
Olumsuz Onay/Kabul
void i2c_nack
()
{
ACKDT=1; /* 1:NACK, 0:ACK */
ACKEN=1; /* ACK gönderim için etkinleştir */
while(ACKEN);
}
haruncetin.com.tr
KAYNAKLAR:
1-PIC18F2550 DataSheet:
http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf
2-Studentcompanion.co.za – PIC Microcontroller Communication with I2C Bus – XC8:
http://www.studentcompanion.co.za/pic-microcontroller-communication-with-i%C2%B2c-bus-xc8/
3-MCU-Turkey – 18F4520 ile I2C Uygulaması:
http://www.mcu-turkey.com/18f4520-ile-i2c-uygulamasi/
4-I2C – learn.sparkfun.com:
https://learn.sparkfun.com/tutorials/i2c
5-PIC18F4550 I2C: https://www.electronicwings.com/pic/pic18f4550-i2c
İlk Yorumu Siz Yapın