STM32 Harici EEPROM Kulanımı

Başlatan ayhan_eee, 19 Ekim 2014, 21:09:14

ayhan_eee

Merhaba arkadaşlar,

Daha önceden yaptığım çalışmayı sizlerle bpaylaşmak istedim. Kodları ayrı ayrı veicem isteyen kütüphane haline getirebilir.Ben getirmemiştim henüz. Yine de paylaşayım dedim.

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


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


eeprom_temizle :

/********************************************************
Fonksiyon : eeprom_temizle(M24256)
Amac      :24CXX Serisieeprom temizleme fonksiyonudur
           Hangi eeprom kullanilacaksa paremetre girilir
Kullanim  :eeprom_temizle(M24256);
*********************************************************/
void eeprom_temizle(uint8_t Mem_Type)
{
  uint16_t adres=0;
  for(adres=0;adres<=32768;adres++)
  {
    write_24CXX(adres,0xFF,Mem_Type);
  }
}


eeprom_sirali_yaz :

/********************************************************
Fonksiyon :eeprom_sirali_yaz
Amac      :Eeeprom'un istediğimiz başlangıcından itibaren yazılan yazıyı yazar.
Kullanim  :eeprom_siralıi_yaz(0x00,M24256,"AyhanKorkmaz.Net Gururla Sunar");
*********************************************************/
void eeprom_sirali_yaz(uint16_t adres,uint8_t Mem_Type,uint8_t *s)
{
while(*s)
{
write_24CXX(adres++,*s++,M24256);
}
 
}


eeprom_sirali_oku :

/********************************************************
Fonksiyon :eeprom_sirali_oku
Amac      :Eeeprom'un istediğimiz başlangıcından itibaren istenilen kadar oku
Kullanim  :eeprom_siralıi_oku(0x00,30,M24256);
*********************************************************/
void eeprom_sirali_oku(uint16_t adres,uint8_t adet,uint8_t Mem_Type)
{
uint8_t i;
for(i=0;i<adet;i++)
Veri[i]=read_24CXX(adres+i,Mem_Type);
 
}





Kodları kütüphane haline getirebilirsiniz.Vaktim olursa ben de getirip eklerim. Kullanımını aşağıdaki linklerden bakabilirsiniz. Konuyu uzatmamakiçin buraya eklemiyorum.





STM32 Harici EEPROM Kullanımı


Programi çıktısı: