Страница 1 из 1

Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 13:14:07
andreysadda
Всем привет, несколько дней ползаю по просторам интернета в поиске информации по тому, как считывать данные с SD карты.
Перепробовал кучу возможных вариантов реализации функций для инициализации и чтения, но ничего не получается.
Код пишу в Atmel Studio (AVR) и это принципиально. Проверяю работу программы в Proteus-е.
Проблема заключается в том, что функция ReadByte всегда возвращает 0xFF, хотя данные в образе MMC лежат другие. Есть подозрения, что я криво подключил карту к микропроцессору, потому что при запуске программы, даже если какой-нибудь из контактов оборван или MMC карта вынута из гнезда, функция всё равно возвращает 0xFF (как и при моём подключении).
Для проверки юзаю LCD экран.
Собсна, схему и программный код прикрепляю ниже.

Код:
Спойлер

Код: Выделить всё

#define F_CPU 1000000UL

#define SPI_SS     4
#define SPI_MOSI   5
#define SPI_MISO   6
#define SPI_SCK    7

#include <avr/io.h>
#include <util/delay.h>

void InitSPI(void)
{
	DDRB = (1<<PB4)|(1<<PB5) | (1<<PB7);
	SPCR = ( (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0)); 
}

char ReadByteSPI(char addr)
{
	SPDR = addr;					
	while(!(SPSR & (1<<SPIF)));
	addr=SPDR;
	return addr;
}

int main(void)
{
    InitSPI();

    while (1)
    {
		_delay_ms(100);
		lcs_disp(ReadByteSPI(0x00));
    }
}
Схема:
СпойлерИзображение

Re: Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 14:57:36
Z_h_e
Во первых Вам надо более внимательно ознакомится с SPI. Регистр SPDR это циклический сдвиговый регистр. Т.е. отправляя что-то, в него тут же что-то принимается.
Даже если предположить что адрес флешки адресуется одним байтом. То отправив адрес, флешка еще ничего не отправляла назад и рано читать SPDR. Флеш отправит данные потом, но так как она слейв, то ей нужна тактовая частота. Чтобы она пошла, надо что-то еще отправить. Т.е. после адреса, вы опять кладете что-то в SPDR и только после этого можно что-то прочитать.

Я со флешкой такой не работал, протокол ее не знаю. Приходилось рабатать с AT25. Протокол приблизително такой. Мастер дает спад на линии CS. Затем отправляет команду, затем трехбайтный адрес и только после этого чтение. И как я уже сказал, чтобы прочитать байт, надо байт отправить.

В настройках не забыть про CPOL и CPHA и младшим или старшим битом вперед байт.

Добавлено after 2 minutes 12 seconds:
Вот, что-то подобное.
СпойлерИзображение
Согласно этой диаграмме, чтобы прочитать один байт, нужно четыре раза положить что-то в SPDR и только потом прочесть один байт.

Добавлено after 6 minutes 26 seconds:
Z_h_e писал(а):чтобы прочитать один байт, нужно четыре раза положить
Вернее 5.

Re: Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 15:13:45
ARV
Наиболее разумное решение - использовать библиотеку работы с SD/ММС-картами от Chan-а. гуглится сразу.

Re: Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 15:20:34
Z_h_e
А по-мне для обучения и понимания, чужой код без вникания самое не разумное. А если вникать досконально, то на это потратишь не меньше времени, чем на свой код.

Re: Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 15:36:47
ARV
Z_h_e писал(а):для обучения и понимания, чужой код без вникания самое не разумное
позвольте с вами не согласиться. но спорить не буду

Re: Чтение с SD карты в режиме SPI (atmega16)

Добавлено: Пн сен 18, 2017 15:49:43
Oxford
Посмотрите тут мой драйвер http://radiokot.ru/forum/viewtopic.php?f=59&t=91454
Возможно поможет что-то понять вам.