Witam wszystkich.
Piszę, ponieważ mam spory problem, który dotyczy karty SD. Wiem, że zaglądają tu mądrzy ludzie i będą mi w stanie pomóc. Dodam tylko ,że cały czas się uczę programować
. Mam napisaną obsługę wyświetlacza ze sterownikiem hd44780 i klawiaturę matrycową (qwerty z dodatkowymi polskimi znakami). Niedawno zacząłem zabawę z obsługą karty SD i mam problem przy napisaniu kodu, który poprawnie by ją inicjował i odczytywał z niej konkretne sektory (nie interesuje mnie w tej chwili system plików fat). Dodam również, że chcę tylko odczytywać sektory (zapis nie jest mi potrzebny) i wyświetlić je na LCD [2x16] z powyższym sterownikiem.
Potrzebuje pomocy ludzi, którzy w tym temacie się dużo bardziej orientują ode mnie. Od razu zaznaczam, że nie potrzebuję rad w stylu "weź obsługę karty z działających stron, czy projektów", bo w tym temacie naprawdę dużo przejrzałem.
Potrzebuję odpowiedzi na takie pytania jak:
1. Jak dokładnie sprawdzić, czy moja karta w ogóle się inicjuje?
2. Czy program, który jest napisany w oparciu o informację z różnych stron (głównie captaina) jest poprawny?
3. Jeśli karta się inicjuje, to jak odczytać z niej konkretne sektory?
Dodam, że podłączenie karty (po SPI) sprawdzałem już zarówno z dzielnikami zbudowanymi z rezystorów 3,3[kOhm] i 2,2 [kOhm] jak i bez nich. Napięcie zasilania karty SD stabilizuję na poziomie 3,3 [V] stabilizatorem TS1117.
W sumie mam to wykonane według tego schematu:
Karta,którą chcę obsłużyć to karta microSD wsadzona w adapter SD Kingston 512
Mam na niej zapisane dwa pliki tekstowe pod nazwą:
plik_numer_1 -> w środku jest zapisane: dane.1
plik_numer_2 -> w środku jest zapisane: dane.2
W Winhexie mam tak zapisane sektory:
Mój kod programu:
Jak odczytać sektor pod, którym jest zapisany plik_numer1 i plik_numer1?
Czy ktoś będzie mi w stanie podpowiedzieć jak to zrobić?
Piszę, ponieważ mam spory problem, który dotyczy karty SD. Wiem, że zaglądają tu mądrzy ludzie i będą mi w stanie pomóc. Dodam tylko ,że cały czas się uczę programować
Potrzebuje pomocy ludzi, którzy w tym temacie się dużo bardziej orientują ode mnie. Od razu zaznaczam, że nie potrzebuję rad w stylu "weź obsługę karty z działających stron, czy projektów", bo w tym temacie naprawdę dużo przejrzałem.
Potrzebuję odpowiedzi na takie pytania jak:
1. Jak dokładnie sprawdzić, czy moja karta w ogóle się inicjuje?
2. Czy program, który jest napisany w oparciu o informację z różnych stron (głównie captaina) jest poprawny?
3. Jeśli karta się inicjuje, to jak odczytać z niej konkretne sektory?
Dodam, że podłączenie karty (po SPI) sprawdzałem już zarówno z dzielnikami zbudowanymi z rezystorów 3,3[kOhm] i 2,2 [kOhm] jak i bez nich. Napięcie zasilania karty SD stabilizuję na poziomie 3,3 [V] stabilizatorem TS1117.
W sumie mam to wykonane według tego schematu:
Karta,którą chcę obsłużyć to karta microSD wsadzona w adapter SD Kingston 512
Mam na niej zapisane dwa pliki tekstowe pod nazwą:
plik_numer_1 -> w środku jest zapisane: dane.1
plik_numer_2 -> w środku jest zapisane: dane.2
W Winhexie mam tak zapisane sektory:
Mój kod programu:
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <hd44780.c>
#define SPIDI 5 // Port B bit 5 (pin6): data in (data from SD)
#define SPIDO 6 // Port B bit 6 (pin7): data out (data to SD)
#define SPICLK 7 // Port B bit 7 (pin8): clock
#define SPICS 4 // Port B bit 4 (pin5): chip select for SD
char bufor[512];
char LCD_Linia_1[16];
char LCD_Linia_2[16];
int main(void)
{
LCD_Initalize(); //Inicjalizacja LCD
LCD_Clear();
//====================Inicjalizacja SPI====================//
void SPI_Init(void)
{
cli(); //Wylaczenie przerwan
DDRB &= ~(1 << SPIDI); //Ustawienie DI jako wejście
DDRB |= (1 << SPICLK); //Ustawienie CLK jako wyjście
DDRB |= (1 << SPIDO); //Ustawienie DO jako wyjście
DDRB |= (1 << SPICS); //Ustawienie CS jako wyjście
//Wlaczenie SPI jako Master,
//CLK 8000000/128=62,5kHz, MSB pierwsze
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0)| (1 << SPR1);
PORTB &= ~(1 << SPICS);
sei(); //Wlaczenie przerwan
}
//=========================================================//
//===================Wlaczenie karty SD====================//
void CS_Start(void)
{
PORTB &= ~(_BV(SPICS));
}
//=========================================================//
//===================Wylaczenie karty SD===================//
void CS_Stop(void)
{
PORTB |= (_BV(SPICS));
}
//=========================================================//
//==================Wysylanie przez SPI====================//
char SPI_sendchar(char wiadomosc)
{
unsigned char received;
CS_Start();
SPDR = wiadomosc;
while(!(SPSR & (1<<SPIF)));
received = SPDR;
return (received);
CS_Stop();
}
//=========================================================//
//=============Wysylanie komendy do karty SD===============//
char Command(char cmd, uint16_t ArgH, uint16_t ArgL, char crc )
{
SPI_sendchar(0xFF);
SPI_sendchar(cmd);
SPI_sendchar((uint8_t)(ArgH >> 8));
SPI_sendchar((uint8_t)ArgH);
SPI_sendchar((uint8_t)(ArgL >> 8));
SPI_sendchar((uint8_t)ArgL);
SPI_sendchar(crc);
SPI_sendchar(0xFF);
return SPI_sendchar(0xFF);
}
//=========================================================//
//=================Inicjowanie karty SD====================//
int SD_Init(void)
{
char i;
CS_Stop();
for(i=0; i < 10; i++)
SPI_sendchar(0xFF);
CS_Start();
if (Command(0x40,0,0,0x95) != 1)
goto mmcerror;
st:
if (Command(0x41,0,0,0xFF) !=0)
goto st;
return 1 ;
mmcerror:
return 0 ;
}
int SD_Read(void)
{
int i;
if (Command(0x51,0,512,0xFF) !=0)
{
return 1;
}
CS_Start();
while(SPI_sendchar(0xFF) != (char)0xFE);
for(i=0; i < 512; i++)
{
bufor[1]= SPI_sendchar(0xFF);
}
SPI_sendchar(0xFF);
SPI_sendchar(0xFF);
CS_Stop();
return 0;
}
while(1)
{
LCD_GoTo(0,0);
sprintf(LCD_Linia_1,"bufor=%u ",bufor);
LCD_WriteText(LCD_Linia_1);
_delay_ms(200);
}
}
Jak odczytać sektor pod, którym jest zapisany plik_numer1 i plik_numer1?
Czy ktoś będzie mi w stanie podpowiedzieć jak to zrobić?