I2C NEDİR ?
I²C (Inter-Integrated
Circuit) Philips tarafından geliştirilmiş, düşük hızlı çevre
birimlerini anakart, gömülü
sistem ya da cep
telefonu'na bağlamak için kullanılan toprağa referanslı, çok
denetleyicili bir seri veriyoludur. 1990'ların ortasından beri Siemens (sonrasında Infineon Technologies), NEC, STMicroelectronics
(öncesinde SGS-Thomson), Motorola(sonrasında Freescale Semiconductor), Intersil gibi pek çok
firma NXP (öncesinde Philips Semiconductor Division) I²C-sistem
standartıyla tam uyumlu ürünler piyasaya sürmüşlerdir.
1 Ekim 2006 itibarıyla ürünlerinde I²C protokolünü
kullanmak isteyen firmalar için lisans ücreti ödeme zorunluluğu ortadan
kalkmıştır, ancak NXP tarafından tahsis edilen I²C bağımlı birim adresine sahip
olabilmek halen ücrete tabidir.
I²C pull-up dirençleriyle pozitif beslemeye
bağlanmış iki adet çift yönlü open-drain sinyal hattı kullanır (Serial Data Line(SDA) ve Serial
Clock (SCL)). Daha düşük ya da yüksek besleme gerilimlerine de izin verilmekle
birlikte tipik olarak kullanılan besleme değerleri +5 V ya da +3.3 V'tur.
I²C referans
tasarımında 16 adet özel amaçlı adres içeren 7-bit adres
bölgesi mevcuttur, dolayısıyla aynı veriyolu üzerinden en fazla 112 adet birim
birbiriyle haberleşebilir. Sık kullanılan I²C veriyolu hızları 100 kbit/s standart
mod ve 10 kbit/s low-speed modu dur, ancak isteğe
bağlı olarak daha düşük saat frekanslarına da izin verilmektedir.
Son I²C sürümleri daha fazla birime daha hızlı
olarak hizmet verebilmektedir (400 kbit/s Fast mode, 1 Mbit/s Fast
mode plus ya da Fm+, ve 3.4 Mbit/s Yüksek Hızlı Mod). Bu
hızlar PC'lerden ziyade gömülü sistemlerde kullanılmaktadır. Ayrıca 10-bit
adresleme modu gibi diğer özellikler de mevcuttur.
İLETİŞİM AKIŞI :
I2C master
modunda bir veri aktarımı başlatır ve bir clock sinyali üretir.Veri aktarımı
her zaman bir START koşulu ile başlar ve bir STOP koşuluyla son bulur.
Bu koşullar
master modda yazılım tarafından üretilir.
Slave modda
ise arayüz kendi adreslerini(7 veya 10-bit) ve genel çağrı adresini (General
Call Adress) tanıyabilir. Genel çağrı adresi tespiti yazılım tarafından aktif
veya pasif hale getirilebilir.
Transferi
başlatmak için önce bir start biti gönderilir,daha sonra 7-bit slave adres
gönderilir. 8. bit ise read veya write komutunun hangisi olduğunu belirtir. 9.
bit kontrol bitidir(acknowledge) komutun alınıp alınmadığını kontrol eder eğer
komut doğru iletildiyse veri gönderilecek,doğru değil ise iletim
durdurulacak.Data gönderildikten sonra kontrol biti tekrar verinin gidip
gitmediğine bakacak eğer veri gönderilmiş ise STOP biti iletimi durduracak ve
iletim tamamlanmış olacak.
STM32 I2C ÖZELLİKLERİ:
·
Slave
ve master modları için seçenek.
·
Çoklu
master yeteneği (Birden fazla master device kullanılabilir.)
·
100kHz-400kHz-1MHz
hız seçenekleri.
·
7-bit
ve 10-bit adres seçeneği.
·
Çoklu
7-bit slave adres seçeneği.
·
Bütün
7-bit adreslerde kontrol edebilme yeteneği.
·
Programlanabilir
kurulum ve bekleme zamanı.
·
Kolay
yönetilebilir etkinlikler.
·
İsteğe
bağlı esnek clock seçeneği.
·
Yazılımsal
reset.
·
DMA
özellikli 1-byte tampon bellek.
·
Programlanabilir
analog ve dijital gürültü filtreleri.
KEIL HAL LIBRARY I2C FONSİYONLARI :
I2C_HandleTypeDef (&hi2c) = I2C tip tanımlaması yani hangi
I2C yi kullanacağınızı belirtmek için kullanılır.
HAL_I2C_Init()=
I2C yi başlatmak için gerekli olan fonksiyondur.
HAL_I2C_Master_Receive(I2C_HandleTypeDef
*hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) =
Master device ın veri almasını başlatmak için kullandığımız fonksiyondur.
DevAddress: Master
device ın I2C için kullandığı adres.
*pData :
Gönderdiğin data için kullandığın pointer.
Size :
Datanın boyutu.
HAL_I2C_Master_Receive_DMA()=
Veriyi cihaza DMA kullanarak taşı komutudur.
HAL_I2C_Master_Receive_IT()=
Veriyi cihata kesme kullanarak taşı komutudur.
HAL_I2C_Master_Transmit()=Master
device ın veri göndermesini başlatmak içinkullanılan fonksiyondur.
I2C İLE OLED KULLANIMI
Kullandığım oled
Display Module firmasının DM-OLED13-625 1.3 inch 128x64 piksel.Bu oled SPI ve
I2C protokolleriyle kullanılabiliyor ama burda anlatacağım konu I2C ile nasıl
kullanıldığı.
OLED için
kod yazılırken iki tane harici kütüphane eklemeliyiz bunlar SSD1306 ve FONT
kütüphanesidir. SSD1306 kullanmamızın sebebi oled için gerekli olan
fonksiyonların bize kolay bir şekilde sunulmuş olmasıdır.
FONT
kütüphanesini kullanmamızın sebebi ise eğer biz bu kütüphaneyi kullanmamış
olsaydık bir şey yazmak istediğimizde
128x64=8192 tane karede nereye yazacağımızı registerlarıyla birlikte
kodlamamız gerekirdi ama kütüphanenin yazarları bizim için kodlamış biz ise bu
kütüphane sayesinde bir fonksiyonla
kolayca istediğimizi yazdırabilmekteyiz.
SSD1306 FONKSİYONLARI:
ssd1306_Init()=
Kütüphanenin aktif edilmesi için gerekli olan fonksiyondur.
ssd1306_Fill()=Yazdıracağınız
yazının rengini belirlemek için bufonksiyonu kullanmalısınız.Siyah ve beyaz
renkler mevcut.
ssd1306_UpdateScreen()=Ekrana
bir şey yazdırma istediğinizde yazdırma komutunu verdikten sonra yazının
ekranda çıkması için bu fonksiyonu kullanarak ekranı güncellemelisiniz.
ssd1306_WriteChar()=
Char tipinde bir veri yazdırmak istediğinizde bu fonksiyou kullanbilirsiniz.
ssd1306_SetCursor()=
Yazdırmak istediğiniz verinin yazılmaya hangi koordinatlardan başlaması
gerektiğini bu fonksiyonla belirtmelisiniz.
Eğer ekrana
çember,kare,çizgi,üçge,dikdörtgen gibi şekiller çizmek isterseniz bunlarla
ilgili fonksiyonlara kütüphanenizin C dosyasından ulaşabilirsiniz.
SSD1306
kütüphanesi bir çok farklı kişi tarafından yazılmıştır bazılarında
sayıları(integer,float..) yazdırmak için fonksiyonlar tanımlanmıştır. Benim
kullandığım ktüphanede ise böyle bir fonksiyon içermediği için standart input/output
(stdio.h) kütüphanesini aktif ederek orada bulunan sprintf() foksiyonu ile yazdırdım.Bir özel fonksiyonla
yazdırmaktansa bu yolla yazdırmak daha kolay.
OLED DEVRESİNİN KURULUMU:
Yaptığım
devrenin anlatımı olarak LM35 sıcaklık sensöründen ADC ile aldığım veriyi I2C
ile OLED ekranına yazdırmak.
Burada LM35
in data bacağıyla kapasitenin + ucu ,GND si ile kapasitenin – ucu
bağlanmıştır.Bunun sebebi LM35 in gürültülerden kurtulup daha sağlıklı bir
ölçüm yapabilmesi içindir.
Anlatmak istediklerim bu kadar soru ve önerileriniz için ulaşabilirsiniz. Gerekli linklere bağlantılardan ulaşabilirsiniz.
Yorumlar
Yorum Gönder