25LC1024 SPI EEPROM YAZMA KORUMASI

Başlatan DigitalMan, 02 Ekim 2022, 02:11:23

DigitalMan

Arkadaşlar bir projede spi eeprom kkullanmam gerekti CCS dili ile spi arabirimini kullanarak 25LC1024 e veri yazıyorum. veri yazma işinde problem yok. fakat aynı adrese ikincikez yazma yapmaya çalıştığımda veri yazmıyor.hiç yazılmamış alana veri yazmaya çalıştığımda veri yazılıyor. fakat aynı alana ikinci kez yazma yaptığımda veri yazılmıyor. ilk defa spi eeprom kullandığım için bir yerde hata yapıyorum sanırım. bu bellekte yazma işleminden önce WREN komutu göndererek yazmayı aktif yapmak gerektiğini datasheet ten okudum. aslında bütün herşeyi düzgün yaptığımı düşünüyorum ama aynı adrese ikinci kez veri yazamıyorum. testlerimi proteusta yapıyorum. acaba proteustan kaynaklı bir problem mi buç.

Test için yazdığım kod aşağıdadır. konu hakkında bilgisi olan arkadaşlardan yardım bekliyorum.
#include <main.h>
#USE SPI (MASTER, SPI1, MODE=0, BITS=8, STREAM=SPI_1)
#use rs232(BAUD=9600)

#define FLASH_CS_PIN    PIN_C2
#define FLASH_WP_PIN    PIN_C1
#define FLASH_HOLD_PIN  PIN_C0

#define WREN   0x06
#define READ   0x03
#define WRITE  0x02
#define WRDI   0x04
#define WRITE_SATATUS_REG 0x01

unsigned int32 flash_adres = 0;
unsigned char flash_komut = 0;
unsigned char flash_veri = 0;
unsigned char dizi[] = {"BU BIR DENEME YAZISIDIR"};

void flash_status_reg_yaz(unsigned char status_reg_veri){
   output_low(FLASH_CS_PIN);
   spi_write(WRITE_SATATUS_REG);
   spi_write(status_reg_veri);
   output_high(FLASH_CS_PIN);
}

void flash_status_reg_oku(){
}

void flash_byte_yaz(unsigned int32 adres, unsigned char veri){
   output_low(FLASH_CS_PIN);
   spi_write(WREN); //yazmayı aktif yap
   output_high(FLASH_CS_PIN);
   delay_us(500);
   output_low(FLASH_CS_PIN);
   spi_write(WRITE); //yazma komutu
   spi_write((unsigned char)(flash_adres >> 16));
   spi_write((unsigned char)(flash_adres >> 8));
   spi_write((unsigned char)flash_adres);
   spi_write(veri); //belirlenen adrese yazılacak veri
   output_high(FLASH_CS_PIN);
}

unsigned char flash_byte_oku(unsigned int32 adres){
   spi_write(READ); //yazma komutu
   spi_write((unsigned char)(flash_adres >> 16));
   spi_write((unsigned char)(flash_adres >> 8));
   spi_write((unsigned char)flash_adres);
   return spi_read();
}

void flash_dizi_yaz(unsigned int32 adres, unsigned char *dizi, unsigned char dizi_uzunluk){
   output_low(FLASH_CS_PIN);
   spi_write(WREN); //yazmayı aktif yap
   output_high(FLASH_CS_PIN);
   delay_us(500);
   output_high(FLASH_CS_PIN);
   delay_ms(100);
   output_low(FLASH_CS_PIN);
   spi_write(WREN); //yazmayı aktif yap
   spi_write(WRITE); //yazma komutu
   spi_write((unsigned char)(flash_adres >> 16));
   spi_write((unsigned char)(flash_adres >> 8));
   spi_write((unsigned char)flash_adres);
   for(int i=0; i<dizi_uzunluk; i++) spi_write(*dizi++);
   output_high(FLASH_CS_PIN);
}


void main()
{
   //setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
   output_high(FLASH_CS_PIN);
   delay_ms(500);
   //flash_status_reg_yaz(0x00);
   flash_adres = 0x01; //yazılacak adres
   flash_byte_yaz(flash_adres,0xAA);
   while(1); //programı durdur.

}

bu kod eepro um tekbir adresine (0) birkez veri yazıp duruyor. yazılan veriyi proteustan görüyorum. programda adrese yazılacak veriyi değiştirip tekrar derleyip çalıştırdığımda aynı adrese farklı veri yazmıyor. fakat farklı adrese yazıyor.

bulut_01

aynı adresi önce silip sonra yazmayı deneyin
YENİLMEZ..

DigitalMan

Öncelikle cevabın için teşekkürler. Silmek için ayrı bir komut mu vardı. Yoksa 0x00 veya 0xff gibi bir veri mi yazmak gerekiyor.

mehmet

İlgili E²prom kataloğu Bölüm 3.3...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"