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ı (http://www.ayhankorkmaz.net/stm32f1xx-eeprom-fonksiyonlarini-gelistirelim/)
Programi çıktısı: