Anasayfa Gömülü Sistemler ARM STM32F1xx I2C ile Harici EEPROM Kullanımı
ARM

STM32F1xx I2C ile Harici EEPROM Kullanımı

23 Dakikada Okunur
24
0
166
STM32I2C2

Merhaba arkadaşlar bugünkü yazımda internette çok fazla örneği olmayan bir konuya değinmek istiyorum. Aslında bir çok onuda eeprom ele alınmış durumda ama STM32 serisini kullanan kişi sayısı çok az ve türkçe kaynak çok daha az.Bu nedenle türkçe brir kaynak oluşturmak açısından bu yazıda I2C ile harici eeproma veri yazıp okumayı ele alacağım. Yazıya başlamadan önce işlemlerimde kullandığım malzemeleri lisetelemem gerek.Denemek isteyenler için ucuz olarak temin edebilecekleri malzemeler seçtim.
Liste:

  • STM32VLDiscovery ARM Geliştirme Kartı
  • ATMEL 24C256 EEPROM
  • 2 Adet 4K7 Direnç
  • Birkaç Kablo ve breadboard

Yazımın başında öncelikle I2C haberleşmesinden bahsetmek isterim kısaca. Öncelik temel birkaç özelliğinden bahsedelim.

  • 1990 yılında Philips firması tarafından geliştirilmiştir.
  • 2 Adet çift yönlü Open-Drain Sinyal hattı vardır
  • Open-Drain olduğu için MUTLAKA 4K7 veya 10K değerli dirençlerle Pull-Up yapılmalıdır.
24C256
24C256


Son olarak kullandığımız eepromdan bahsetmek gerekir.Bu uygulamada 24C256 EEPROM kullanıyoruz. Öncelikle datasheetini buradan indirebilirsiniz.

Bu eepromla daha düşük boyutlu eepromlar kıyaslanırsa aradaki en önemli fark 16 bit adreslemeye sahip olmasıdır.Kod yazarken bu durumu göz önüne alacağız zaten.

Kodlama kısmını olabildiğince açıklamalı olarak oluşturmak istedim. Parça parça anlatmak isterim.

i2c_setup:

void i2c_setup(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
I2C_InitTypeDef  I2C_InitStructure;
/*I2C Aktif Ettik*/
I2C_Cmd(I2C1,ENABLE);
I2C_DeInit(I2C1);
/* I2C1 Saat Ayarlarini Yapiyoruz */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*I2C1 SDA ve SCL pinlerinin ayarlamalarini yaptik*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//OD
GPIO_Init(GPIOB, &GPIO_InitStructure);
//SCL PB6 and SDA PB7 I2C1 için
/* I2C1 Ayarlarini yaptik*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = i2c_speed ;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
}

Bu kısımda dikat edimesi gereken noktalar kullanacağınız ARM çipine uygun pin ayarlamasını 16. satırda yapmanızdır.Ben STM32VLDiscovery üstündeki STM32F100RBT6 işlemcisini kullanıyorum.

write_24CXX:

uint8_t write_24CXX (uint16_t Addr,uint8_t Data,uint8_t Mem_Type)
{
uint32_t timeout = I2C_TIMEOUT_MAX;//Zaman Aşimi
uint8_t upper_addr,lower_addr;//EEPROM Adres_H ve Adres_L
lower_addr = (uint8_t)((0x00FF)&Addr);//Düşük değerlikli Adres_L
if(Mem_Type== M24256 || Mem_Type ==M24512)//16 bit adrese sahip eeprom mu?
{
Addr = Addr>>8;
upper_addr = (uint8_t)((0x00FF)&Addr);//Yüksek değerli kismi bul Adres_H
}
/*I2C Başlat Komutu*/
I2C_GenerateSTART(I2C1, ENABLE);
/*Yazma Komutu gönder*/
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;
}
I2C_Send7bitAddress(I2C1, MEM_DEVICE_WRITE_ADDR, I2C_Direction_Transmitter);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
}
/*********************************************************************/
if(Mem_Type==M24256 || Mem_Type ==M24512)
{
I2C_SendData(I2C1, upper_addr);//Adres_H Gonder
timeout = I2C_TIMEOUT_MAX;// Zaman Asimi Ayarla
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
}
/* Adres_L Gonder */
I2C_SendData(I2C1, lower_addr);
/*Zaman asimi ayarla*/
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
/*Data Gonder*/
I2C_SendData(I2C1, Data);
/*Zaman asimi ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
/* Durdur komutu yolla*/
I2C_GenerateSTOP(I2C1, ENABLE);
_delay(10);
return 0;
}

read_24CXX:

uint8_t read_24CXX(uint16_t Addr, uint8_t Mem_Type)
{
uint32_t timeout = I2C_TIMEOUT_MAX;//Zaman Asimi Ayarla
uint8_t Data = 0;
uint8_t upper_addr,lower_addr;
lower_addr = (uint8_t)((0x00FF)&Addr);
if(Mem_Type==M24256 ||Mem_Type==M24512 )
{
Addr = Addr>>8;
upper_addr = (uint8_t)((0x00FF)&Addr);//Adres_H bul
}
/* Baslat komutu yolla*/
I2C_GenerateSTART(I2C1, ENABLE);
/*Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;
}
I2C_Send7bitAddress(I2C1, MEM_DEVICE_WRITE_ADDR, I2C_Direction_Transmitter);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
}
if(Mem_Type==M24256)//256
{
/* Adres_H*/
I2C_SendData(I2C1,upper_addr);
/*Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
}
/* Adres_L Yolla*/
I2C_SendData(I2C1, lower_addr);
/* Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
/* Start Komutu Yolla */
I2C_GenerateSTART(I2C1, ENABLE);
/* Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;
}
I2C_Send7bitAddress(I2C1, MEM_DEVICE_READ_ADDR, I2C_Direction_Receiver);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
}
I2C_AcknowledgeConfig(I2C1, DISABLE);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
if ((timeout--) == 0) return 0xFF;
}
/* Stop Komutu Yolla */
I2C_GenerateSTOP(I2C1, ENABLE);
/* Data Al */
Data = I2C_ReceiveData(I2C1);
/* Data Dondur */
return Data;
}

Kodları parça parça yazdıktan sonra birde kullanımını gösteren örnek bir kod yazıp bu yazımı sonlandırıyorum.

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_i2c.h"
#define I2C_TIMEOUT_MAX 10000
#define MEM_DEVICE_WRITE_ADDR 0xA0
#define MEM_DEVICE_READ_ADDR 0xA1
#define i2c_speed              100000 // 100 KHz
enum  eepromtype  {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256,M24512};
unsigned char gozlem=0;
/********************************************************
Fonksiyon : _delay
Amac	  : Gecikme Fonksiyonudur.
Kullanim  : _delay(1000)-10ms eder;
*********************************************************/
void _delay(int a){
int x,y;
for(x=0;x<750;x++)
for(y=0;y<a;y++);
}
/********************************************************
Fonksiyon :i2c_setup
Amac	  :i2c1 için ayarlamalar yapar
Kullanim  :i2c_setup();
*********************************************************/
void i2c_setup(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
I2C_InitTypeDef  I2C_InitStructure;
/*I2C Aktif Ettik*/
I2C_Cmd(I2C1,ENABLE);
I2C_DeInit(I2C1);
/* I2C1 Saat Ayarlarini Yapiyoruz */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*I2C1 SDA ve SCL pinlerinin ayarlamalarini yaptik*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//OD
GPIO_Init(GPIOB, &GPIO_InitStructure);
//SCL PB6 and SDA PB7 I2C1 için
/* I2C1 Ayarlarini yaptik*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = i2c_speed ;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);  
}
/********************************************************
Fonksiyon :write_24CXX
Amac	  :24CXX Serisi için yazma fonksiyonudur
Hangi eeprom kullanuulacaksa paremetre girilir
Kullanim  :i2c_read(0x0000,0x41,M24256);
*********************************************************/
uint8_t write_24CXX (uint16_t Addr,uint8_t Data,uint8_t Mem_Type)
{
uint32_t timeout = I2C_TIMEOUT_MAX;//Zaman Aşimi
uint8_t upper_addr,lower_addr;//EEPROM Adres_H ve Adres_L
lower_addr = (uint8_t)((0x00FF)&Addr);//Düşük değerlikli Adres_L
if(Mem_Type== M24256 || Mem_Type ==M24512)//16 bit adrese sahip eeprom mu?
{
Addr = Addr>>8;
upper_addr = (uint8_t)((0x00FF)&Addr);//Yüksek değerli kismi bul Adres_H
}
/*I2C Başlat Komutu*/
I2C_GenerateSTART(I2C1, ENABLE);
/*Yazma Komutu gönder*/
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;	
}
I2C_Send7bitAddress(I2C1, MEM_DEVICE_WRITE_ADDR, I2C_Direction_Transmitter);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
}
/*********************************************************************/
if(Mem_Type==M24256 || Mem_Type ==M24512)
{
I2C_SendData(I2C1, upper_addr);//Adres_H Gonder
timeout = I2C_TIMEOUT_MAX;// Zaman Asimi Ayarla
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
}	
/* Adres_L Gonder */
I2C_SendData(I2C1, lower_addr);
/*Zaman asimi ayarla*/
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
/*Data Gonder*/
I2C_SendData(I2C1, Data);
/*Zaman asimi ayarla */
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}  
/* Durdur komutu yolla*/
I2C_GenerateSTOP(I2C1, ENABLE);
_delay(10);
return 0;
}
/********************************************************
Fonksiyon :read_24CXX
Amac		  :24CXX Serisi için okuma fonksiyonudur
Hangi eeprom kullanilacaksa paremetre girilir
Kullanim	:i2c_read(0x0000,M24256);
*********************************************************/
uint8_t read_24CXX(uint16_t Addr, uint8_t Mem_Type)
{
uint32_t timeout = I2C_TIMEOUT_MAX;//Zaman Asimi Ayarla
uint8_t Data = 0;
uint8_t upper_addr,lower_addr;
lower_addr = (uint8_t)((0x00FF)&Addr);
if(Mem_Type==M24256 ||Mem_Type==M24512 )
{
Addr = Addr>>8;
upper_addr = (uint8_t)((0x00FF)&Addr);//Adres_H bul
}
/* Baslat komutu yolla*/
I2C_GenerateSTART(I2C1, ENABLE);
/*Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;
} 
I2C_Send7bitAddress(I2C1, MEM_DEVICE_WRITE_ADDR, I2C_Direction_Transmitter);
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
} 
if(Mem_Type==M24256)//256
{
/* Adres_H*/
I2C_SendData(I2C1,upper_addr);
/*Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
}
}		
/* Adres_L Yolla*/
I2C_SendData(I2C1, lower_addr);
/* Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if ((timeout--) == 0) return 0xFF;
} 
/* Start Komutu Yolla */
I2C_GenerateSTART(I2C1, ENABLE);
/* Zaman Asimi Ayarla */
timeout = I2C_TIMEOUT_MAX;
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
{
if ((timeout--) == 0) return 0xFF;
} 
I2C_Send7bitAddress(I2C1, MEM_DEVICE_READ_ADDR, I2C_Direction_Receiver);
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
if ((timeout--) == 0) return 0xFF;
}  
I2C_AcknowledgeConfig(I2C1, DISABLE);  
timeout = I2C_TIMEOUT_MAX; 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
if ((timeout--) == 0) return 0xFF;
}   
/* Stop Komutu Yolla */
I2C_GenerateSTOP(I2C1, ENABLE);
/* Data Al */
Data = I2C_ReceiveData(I2C1);
/* Data Dondur */
return Data;
}
/********************************************************
Fonksiyon :Main
Amac	  :Ana Fonksiyondur
Kullanim  : -
*********************************************************/
int main(void)
{
i2c_setup();
while (1) 
{
write_24CXX(100,0x41,M24256);
gozlem=read_24CXX(100,M24256);
}
}

Örnek kullanımda dikkat edilmesi gereken noktalar var. Öncelikle ilk 9 satırdaki tanımlamalar ve kütüphane eklemelerine çok dikkat etmenik gerekmektedir. Bir diğer nokta da write_24CXX fonksiyonun sonuna bir gecikme ekledim. Bu da çok önemli bir noktadır. Gecikme olmazsa okuma ve yazmada sıkıntı çekersiniz.

Bir diğer değinilmesi gereken nokta da okuma fonksiyonundan gelen verileri değerlendirmektir.Eğer eepromdan 0xFF okuyorsanız daha önceden yazılmamış bir adrestir veya yazma ve okumada hata olmuştur ve zaman aşımından dolayı fonksiyon size 0xFF değerini döndürüyordur.

Yazıyı bitirmeden tekrar hatırlatmam gerekir ki MUTLAKA SDA ve SCL bacakları 4K7 direnci ile Pull-Up yapılmalıdır.
Temel olarak devremiz aşağıdaki gibi olacaktır.

Devre Şeması
Devre Şeması

Elimden geldiğince açık yazmaya çalıştım ancak yine de sorusu olan varsa yorum kısmına yazabilir.Elimden geldiğince cevaplayabilirim.

Daha fazla ilgili makale
Yazardan daha fazla Ayhan KORKMAZ
Load More In ARM

24 Yorumlar

  1. Muhammet

    18 Ocak 2014 at 1:02 pm

    Eline sağlık kardeşim

    Cevapla

    • Ayhan

      18 Ocak 2014 at 2:50 pm

      Teşekkürler

      Cevapla

  2. fatih başdemir

    29 Ocak 2014 at 9:02 am

    Dostum emeğine sağlık, Umarım Türkiyemdeki genç ve aktif beyinler yazılarından faydalanırlar.

    Cevapla

  3. Ayhan

    29 Ocak 2014 at 10:53 am

    Teşekkürler.
    Amacımda bu zaten

    Cevapla

    • fatih başdemir

      30 Ocak 2014 at 1:04 pm

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//OD

      STM32L100 kullanıyorum, bu satırda hata alıyorum sadece _AF eklersem hata vermiyor ama AF_OD kısmında hata oluşuyor.

      Cevapla

  4. Ayhan

    30 Ocak 2014 at 5:45 pm

    Calışması nasıl peki?

    Cevapla

  5. fatih başdemir

    30 Ocak 2014 at 8:21 pm

    EEPROM’a veriyi yazmıyor, 24xx64 kullanıyorum.
    write_24CXX(100,0×41,M2464);
    gozlem=read_24CXX(100,M2464);
    kısımlarını değiştirdim 64 yaptım ama hala çalışmıyor, WP ucunu şaseye bağladım boşta kalmasın diye… anlamaya çalışıyorum

    Cevapla

  6. Ayhan

    31 Ocak 2014 at 7:17 am

    Birşey döndürüyor mu size?
    Bir de İAR kurarak deneyebilir misiniz?

    Cevapla

  7. Ayhan

    11 Temmuz 2014 at 7:31 am

    Teşekkürler Ayhan Hocam elinize sağlık. Ben endüstri meslek lisesinde öğrenciyim.
    Hocam i2c ile basit bir veri gönderme ile ilgili bir açıklamalı örnek kod verebilir misiniz?

    Cevapla

    • Ayhan

      12 Temmuz 2014 at 8:51 am

      Merhaba,
      Bu aralar işlerim çok yoğun olduğu için fazla vakit bulamıyorum.Ancak fırsat bulursam eklerim.Ama kodu detaylıca incelersen rahat bir şekilde i2c haberleşmesini göreceksin tavsiyem kodu satır satır okuyup anlamaya çalışman.Tabii ki ARM ile uğraşıp ARM yapısını oturttuysan. Yoksa i2c öğrenmek istiyorsan sadece farklı yola gitmelisin.

      Cevapla

  8. Ayhan

    15 Temmuz 2014 at 9:43 am

    Merhaba hocam, bir sorum olacak izninizle.
    Elimde, android bir tablet ve bir işlemci var bunlar birbirlerine I2C ile bir şekilde bağlılar.
    İşlemcinin kendi saati var, tablette güç kesildiği zaman güncellemek için.
    Hocam I2C ile saat değiştirebiliyor muyuz?
    Bİraz java biliyorum ama C kodları aşırı karışık görünüyor.
    Saat işlemleri ile ilgili örnek ve yardım istiyorum hocam.

    Cevapla

    • Ayhan

      15 Temmuz 2014 at 10:42 am

      Saat android tabletle mi yoksa işlemciylemi i2c iletişiminde? Eğer işlemciyleyse i2c komtlarını saatin içindeki entegreye göre yollarsan saati ayarlayabilirsin.bunun için saatin içindeki entegreye/veya ayarlı saatse saatin komutlarına ihtiyacın olacak.

      Cevapla

  9. Onur

    14 Ekim 2014 at 8:39 am

    Ayhan bey oncelikle teşekkürler yazınız için.
    Kodu kendi kartımda çalıştırmaya çalıştım ama while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) gönderme yaparken bu kısımda timeout oluyor. 24c02a eeprom ve stm32f103 arm işlemci kullanıyorum. Yardımcı olabilirmisiniz?

    Cevapla

  10. Ayhan

    16 Ekim 2014 at 5:18 pm

    Merhaba,

    24c02 EEPROM’u 8 bit adresleme kullanıyor.Bua göre kodunuzu düzenlediniz mi? Çnkü beni paylatığm kod 16 Adreslemeli EEPROM için hazırlandı(daha karışık olduğu için)

    Cevapla

  11. xna

    13 Haziran 2015 at 10:12 am

    Ayhan bey kolay gelsin , Bu güzel paylaşımınız için teşekkür ediyorum
    Ben stm32f100c8 16mhz ile kodlarınızı denedim ama başarılı olamadım
    sürekli 0xFF geliyor yazıyorum yinede başarılı olamadım acaba neyi gözden kaçırıyor olabilirim ?

    Cevapla

    • Ayhan

      13 Haziran 2015 at 5:24 pm

      0xFF almanız haberleşmeyi kuramadığınız anlamına geliyor. Bunun çeşitli sebepleri olabilir. İlki Pull-up dirençlerini unutmanız olabilir. En çok yapılan hatadır.

      Cevapla

      • xna

        19 Haziran 2015 at 4:16 am

        Sorunum ne olduğunu az çok anladım ama hala çözemedim , Benim Eproom bağlantı Şekli : (SCL – PB8 ** SDA – PB9 ) yani Default adreste değil Yani Remap yaparak kullanmam gerekiyor — i2c_init ayarlarımın son hali aşağıda
        muhtemelen i2c kullanmiyacağım ve STyede yazdım onlarda Remapla olması gerektiğini söylüyorlar , Ama malesef çalışmıyor
        ST nin bu kadar kötü desteğinin olduğunada şahit oldum , örnek yok, İAR kurdum , denedim malesef o kendi içinde ayrı bir cumhuriyet , bu arada Kullandığım Compiler GCC_ARM + Visual Studio 2013 — Lakin MicroC Pro For ARM dada denedim oda çalışmadı , bende son çare EEPROM Kullanmamak olduğu kanaatine vardım ve bir daha ST’ye bulaşmamaya karar verdim :) , başınızı Ağrıttım çok teşekkür ederim ilgi Alakanız için Kolay gelsin …

        GPIO_InitTypeDef i2cGPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;

        /*I2C Aktif Ettik*/
        /*I2C_Cmd(I2C1, ENABLE);
        I2C_DeInit(I2C1);*/

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

        GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);

        /* I2C1 Saat Ayarlarini Yapiyoruz */
        /*RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);*/

        /*I2C1 SDA ve SCL pinlerinin ayarlamalarini yaptik*/
        i2cGPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8;
        i2cGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        i2cGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//OD

        GPIO_Init(GPIOB, &i2cGPIO_InitStructure);
        //SCL PB8 and SDA PB9 I2C1 için

        //I2C_StructInit(&I2C_InitStructure);

        /* I2C1 Ayarlarini yaptik*/
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = 0x00;
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //I2C_Ack_Disable
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = i2c_speed;

        I2C_Cmd(I2C1, ENABLE);
        I2C_Init(I2C1, &I2C_InitStructure);

        Cevapla

        • Ayhan

          19 Haziran 2015 at 12:01 pm

          Merhaba,
          Bene vazgeçmeyin. Sizin durum için sorun çözümü net. Siz Bitbang yöntemi ile I2C haberleşme yapmanız gerekli.

          Cevapla

          • xna

            19 Haziran 2015 at 11:10 pm

            Öneriniz için teşekkür ederim Ayhan bey , Örnek yada kaynak önerebilirmisiniz ?

  12. xna

    17 Haziran 2015 at 3:25 pm

    Geç Yazdığım için Kusura Bakmayın , 4.7 k lar var
    Kullandığım eeprom AT24C512 , şu an tekrardan bakıyorum herhalde
    her halde bir yerde bir bildirim unutmuş olabilirmiyim diye ama gözüme hiç birşey çarpmıyor şu an sizin yazınızı tekrar satır satır kontrol ettim , herhangi bir hata yok arduino mega2560 a takıyorum eepromu sorunsuz okuyor ve yazıyor , eeprom arızalımıdır diye test etme amaçlı denemiştim , ama malesef STM32f100 de çalışmıyor , önerileriniz yada tavsiyeniz nedir acaba ?

    Cevapla

    • Ayhan

      17 Haziran 2015 at 5:02 pm

      Merhaba gördüğünüz üzere kodlarım STM32f10x serisi için uygundur. Yani sizin işlemcinizde de çalışması gerekir. Sorun eğer Pull-Up dirençlerin kaynaklanmıyorsa, ilk olarak kodlardaki SCL ve SDA bacaklarının kendi işlemcinize göre ayarlanıp ayarlanmadığına bakın. En büyük ihtimal buradadır. Yine aynı şekilde o pinin OD olarak sürüldüğünden emin olun. Eğer doğru bacaksa o bacağı dijital olarak 1-0 yaparak çalıştırın. Çalıştığından emin olun. Çünkü datasheet’te atlanabilir. Bazı bacakların Default görevi GPIO Değildir. Eğer bunlar da olmaz ise sürelerle oynamayı deneyin. 0xff almanızın nedeni farklı olabilir. Ya okuyamıyorsunuz yada yazamıyorsunuz. Bu iki ihtimali de düşünün. Ardunio ile yazıp o adresi okumaya çalışın. Farklı işlemler yaparak hatayı daraltmanız gerekli. Yine bilgilendirirseniz yönlendirmeye çalışırım.

      Cevapla

      • xna

        19 Haziran 2015 at 4:17 am

        Sayfayı yenilemediğim için üste yorum yapmış oldum , Kusura bakmayın , kolay gelsin iyi çalışmalar…

        Cevapla

  13. bekir

    23 Ağustos 2016 at 9:15 pm

    2 haftadır I2C ile mpu6050 sürmeye çalışıyorum kodunu inceledikten sonra sorunu bulup düzeltebildim. Çok teşekkürler emeğine sağlık

    Cevapla

    • Ayhan

      2 Eylül 2016 at 10:51 pm

      İşinize yaradı ise ne mutlu bana :)

      Cevapla

Cevap Yaz