Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

SD Kart Sorunları

Başlatan -Hasan-, 31 Temmuz 2011, 17:29:25

-Hasan-

Arkadaşlar SD kartlarla uğraşmaya başladım ama bir sorunum var, daha da olabileceği için hepsini bu başlık altında sormayı düşünüyorum.

http://antrak.org.tr/index.php?option=com_content&task=view&id=129&Itemid=55

Antrak.com ' dan faydalanarak aşağıdaki programı hazırladım. Programın amacı SD kartı SPI moduna alıp CMD0 ' ı göndermek ancak kesinlikle başarılı olamıyorum.

SD kartta PIC ' de 3.3 V ile çalışıyor, bu yüzden logic level converter falan yok, işlemci 4 Mhz ' de çalışıyor, SD kart ile haberleşme hızı  250 Khz (1/16).
SD kartı, bilgisayarlarda IDE kablolarının takıldığı IDC konnektör arasına sıkıştırarak kullanıyorum, tüm bağlantıları da avometreyle kontrol ettim, hiçbir sorun yok.
Microsd Adaptörü ile 512 Mb MicroSD kart kullanıyorum acaba sorun SD değil de MicroSD kullanmam olabilir mi? MicroSD kartın biraz da olsa SD ' den farkı olabilirmi?

LIST P=18F4620
INCLUDE "P18F4620.INC"
__CONFIG _CONFIG1H, 0X01
__CONFIG _CONFIG2L, 0X00
__CONFIG _CONFIG2H, 0X00
__CONFIG _CONFIG3H, 0X85
__CONFIG _CONFIG4L, 0X80
__CONFIG _CONFIG5L, 0X0F
__CONFIG _CONFIG5H, 0XC0
__CONFIG _CONFIG6L, 0X0F
__CONFIG _CONFIG6H, 0XE0

;-------------------------XT = 4 Mhz-----------------------------

DATAM EQU 0
SAYA EQU 1
SAYB EQU 2
#DEFINE EN LATC,6,A ;SD Kart CS Ucu PORTC ' nin 6. Bitinde
#DEFINE LED LATD,0,A ;PORTD ' nin 0. Bitinde Led Var
BCF LED ;Led ' i Temizle

MOVLW 0X0F ;Tüm Analog Portlar Dijital
MOVWF ADCON1,A

BCF TRISD,0,A ;Led ' in Bağlı Olduğu Pin Çıkış
BCF TRISC,6,A ;CS ' nin Bağlı Olduğu Pin Çıkış
BCF TRISC,5,A ;SPI SDO Çıkış
BSF TRISC,4,A ;SPI SDI Giriş
BCF TRISC,3,A ;SPI CLK Çıkış

MOVLW	B'01000000' ;CKE '1'
MOVWF	SSPSTAT,A
MOVLW	B'00100001' ;1/16 -> 4 Mhz ' de 250 Khz Haberleşme Hızı
MOVWF	SSPCON1,A ;Seri Port Açıldı

;--------------------------80 Tane Clock Yollanacak------------
BSF EN ;CS '1 Yapıldı

MOVLW 0XFF
MOVWF DATAM,A
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0

BCF EN
;---------------- CS '1' İken 80 Tane Clock Palsi Yollandı

CALL BEKLE,0 ;Biraz Bekle

;------------------CMD0 Başlangıcı
MOVLW 0X40
MOVWF DATAM,A
CALL SENDCMD,0
MOVLW 0X00
MOVWF DATAM,A
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
MOVLW 0X95
MOVWF DATAM,A
CALL SENDCMD,0

MOVLW 0XFF
MOVWF DATAM,A
CALL SENDCMD,0

MOVLW 0XFF
MOVWF DATAM,A
CALL RESPOND,0

;----------------Gelen Cevabı Karşılaştır-------------------
MOVLW 0X01
SUBWF DATAM,W,A
BTFSS STATUS,Z,A
BRA HATA

BSF LED ;Eğer SD Karttan 0x01 Cevabı Gelseydi 
        ;CMD0 Başarılı Olarak Yollanmış Demekti Buna Dair
        ;PORTD ' nin 0. bitindeki Led Yanacaktı
GOTO $ ;Sonsuz Döngü

HATA
BCF LED ;0x01 Gelmediyse CMD0 Başarılı Olmadı Led Sönük Kalacak
GOTO $ ;Sonsuz Döngü

;-----------------------Alt Programlar--------------------
SENDCMD
MOVFF DATAM,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
RETURN

RESPOND
MOVFF DATAM,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
MOVFF SSPBUF,DATAM
RETURN

BEKLE
MOVLW .232
MOVWF SAYA,A
DECFSZ SAYA,F,A
BRA $-2
RETURN

END


Yardımcı olacak arkadaşlara teşekkürler.

ferdem

MicroSD nin boyuttan başka normal SD den farkı var mı bilmiyorum ancak sizin çalışmada fark ettirmez çünkü ben microsd ile temel komutları çalıştırmıştım, belki size bir fikir verir:
SD kart ilk sektör okuma

Ben de microsd + adaptör kullanmıştım, lehimi adaptöre yapmıştım, microsd bazen adaptöre iyi oturmuyor hiç cevap vermiyordu, bunun sebebi lehimleme esnasında da oluşmuş olabilir adaptörün kalitesizliği de olabilir.

-Hasan-

İLGİNÇ SORUN

Devrede kart takılı değil iken bile CMD0 ' ın başarılı bir şekilde gittiğini söylüyor!!!

LIST P=18F4620
INCLUDE "P18F4620.INC"
__CONFIG _CONFIG1H, 0X01
__CONFIG _CONFIG2L, 0X00
__CONFIG _CONFIG2H, 0X00
__CONFIG _CONFIG3H, 0X85
__CONFIG _CONFIG4L, 0X80
__CONFIG _CONFIG5L, 0X0F
__CONFIG _CONFIG5H, 0XC0
__CONFIG _CONFIG6L, 0X0F
__CONFIG _CONFIG6H, 0XE0

;-------------------------XT = 4 Mhz-----------------------------

DATAM EQU 0
SAYAC EQU 1
#DEFINE EN LATC,6,A ;SD Kart CS Ucu PORTC ' nin 6. Bitinde
#DEFINE LED LATD,0,A ;PORTD ' nin 0. Bitinde Led Var
BCF LED ;Led ' i Temizle

MOVLW 0X0F ;Tüm Analog Portlar Dijital
MOVWF ADCON1,A

BCF TRISD,0,A ;Led ' in Bağlı Olduğu Pin Çıkış
BCF TRISC,6,A ;CS ' nin Bağlı Olduğu Pin Çıkış
BCF TRISC,5,A ;SPI SDO Çıkış
BSF TRISC,4,A ;SPI SDI Giriş
BCF TRISC,3,A ;SPI CLK Çıkış

MOVLW	B'01000000' ;CKE '1'
MOVWF	SSPSTAT,A
MOVLW	B'00100001' ;1/16 -> 4 Mhz ' de 250 Khz Haberleşme Hızı
MOVWF	SSPCON1,A ;Seri Port Açıldı

;--------------------------80 Tane Clock Yollanacak------------
TEKRAR2

BSF EN ;CS '1 Yapıldı

MOVLW 0XFF
MOVWF DATAM,A
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0

BCF EN
;---------------- CS '1' İken 80 Tane Clock Palsi Yollandı


;------------------CMD0 Başlangıcı
MOVLW 0X40
MOVWF DATAM,A
CALL SENDCMD,0
MOVLW 0X00
MOVWF DATAM,A
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
CALL SENDCMD,0
MOVLW 0X95
MOVWF DATAM,A
CALL SENDCMD,0

;Eğer 10 seferde 0x01 alınamazsa komutu yenile--------

CLRF SAYAC
TEKRAR
MOVLW 0XFF
MOVWF DATAM,A
CALL RESPOND,0
MOVLW 0X01
SUBWF DATAM,W,A
BTFSC STATUS,Z,A
GOTO YAK
INCF SAYAC,F,A
MOVLW .10
CPFSEQ SAYAC,A
GOTO TEKRAR
GOTO TEKRAR2

YAK
BSF LED ;Eğer SD Karttan 0x01 Cevabı Gelseydi 
        ;CMD0 Başarılı Olarak Yollanmış Demekti Buna Dair
        ;PORTD ' nin 0. bitindeki Led Yanacak
GOTO $ ;Sonsuz Döngü


;-----------------------Alt Programlar--------------------
SENDCMD
MOVFF DATAM,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
RETURN

RESPOND
MOVFF DATAM,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
MOVFF SSPBUF,DATAM
RETURN

END


Alıntı YapSD kartı, bilgisayarlarda IDE kablolarının takıldığı IDC konnektör arasına sıkıştırarak kullanıyorum

Artık bende MicroSD adaptöre lehim yapılmış şekilde kullanıyorum.

Arkdaşlar kodları yeniden düzenledim ancak ilginç bir sorun var. Devrede kart takılı olmasa dahi devre CMD0 gitti diyor bunun sebebi ne olabilir?

-Hasan-

Merhaba arkadaşlar; bir süre aradan sonra SD kartlarla uğraşmaya tekrar başladım. ferdem Hocam cevabınız için gerçekten teşekkür ederim, çok faydalı oldu.

Arkadaşlar ferdem Hoca ' nın verdiği bilgilere göre kodlarımı yeniden düzenledim ve ucuz SD kart okuyuculardan bir tane SD kart soketi söktüm, yani artık soketle kullanıyorum. Yukarıda söylediğim sorun artık olmuyor ama bu sefer başka bir sorun var:

Bir image dosyası oluşturup kodlarımı Proteus ' ta denedim ve sorunsuz çalıştı. Ancak kodları gerçek devrede denediğimde karta CMD0 ' ı bile gönderemiyorum. Sorun ne olabilir?



LIST P=18F4620
INCLUDE "P18F4620.INC"

__CONFIG _CONFIG1H, 0X06
__CONFIG _CONFIG2L, 0X00
__CONFIG _CONFIG2H, 0X00
__CONFIG _CONFIG3H, 0X81
__CONFIG _CONFIG4L, 0X80
__CONFIG _CONFIG5L, 0X0F
__CONFIG _CONFIG5H, 0XC0
__CONFIG _CONFIG6L, 0X0F
__CONFIG _CONFIG6H, 0XE0
__CONFIG _CONFIG7L, 0X0F
__CONFIG _CONFIG7H, 0X40

CBLOCK 0
SAYAC
VERI
ENDC

#DEFINE SD_CS LATC,2,A 'CS Pini PORTC,2 de.

CLRF TRISB,A ' PORTB Çıkış

'-------------SPI KUR-----------------
BCF TRISC,2,A
BCF TRISC,3,A
BCF TRISC,5,A
BSF TRISC,4,A

MOVLW 0X40
MOVWF SSPSTAT,A
MOVLW 0X22
MOVWF SSPCON1,A

'-------------------------------------

CLRF LATB,A 'PORTB=0x00

'---------------CMD0 Yolla---------------
CMD0
'-------------80 Clock Yolla--------------
BSF SD_CS

MOVLW 0XFF
MOVWF VERI,A
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER

'------------------------------------------

BCF SD_CS

'-------------CMD0 Başlangıcı--------------
MOVLW 0X40
MOVWF VERI,A
RCALL GONDER

CLRF VERI,A
RCALL GONDER
RCALL GONDER
RCALL GONDER
RCALL GONDER

MOVLW 0X95
MOVWF VERI,A
RCALL GONDER

 'Eğer 10 Defada 0x01 Alınamazsa Komutu Yenile, Alınırsa Ledi Yak

MOVLW .10
MOVWF SAYAC,A
BEKLE
MOVLW 0XFF
MOVWF VERI,A
RCALL RESPONSE
MOVLW 0X01
SUBWF VERI,W,A
BTFSC STATUS,Z,A
BRA TAMAM '0x01 Geldi Ledi Yak
DECFSZ SAYAC,F,A
BRA BEKLE 'Gelmesini Bekle
BRA CMD0 'Komutu Yenile

'---------------------------

'--------------0x01 Gelirse Led Yanacak
TAMAM
BSF SD_CS
MOVLW 0XFF
MOVWF VERI,A
RCALL GONDER
BSF LATB,7,A
BRA $
'-------------------Sonsuz Döngü

'--------------------Alt Programlar-------------------
GONDER
MOVFF VERI,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
RETURN

RESPONSE
MOVFF VERI,SSPBUF
BTFSS SSPSTAT,BF,A
BRA $-2
MOVFF SSPBUF,VERI
RETURN

END

hnez

hasan kardeş çok zaman olmuş
bende asm örneği arıyorum
okuma işlemini yapabildinmi ?. Paylaşırmısın.

RaMu

Neden asm?
Yanlış anlaşılmasın, ben asm ile sd kart çalıştırdım ama
asm ile sd kart kullanacak program yazmak pek iyi bir çaba değil.


Antrakdaki örnek çalışıyordu denediğimde,
yalnız antrak sitesine ulaşamadım yukarıdaki linkden.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hnez

pc den sd karta zazılmış dene.tex dosyasının
18 serisi asm ile yazılmış bir örneğini arıyorum
çook çoook ikrama geçecek

neden asm uzun mesele :)

RaMu

Dediğin aslında asm sd kart okuma ilede bitmiyor,
birde pcden yazılmışı okusun diyorsan bu sefer FAT dosya sisteminide çözmek gerekiyor,
aslında kaçış yoluda var ama ...

Alıntı yapılan: hnez - 19 Ekim 2015, 02:40:10
neden asm uzun mesele :)

Asm ile sd kart da çok çok uzun mesele,
ben dinlerim, anlat istersen.

Tavsiyem C ile yapman,
bilmiyorsan bile, öğrenip C ile yapman,
bilipte asm ile yapmandan daha kısa sürüyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hnez

RaMu hocam
Gerçekden Başka Dil Bilmiyorum

Asm ile yazdığım çok uzun kodlara sahip halen üretmekte olduğum ticari bir projem var ,
bu projeye müşterinin sahada programı güncelleyeceği bir iave yapmak istiyorum.

ama başlıkdaki asm örneğini bende çalıştıramamıştım.

RaMu

Tekrar belirteyim asm ile sd kart fat dosya sistemi dahil çalıştırabilmen için
asm iyi derecede biliyor olduğunu düşünerek
bence en mükemmel koşullarda 1 hafta,
iyi tahmin en az 1 ay,
belki benim gibi 6 ay sürer.

Bu sürede sana yetecek kadar C öğrenip eski projeni C ye dönüştürüp sd kart eklemen daha kolay.
Ki bende benzer bir durumdayken aynı şeyi yaptım,
artık hemen hemen sadece hobi amaçlı asm ye bakıyorum arada.

Benim asm ile çalıştırdığım algoritmayı aşağıdaki linkden inceleyebilirsin,
ayrıca @z hocamızın aynı linkde 16. mesajdaki anlatımı var,
birebir çalışan asm kodlarını hap gibi veremem,
ama Malatya'da isen atolyeme gelebilirsin
asm ile sd kartı çalıştırabileceğin programı nasıl yazacağını adım adım anlatabilirim, ücretsiz,
sadece yazarsan yazdığın örneği forumda paylaşman yeterli.

Aslında sd kartı çalıştırmak bir anlamda kolay,
çok çeşiti olduğundan birkaç sıkıntılı adım olabiliyor,
sadece denediğim sd kartı çalıştırsın yeter dersen işler basitleşebiliyor.

Kolay olan kısım sd kartı init edip, bilinen bir adrese yazma veya bilinen bir adresden okuma.

Şimdi ben pcde yazılanı görmek veya
pic ile yazdığımı pc de görmek istiyorum dediğinde
FAT dosya sistemini kullanmak zorunda kalıyorsun,
buda ayrı bir iş.

Tabi FAT inde kolay yolu var,
en yaygın taktik,
öncelikle pcde sd karta büyükçe bir .txt dosyası açmak,
sonra yine pcde bu açtığımız .txt dosyasının başlangıç adresini bulmak ve
bu başlangıç adresini pic programımızda kerteriz almak.
Bu yöntemde sd karta yeni dosya açamazsın,
eski dosyayı silersen, başlangıç adresinide kaybedersin,
yani sd karta kullanıcı müdahale etmemeli yada çek dikkatli müdahale etmeli.

Başka türlü FAT de dosya başlangıcını bulma vs. (dosyanın devamı nerede...) işlerini öğrenmek gerekiyor.

Bahsettiğim asm de kullandığım algoritma:
https://www.picproje.org/index.php/topic,57594.msg444538.html#msg444538

Bu algoritmayı fatfs ve petitfatfs kütüphanelerinin yazarı elm Chan ın anlatımına göre hazırladım,
microchip, st gibi firmalar bile elm Chan ın kütüphanesini kullanıyorlar,
http://elm-chan.org/docs/mmc/mmc_e.html



Bunlarda CcsC ve mikroC ile hazırladığım örnekler, fikir vermesi açısından:
https://www.picproje.org/index.php/topic,55841.msg428773.html#msg428773
https://www.picproje.org/index.php/topic,54274.msg414146.html#msg414146
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hnez

RaMu hocam
bilgiler için teşekkürler birgün çayı içeriz umarım

Bana sadece Fat dosya sistemi uyuyor demekki
yukarada açıklanan 1. ve 2. metodları işime şu yüzden yaramıyor,

ben müşteriye şu adresdeki güncelle.hex dosyasını mmc karta kopyala ve mmc kartı
güncellenecek devreye tak demek istiyordum.
mmc soketi hariç hiç masraf yok güzeldi :)

Zaman sorunum olmasa  C de yazılmış benzer programı anlaşılır halde ASM ye çevirip
kendi programıma ilave derdim

ama C de yeniden yazmak için  C yi su gibi içer hale gelmeden olmaz
derleycinin tamda benim istediğim gibi derlemesi için sıradan C bilgisi yetmiyor
kulağını başının üstünden göstermek gibi başka on çeşit yolu var
neyse şimdi C ci arkadaşlar kızacak

Peki bu işi yani yukarda anlattığım şekilde adıbelli.hex dosyasını anlaşılır açıklamalı halde
asm de sıradan okuyabileceğim şekilde kodlar minimize edilmiş bir şekilde bir programı ücret karşılığı bana yapabilecek bir arkadaş bulabilirmiyim.

Yada  ben bu işi mmc yerine yeni üreteceğim devrelere  3$ lık Wifi veya bluetooth modülden ilave etsem
ve müşteriye su adresden şu programı cep telefonuna indir ve program seni yönlendirecek
çep telefonundan karta bağlan ve güncelle desem :)

(Sahada internet olmadığını kabul ediyoruz tabi )

yada başka nasıl bir yol izlenir  yardım lazım.

RaMu

#11
Dediğine benzer bir şeyi yapmak için asm sd kart + programlayıcı kısım
programını yazmaya başlamıştım,
ama halen uğraşıp bitiremedim, 2-3 sene olmuş.

Ben pickit2 vb. gibi direk icsp üzerinden pici programlayabilen ama
portatif bir pic programlayıcı yapmaya çalışıyordum.
Sen muhtemelen picin kendi kendinin program hafızasına
yazma özelliğini kullanarak yapmayı düşünüyorsun.
(Girdi yapayım: bu modda konfigürasyon bitlerini değiştiremezsin, yanlışım yoksa.)

Aslında dediğin kodu asm de yazmak bence epey uğraştırır,
güzel bir özellik olur ama attığın taş ürküttüğün kurbağaya değmeli,
yani bu cihazı iyi bir fiyattan satabilmelisin.

Aslında kolay yöntem dediğin gibi bluetooth modül olabilir,
uart modülü ile kullanabiliyorsun, sd karttan çok daha kolay olur.

Veya rs232 ile pcye direk bağlanabilir,
pc programı rs232 üzerinden güncel yazılımı yükler.

Usb olabilir, usb to rs232, usb to uart, usb to ttl çevirici ile
yine picin uart modülünü kullanırsın,
pcden programı güncellersin.

Birde gprs modül kullanıp, gprs üzerinden güncelleme yapılabilir.
Bu maliyetli olur.

Aslında cihazın programını tamamen değiştirmesen daha iyi,
birde cihazın donanımı nasıl ki
tüm programı değiştirip yine aynı donanımla kullanıyorsun,
yani fazla değişiklik yapılabiliyor mu?

Fazla değişiklik yoksa belki başka yöntemlerde düşünülebilir.

İstersen sahadaki cihazın(PIC) yazılımını güncelleme,
diye bir konu aç, uygulamış olanlar var fikir gelir,
tabi asm ile yazdığını belirt,
asmde yapanın pek çıkacağını sanmıyorum ama fikir verir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hnez

Aslında bu iş yapabiliyorum ama hem zaman hem parasını isteyemediğim devre kaybım oluyor.

Aşağıdaki devreyi müşteriye gönderip şu adresdeki programla oradaki son versiyonu gönderdiğim devreye yükle ve devreyi götür güncellenecek karta tak diyorum.

Devrenin usb den okuyup eeprom a atan kısmını bir arkadaş ccs de yazdı
bende visual basic de karta güncel hex dosyasını şifreleyip usb ye gönderiyorum

Kullanıcı güncelleme kartını güncellenecek devreye takınca kartın boot bölümü hariç diğer
kodlar güncellenmiş oluyor , hemde kartın icsp pinlerini  bu iş içinde kullanmış oluyorsun.

Tabi hepsi asm