Ayhan 4 Ocak 2014 ARM

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.

Yazar :

Elektrik-Elektronik mühendisiyim. 2 yıldır bu blogda yazıyorum. Ve 6 aydır aktif olarak internet siteleri yönetiyorum. Kişisel olarak da teknoloji ve fotoğrafçılıkla ile ilgileniyorum.



Beni sosyal medya hesaplarım üzerinden takip edin:

YORUMLAR

    • Ayhan

      3 sene ago  

      Teşekkürler

  1. fatih başdemir

    3 sene ago  

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

  2. Ayhan

    3 sene ago  

    Teşekkürler.
    Amacımda bu zaten

    • fatih başdemir

      3 sene ago  

      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.

  3. Ayhan

    3 sene ago  

    Calışması nasıl peki?

  4. 3 sene ago  

    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

  5. Ayhan

    3 sene ago  

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

  6. Ayhan

    2 sene ago  

    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?

    • Ayhan

      2 sene ago  

      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.

  7. Ayhan

    2 sene ago  

    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.

    • Ayhan

      2 sene ago  

      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.

  8. 2 sene ago  

    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?

  9. Ayhan

    2 sene ago  

    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)

  10. xna

    1 sene ago  

    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 ?

    • 1 sene ago  

      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.

      • xna

        1 sene ago  

        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);

        • 1 sene ago  

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

          • xna

            1 sene ago  

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

  11. xna

    1 sene ago  

    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 ?

    • 1 sene ago  

      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.

      • xna

        1 sene ago  

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

  12. bekir

    4 ay ago  

    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

    • 3 ay ago  

      İşinize yaradı ise ne mutlu bana :)

Daha fazla ARM
timer
STM32f1xx Delay Fonksiyonları Yazalım!

Merhaba Arkadaşlar bu yazımda STM32VLDiscovery kartında kullanmak için Delay(gecikme) fonksiyonlarını yazacağız. Öncelikle bu yazımda bir kez söyleyeyim ki kitin üzerinde...

usart
STM32F1xx UART Çalışması

Merhaba arkadaşlar bu yazımda her mikro denetleyici temel bir bağlantı birimi olan UART çalışması yapacağız. Öncelikle STM32VLDiscovery kitini kullanacağım. Özellikle...

Kapat