Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.08.2012, 11:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Mega32+SD
Не нашёл у автора установку размера блока CMD16(SET_BLOCKLEN), он определённо уверен, что бывает только 512 байт.
А это вообще шедеврально
Код:
|
171. temp=spi_receive();
172. if ((temp&0x05)!=0x05) return 6; //Выйти, если данные не приняты |
т.е. всё хорошо будет в двух случаях:
Data Response Token =
'00101' - Data accepted.
'01101' - Data Rejected due to a Write Error
Forusfut, посмотрите, что в temp на самом деле приходит.
Последний раз редактировалось AJScorp; 27.08.2012 в 11:25.
|
|
|
|
27.08.2012, 12:08
|
|
Прописка
Регистрация: 16.02.2008
Адрес: Россия, Омск
Сообщений: 202
Сказал спасибо: 115
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega32+SD
Forusfut
Это с примера используемого Вами:
Рассмотрим процесс инициализации карты памяти командами CMD0,CMD1. Сперва, при высоком уровне на выводах CS и DI подаем 80 тактовых импульсов на вывод CLK. Далее на все время работы с картой сажаем CS на землю, подаем команду CMD0, контрольная сумма для которой равнa 0x95 (контрольная сумма в нашем случае нужна только для команды CMD0, в остальных случаях она не проверяется, поэтому все время будем использовать 0х95 как контрольную сумму). Далее, после байтовой паузы, карточка должна ответить 0х01, что означает, что она вошла в SPI режим и готова принимать команды. Теперь подаем команды CMD1, и после паузы ожидаем от карточки ответа 0х00, которые говорит о том, что карта готова к обмену данными.
А вот это кусок кода, не тут ли собака зарыта, мне это тоже интересно, почитал, не смог связать описание инициализации вот с этими кусками, поправьте люди добрые:
Цитата:
|
//Программа передачи байта карте SD|MMC
void spi_transmit (unsigned char data)
{
unsigned char i;
for (i=0;i‹8;i++) //Цикл перебора битов отправляемого байта
{
if ((data&0x80)==0x00) //Если все данные переданы
PORTB&=~_BV(DI); //Выставить бит данных
else
PORTB|=_BV(DI);
data=data‹‹1;
PORTB|=_BV(CLK); //Импульс
asm("nop"); //Пауза в 1 такт
PORTB&=~_BV(CLK);
}
}
unsigned char sd_card_init(void)
{ unsigned char i,temp;
long int count;
if ((PINB&_BV(INS))!=0x00) return 1; //Проверка карты в слоту
for (i=0;i‹10;i++) //80 импульсов
spi_transmit (0xff);
PORTB&=~_BV(CS); //CS опустить
temp=sd_cmd (0x40,0x00,0x00,0x00,0x00,0x95); //CMD0
if (temp!=0x01) return 3; //Выйти, если ответ не 0х01
spi_transmit (0xff);
count=0;
do{
temp=sd_cmd (0x41,0x00,0x00,0x00,0x00,0x95); //CMD1
spi_transmit (0xff);
count=count+1;
} while ( (temp!=0x00)&&(count‹0xffff) ); //Ждем 0x01 ответа R1
if (count›=0xffff) return 4;
return 0;
}
|
|
|
|
|
27.08.2012, 12:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Mega32+SD
Сообщение от gres_go
|
не смог связать описание инициализации вот с этими кусками
|
Что именно смущает?
Простейшая инициализация, подходит для MMC и SD v1.x. SD v2.0 и SDHC работать не будут.
|
|
|
|
27.08.2012, 12:44
|
|
Прописка
Регистрация: 16.02.2008
Адрес: Россия, Омск
Сообщений: 202
Сказал спасибо: 115
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega32+SD
Сообщение от AJScorp
|
Что именно смущает?
|
Вот это смущает, я слаб в СИ. но все же:
Код:
|
for (i=0;i‹10;i++) //80 импульсов
spi_transmit (0xff); |
|
|
|
|
27.08.2012, 12:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Mega32+SD
for (i=0;i‹10;i++) spi_transmit (0xff); //80 импульсов
Можно и так написать, работать одинаково будет.
|
|
|
|
27.08.2012, 12:52
|
|
Прописка
Регистрация: 16.02.2008
Адрес: Россия, Омск
Сообщений: 202
Сказал спасибо: 115
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega32+SD
Сообщение от AJScorp
|
Можно и так написать, работать одинаково будет.
|
Я не об этом, в цикле 10 раз выполняется передача 255, где 80 импульсов?
Извините, видимо я чего то не догоняю совсем, поясните пожалуйста
|
|
|
|
27.08.2012, 13:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Mega32+SD
10 байт х 8 бит = 80 тактовых импульсов на вывод CLK.
PORTB|=_BV(CLK); //Импульс
asm("nop"); //Пауза в 1 такт
PORTB&=~_BV(CLK);
|
|
|
Сказали "Спасибо" AJScorp
|
|
|
27.08.2012, 13:02
|
|
Прописка
Регистрация: 16.02.2008
Адрес: Россия, Омск
Сообщений: 202
Сказал спасибо: 115
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega32+SD
ООО, понял, вот он тик:
Код:
|
PORTB|=_BV(CLK); //Импульс
asm("nop"); //Пауза в 1 такт
PORTB&=~_BV(CLK); |
И выполняется он 10 раз по 8, тока непонятно зачем так мутно все...
Цикл 80 раз, в цикле бит установить в единицу и после нопа инвертировать его...
|
|
|
|
27.08.2012, 13:03
|
|
Прописка
Регистрация: 16.02.2008
Адрес: Россия, Омск
Сообщений: 202
Сказал спасибо: 115
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega32+SD
AJScorp
Спасибо большое, одновременно написали
|
|
|
|
27.08.2012, 15:26
|
|
Частый гость
Регистрация: 25.08.2012
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Mega32+SD
Сообщение от Алекс Василич
|
В контроллере есть аппаратный SPI, зачем себе жизнь усложнять программной эмуляцией, как делал автор той статьи?
|
При встрече спрошу Другого более внятного и для того, чтобы начать примера не нашёл, вот с этой статьёй и учусь. Куча народа же написало, что всё работает. Далее на том сайте у этого же автора примеры и с файловой системой FatFs от мистера ChaN. Эти примеры у меня тоже не работают. Пока так. Буду дальше пробовать и искать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:30.
|
|