Обсуждаем контроллеры компании Atmel.
Ответить

Пт янв 09, 2009 14:45:37

Пожалуйста помогите.
Ни как не могу записать данные на 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 KiB) Скачиваний: 440

Пт янв 09, 2009 19:10:01

Упсс... Нашёл свою ошибку. Не в той последовательности загружал адрес при чтении. Теперь вроде бы всё работает...

Пт янв 09, 2009 21:58:34

защита от записи реализуется в своей программе (в коннекторе контакт замыкается когда язычек передвинут).
а в самой ММС или СД ничего нет тока пластмасска.

Сб июл 11, 2009 16:47:34

А есть у кого нить либа для работы с SD под WinAVR?

Вс июл 12, 2009 08:20:40

вот я тож хотел соеденить диспл от s65 и ММС, только вот массив картинки получаеться, а как его записать напрямую в блоки через кардридер на ПК незнаю?

Вс июл 12, 2009 09:25:05

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

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

Не лучше ли сделать так. организовать минимальные функции по работе с FAT(инициализация,поиск и чтение файла) и писать файлы в виде массива байт(или слов если у вас 16 бит режим). в этом случаем можно файл получаемый на выходе конвертора (h или bin или с файл) писать как есть на карту.
Вложения
mmc.c
набор функций для работы с картой SD/MMC
(7.35 KiB) Скачиваний: 620

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

Вс сен 05, 2010 20:55:33

Привет всем! Мучаю мегу 16 с диспом от s65. Если у кого всё получилось, если можете выложите, пожалуйста, библиотеки/исходники под CodeVisionAVR для работы с FAT-ом. Уже несколько дней роюсь в бескрайних просторах, но никак не могу найти логически завершённой информации.

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

Вс сен 05, 2010 21:33:12

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

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

Вт май 03, 2011 20:59:55

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


Упс. Извиняюсь за некрофилию, не посмотрел на дату.

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

Вт авг 28, 2012 00:10:03

Всем добрый! Подскажите почему я не получаю ответа от 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 KiB) Скачиваний: 184
risunok.GIF
(7.58 KiB) Скачиваний: 572

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

Вт авг 28, 2012 19:16:04

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

все примеры в сети - для старых карт, до 128 мб
моя на 16 мб пишется и читается посекторно
а вот на 1 гб уже только читается
на 4 и выше даже не отвечает

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

Ср сен 12, 2012 21:58:08

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

.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 KiB) Скачиваний: 587

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

Вс сен 23, 2012 22:26:46

Чето непойму,на счет кода 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[i]=SPDR ;
}



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

}
Вложения
Безымянный.GIF
(128.81 KiB) Скачиваний: 527

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

Пн сен 24, 2012 23:38:51

почемуто немогу получить ответ на железе 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);
}

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

Чт сен 27, 2012 17:17:59

Вопрос наконецто у меня проходит CMD0,CMD1 а вот при чтении карты ошибка постоянно выводит FF,в чем причина может я неправильно активировал?

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

Чт сен 27, 2012 20:27:19

спящий писал(а):Вопрос наконецто у меня проходит 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.

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

Чт сен 27, 2012 22:38:50

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

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

куда что нужно вписать(сектора?) читал нефига неразобрался.

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

Пт сен 28, 2012 09:36:10

спящий писал(а):использую 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;
......

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

Пт сен 28, 2012 23:28:52

Карточка начала отвечать,но где найти мне мои 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 KiB) Скачиваний: 511

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

Сб сен 29, 2012 12:51:58

спящий писал(а):Карточка начала отвечать,но где найти мне мои 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 байта).
Ответить