AVR + MMC не могу соединить

Обсуждаем контроллеры компании Atmel.
pirotehnick
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж
Контактная информация:

Сообщение pirotehnick »

Пожалуйста помогите.
Ни как не могу записать данные на SD Card и MMC.
Инициализация и чтение работают нормально, а вот запись не получается.
При записи карта выдаёт ответ об удачной записи, однако реально данные не записываются, т.е. содержимое памяти не изменятеся.
Даже когда я заблокировал SD Card от записи, передвинув защёлку, карта всё равно выдала ответ об удачной записи, но как и в другом случае, память не была модифицирована.

Инфу брал отсюда:

http://piclist.ru/S-64MMC-PIC-RUS/S-64MMC-PIC-RUS.html

См. исходники моей тестовой проги

Команда о записи передаётся через USART.
Вызывается подпрограмма USART_COMMAND_MMC_WRITE, которая вызывает подпрограмму MMC_Write.
Вложения
spi_test.rar
(43.24 КБ) 456 скачиваний
Реклама
pirotehnick
Потрогал лапой паяльник
Сообщения: 327
Зарегистрирован: Пт фев 08, 2008 13:46:03
Откуда: Воронеж
Контактная информация:

Сообщение pirotehnick »

Упсс... Нашёл свою ошибку. Не в той последовательности загружал адрес при чтении. Теперь вроде бы всё работает...
Реклама
Fighter
Встал на лапы
Сообщения: 94
Зарегистрирован: Ср авг 01, 2007 13:32:33

Сообщение Fighter »

защита от записи реализуется в своей программе (в коннекторе контакт замыкается когда язычек передвинут).
а в самой ММС или СД ничего нет тока пластмасска.
Аватара пользователя
br.misha
Родился
Сообщения: 12
Зарегистрирован: Пн мар 31, 2008 13:23:08
Контактная информация:

Сообщение br.misha »

А есть у кого нить либа для работы с SD под WinAVR?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

вот я тож хотел соеденить диспл от s65 и ММС, только вот массив картинки получаеться, а как его записать напрямую в блоки через кардридер на ПК незнаю?
Изображение
Реклама
Аватара пользователя
Antibiotic
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт авг 01, 2008 08:43:08

Сообщение Antibiotic »

через кардридер без использования FAT никак не получится.. если только Вы не напишете драйвер который будет работать с кард-ридером напрямую как с железкой,минуя драйвера винды. ИМХО

Народ делает на меге софт USB и через этот девайс пишет карты.но опять же нужно дрова и софт для этого девайса.

Не лучше ли сделать так. организовать минимальные функции по работе с FAT(инициализация,поиск и чтение файла) и писать файлы в виде массива байт(или слов если у вас 16 бит режим). в этом случаем можно файл получаемый на выходе конвертора (h или bin или с файл) писать как есть на карту.
Вложения
mmc.c
набор функций для работы с картой SD/MMC
(7.35 КБ) 635 скачиваний
Реклама
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: AVR + MMC не могу соединить

Сообщение ELcat »

Привет всем! Мучаю мегу 16 с диспом от s65. Если у кого всё получилось, если можете выложите, пожалуйста, библиотеки/исходники под CodeVisionAVR для работы с FAT-ом. Уже несколько дней роюсь в бескрайних просторах, но никак не могу найти логически завершённой информации.
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: AVR + MMC не могу соединить

Сообщение ELcat »

И ещё несколько интересующих вопросов: что имеется в виду, когда в опциях форматирования WinXP на выбор даётся FAT и FAT32 (что такое FAT - это FAT12 или FAT16?), что подразумевает фраза "размер кластера стандартный" (это сколько?), чем отличается организация карты отформатированной виндами и допустим мобилкой, размер блока 512+2 байт стандартный для всех SD карт или допустим с 16МБ и 2 ГБ картами работать придётся по разным алгоритмам? Извиняюсь за не скромный вопрос с SDHC кто-нибудь уже пробовал общаться?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: AVR + MMC не могу соединить

Сообщение COKPOWEHEU »

"как его записать напрямую в блоки через кардридер на ПК"
самое простое
# dd if=image.bmp of=/dev/mmcblk0
можно еще пошаманить с параметрами и т.п. но чтобы залить на карту памяти картинку в формате bmp без файловой системы лучше вряд ли что-то есть. Кстати, dd вроде и под винду есть.


Упс. Извиняюсь за некрофилию, не посмотрел на дату.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

Всем добрый! Подскажите почему я не получаю ответа от CMD0?



.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.LISTMAC

.def temp = r16;
.def data = r17;
.def delay = r18;
.def delay1 = r19;
.def DC = R20;

.macro _data ; передача по ISP
ldi temp,@0;
out spdr,temp;
cikl: ;ожидание передачи
in temp,SPSR;
sbrs temp,SPIF;
rjmp cikl;

.endMACRO


ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;

ser temp;
out DDRB,temp;
out DDRD,temp;




ldi temp,0b01010000;Активируем ISP
out spcr,temp;


rjmp init;
zapoln:
ldi delay,0x45;ПРОСТО ЗАДЕРЖКА
ldi delay1,0x02;


loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret
init:


;делаем 75 сигналов на CSK
ldi temp,0b00010000;вырубаем ISP
out spcr,temp;

sbi portB,2;DS = 0
sbi portB,3;DI = 0
clr temp;
viderjka:
sbi portB,5;
nop;
nop;
cbi portB,5
inc temp;
cpi temp,80;
brne viderjka;




;ресерт CMD0
ldi temp,0b01010000;Активируем ISP
out spcr,temp;
cbi portB,2;CS=0

_data 0x40
_data 0x0;
_data 0x0;
_data 0x0;
_data 0x0;
_data 0x95;

proverka:
ldi temp,spdr;
cpi temp,1;
brne proverka;
nop;


;инициализация CMD1
cbi portB,2;CS=0

_data 0x41;
_data 0x00;
_data 0x00;
_data 0x00;
_data 0x00;
_data 0x95;

proverka1:
ldi temp,spdr;
cpi temp,0;
brne proverka1;



start:
nop;
rjmp start;
Вложения
MMC2.rar
(19.04 КБ) 199 скачиваний
risunok.GIF
(7.58 КБ) 589 скачиваний
aleksandr-zh
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Re: AVR + MMC не могу соединить

Сообщение aleksandr-zh »

1. новые карты не поддерживают MMC
2. новые карты (от 4 гб и выше) иначи запускаются

все примеры в сети - для старых карт, до 128 мб
моя на 16 мб пишется и читается посекторно
а вот на 1 гб уже только читается
на 4 и выше даже не отвечает
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

Подскажите правильно я мыслю:

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"


.list
.nolist
.LISTMAC

.def temp = r16;
.def data = r17;
.def delay = r18;
.def delay1 = r19;
.def DC = R20;

.macro _data ; передача по ISP
ldi temp,@0;
out spdr,temp;
cikl: ;ожидание передачи
in temp,SPSR;
sbrs temp,SPIF;
rjmp cikl;

.endMACRO


ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;

ser temp;
out DDRB,temp;
out DDRD,temp;




ldi temp,0b01010000;Активируем ISP
out spcr,temp;


rjmp init;
zapoln:
ldi delay,0x45;
ldi delay1,0x02;


loop:
subi delay,1;
sbci delay1,0;
brcc loop;
ret
init:

;делаем 75 сигналов на CSK
ldi temp,0b00010000;вырубаем ISP
out spcr,temp;

sbi portB,2;DS = 0
sbi portB,3;DI = 0
clr temp;
viderjka:
sbi portB,5;
nop;
nop;
cbi portB,5
inc temp;
cpi temp,80;
brne viderjka;



;ресерт CMD0
ldi temp,0b01010000;Активируем ISP
out spcr,temp;
cbi portB,2;CS=0

_data 0x40;
_data 0x0;
_data 0x0;
_data 0x0;
_data 0x0;
_data 0x95;


_data 0xff;
_data 0xff;
_data 0xff;
_data 0xff;
nop;


;инициализация CMD1
cbi portB,2;CS=0

_data 0x41;
_data 0x00;
_data 0x00;
_data 0x00;
_data 0x00;
_data 0x95;

_data 0xff;
_data 0xff;
_data 0xff;
_data 0xff;



RCALL ZAPOLN
;cmd17
_data 0x52;
_data 0x00;
_data 0x00;
_data 0x00;
_data 0x10;
_data 0x95;

_data 0xff;
_data 0xff;


_data 0xff;
_data 0xff;




start:
_data 0xff;чтение
ldi temp,spdr;сохраняем число в TEMP
rjmp start;




Обьясните на счет,приема данных после отправки команд,я их вижу в ПРОТЕУСЕ после отправки
_data 0xff;
_data 0xff;
а вот считывание,байтов неполучается.
И главное обьясните КАК читать командой cmd17 куда что записывать(адресс в какой байт после команды)?
внизу картинка на ней осцилограмма работы с картой,если у когонить есть работа с MMC в асемблере скинте.
Вложения
Безымянный.GIF
(9.05 КБ) 601 скачивание
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

Чето непойму,на счет кода CMD17,может ктонибудь обьяснить,где мои цифры 123456789? и какие 2 байта CPC?это FF?

по вертуал терминал выдает:

ø @ €)<0,6 FAT12

или

00 02 00 20 F8 06 00 20 00 40 00 20 00 00 00 00
00 00 00 80 00 29 3C 30 2C 36 20 20 20 20 20 20
20 20 20 20 20 46 41 54 31 32 20 20 20 00 00 00
00 00

где тут мои цифры,и код правильный?


Спойлер#define _IO_BITS_DEFINITIONS_
#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>
#include <spi.h>
#define data(x) SPDR=x; while (!( SPSR&(1<<7)));

void main() {
int i,temp;
char array[50] ;
DDRD.2=0;
DDRB=255;
DDRC=255;

// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;




//настройка SPI
SPCR=0b01010000;
SPSR=0x00;

//подаем 74 импульса
PORTB.2=1;
PORTB.3=1;
for(i=0;i<80;i++)
{

data(0xff)
}
PORTB.2=0;
delay_ms(1);


//CMD0

data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);

while (temp!=0x01)
{temp= SPDR;
data(0xff)
}

//CMD1
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
}

//CMD17 чтение байтов
data(0x51);
data(0x00);
data(0x00);
data(0x00);
data(0x10);
data(0x95);

while (temp!=0xfe)
{temp= SPDR;
data(0xff);
}

for (i=0;i<50;i++)
{
data(0xff);
array=SPDR ;
}



for (i=0;i<50;i++)
{
putchar(array);
}

}
Вложения
Безымянный.GIF
(128.81 КБ) 541 скачивание
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

почемуто немогу получить ответ на железе CMD0 ?ответ 00,вместо1.вчем может быть проблема и как ее исправить?

Спойлер#define _IO_BITS_DEFINITIONS_
#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>
#include <spi.h>
#define data(x) SPDR=x; while (!( SPSR&(1<<7)));

void main() {
int i,temp;
char array[100] ;
DDRD.2=0;
DDRB=0b11101111;
DDRC=255;

// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;

// íàñòðîéêà øèì

TCCR1A=0b10000001;
TCCR1B=0b00001001;
TIMSK1=0b01000000;





//íàñòðîéêà SPI
SPCR=0b01010000;
SPSR=0x00;


//ïîäàåì 74 èìïóëüñà
PORTB.2=1;
PORTB.3=1;
for(i=0;i<80;i++)
{

data(0xff)
}
PORTB.2=0;
delay_ms(1);



//CMD0


data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);

while (temp!=0x01)
{temp= SPDR;
data(0xff);
putchar(SPDR);
}
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

Вопрос наконецто у меня проходит CMD0,CMD1 а вот при чтении карты ошибка постоянно выводит FF,в чем причина может я неправильно активировал?
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: AVR + MMC не могу соединить

Сообщение mas123 »

спящий писал(а):Вопрос наконецто у меня проходит CMD0,CMD1 а вот при чтении карты ошибка постоянно выводит FF,в чем причина может я неправильно активировал?
Если ответило на CMD0/1 - значит активировал.
Для SD нужно ещё выдавать APP_CMD и SEND_OP_COND_FOR_SD, а для SDHC - SEND_IF_COND.
Причем, это выдается после GO_IDLE_STATE, но до SEND_OP_COND_FOR_MMC

Хм, у меня более сложное "будилово" карточки, с учетом всех типов. Расскажи какую карточку пытаешь :) MMC / SD / SDHC? Каждую надо будить по своему и определять что за чудо в разъём поставили :)

По чтению командой READ_SINGLE_BLOCK

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

//CMD17 чтение байтов
data(0x51);
data(0x00);
data(0x00);
data(0x00);
data(0x10);
data(0x95);
Ты хочешь прочитать сколько-то байт в секторе 0, со смещения 16?
Для MMC/SD карт размером до 4 Гиг в команды записи/чтения передается адрес с байтах. Т.е. номер сектора умножаем на 512.

После передачи команды READ_SINGLE_BLOCK ждем ответа - читаем SPI, пока не получим ответ (не 0xFF). анализируем ответ .
Если вернуло не START_SBR (0xFE), а вернуло R1_OK (0x00) - снова читаем SPI, пока не будет не 0xFF.
(По докам карта должна ответить R1_OK на команду, а потом выдать START_SBR - мол пошли данные. На практике, некоторые карточки сразу отвечают START_SBR).
А после START_SBR пошли данные и CRC.
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

использую mikroSD на 1 гб,сейчас сделал через переходник(адаптер) - неработает обратно вернул тоже(CMD0 выдает 0) -может быть неправильно активировал,нужно было через ACMD,посоветуйте где можно прочитать или взять даташит?
а вот вы писали READ_SINGLE_BLOCK это имеется ввиду CMD или уже с библиотеке? то что я записал файл на карточку через телефон - невыйдет боком(картридера нет) и последний вопрос

//CMD17 чтение байтов
data(0x51);
data(0x00);
data(0x00);
data(0x00);
data(0x10);
data(0x95);

куда что нужно вписать(сектора?) читал нефига неразобрался.
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: AVR + MMC не могу соединить

Сообщение mas123 »

спящий писал(а):использую mikroSD на 1 гб,сейчас сделал через переходник(адаптер) - неработает обратно вернул тоже(CMD0 выдает 0) -может быть неправильно активировал,нужно было через ACMD,
Я самой первой командой подаю GO_IDLE_STATE, т.е. CMD0. Перед этим выдаю 10 байт 0xFF БЕЗ сигнала CS (CS=1). Т.е. даю 80 тактовых импульсов, чтоб карточка очухалась.
спящий писал(а):посоветуйте где можно прочитать или взять даташит?
Я гуглил по всему инету, так что сейчас не скажу даже где взять. В этих инетах нашел и сырцы библиотек под SD. Тока не под AVR, хотя мне не под неё и нужно было :)
Поищи в направлении ucLinux под Blackfin - там вполне понятно было, можно разобраться.
спящий писал(а):а вот вы писали READ_SINGLE_BLOCK это имеется ввиду CMD или уже с библиотеке?
Это название команды, из доков. Это CMD17
спящий писал(а):то что я записал файл на карточку через телефон - невыйдет боком(картридера нет)
Карточке пофиг кто и как пишет на неё :)
спящий писал(а)://CMD17 чтение байтов
data(0x51);
data(0x00);
data(0x00);
data(0x00);
data(0x10);
data(0x95);
куда что нужно вписать(сектора?) читал нефига неразобрался.
В доке нарисовано же. После байта команды 4 байта аргумента, а данном случае адрес 1-го байта чтения от начала карточки. Записывается, начиная со старшего байта.
Типа такого:
BYTE CDataSD::SendCommandAndWait(BYTE cCommand, UINT nArg, bool bClose)
{
BYTE cSendBuffer[6];
cSendBuffer[0] = 0x40 | cCommand;
cSendBuffer[1] = (nArg >> 24 ) & 0xFF;;
cSendBuffer[2] = (nArg >> 16 ) & 0xFF;
cSendBuffer[3] = (nArg >> 8 ) & 0xFF;
cSendBuffer[4] = nArg & 0xFF;
......
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: AVR + MMC не могу соединить

Сообщение спящий »

Карточка начала отвечать,но где найти мне мои 123456789(a.txt)? как их прочитать?
Попытался схетрить непрерывно начал читать (года найдет 0x31 =1 начнет выдавать на экран) и вот что вышло)

или чтобы найти файл надо изучать FAT,то подскажите с какой ссылки начать?


И чтобы окончательно определиться,я правильно понимаю:

data(0x52);
data(0x00);
data(0x00);
data(0x00);
data(0x01); это читаем первый сектор
data(0x95);

data(0x52);
data(0x00);
data(0x00);
data(0x00);
data(0x10); это читаем 16 сектор
data(0x95);

data(0x52);
data(0x00);
data(0x00);
data(0x01);это читаем 256 сектор
data(0x00);
data(0x95);
Вложения
Безымянный.GIF
(40.4 КБ) 528 скачиваний
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Re: AVR + MMC не могу соединить

Сообщение mas123 »

спящий писал(а):Карточка начала отвечать,но где найти мне мои 123456789(a.txt)? как их прочитать?
Где-где содержимое файла, в кластере! А на кластер указывает описатель файла, а описатель файла лежит в кластере каталога... Короче говоря, ещё тот Кащей Бессмертный получается :)))
спящий писал(а):Попытался схетрить непрерывно начал читать (года найдет 0x31 =1 начнет выдавать на экран) и вот что вышло)
Ещё бы, ты неправильно читаешь.
спящий писал(а):или чтобы найти файл надо изучать FAT,то подскажите с какой ссылки начать?
Вот он какой - бан в Гугле, суровый и беспощадный.
Я только что вбил в Яндексе "работа с mmc картой" и оно выдало КУЧУ интересных ссылок, аж целых 7 млн. Там и примеры работы с картой, и ссылки на даташиты по картам. И описание FAT, даже на русском....

"SD/MMC карта памяти и микроконтроллер AVR (часть 1) Базовые операции." http://avrlab.com/node/156
"Описание алгоритма с примерами для работы с картами SD/MMC" http://www.mindrunway.ru/MSFat.html
"MMC, SD и другие карты памяти" http://www.piclist.ru/mmc.html
"Звонок с MMC/SD картой памяти" http://radiokot.ru/circuit/digital/home/39/
Последняя ссылка показательна - лежит прямо ТУТ :))
спящий писал(а):И чтобы окончательно определиться,я правильно понимаю:
data(0x52);
data(0x00);
data(0x00);
data(0x00);
data(0x01); это читаем первый сектор
data(0x95);
Конечно НЕТ. Я говорил уже : Для MMC/SD карт размером до 4 Гиг в команды записи/чтения передается адрес в байтах. Т.е. номер сектора умножаем на 512.

Да, и после команды чтения сектора обязательно вычитать ВЕСЬ сектор (т.е. 512 + 2 байта).
Ответить

Вернуться в «AVR»