Страница 1 из 3
Инициализация SD карты+Atmega128a
Добавлено: Пт фев 01, 2013 20:55:23
nikityan
Добрый лень уважаемые форумчане. Столкнулся с глобальной на моё мнение проблемой. Необходимо инициализировать карточку MicroSD, которая стоит на борту Atmega128a, и подключена к выводам на порте B MOSI, MISO, CLK соответственно. В качестве CS задействован вывод SS (Порт B0). Работать с SPI аппаратно у меня не получается, перерыл кучу исходников. Задумался эмулировать SPI програмно, пока не знаю. Мне нужен проверенный рабочий код инициализации MicroSD карточки желательно под IAR компилятор. Очень буду признателен за помошь. Кто то наверняка пробовал работать с карточкой. Спасибо!
Re: Инициализация SD карты+Atmega128a
Добавлено: Сб фев 02, 2013 16:04:25
Триод
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 03, 2013 00:11:27
nikityan
О, спасибо, буду разбираться
Re: Инициализация SD карты+Atmega128a
Добавлено: Вт фев 05, 2013 23:46:46
nikityan
Примеры сложные. Можно пару своих проверенных примеров? Меня инициализация интересует и посылка команд.
Re: Инициализация SD карты+Atmega128a
Добавлено: Ср фев 06, 2013 00:39:07
спящий
Вот я делал на мега 48 давно.
Красным цветом инициализация: Подача 74 импульса,потом CMD0(0x40,0,0,0,0,0xff),потом CMD0(0x41,0,0,0,0,0xff)
Команда состоит из 6 отправленных байтов в скопках.
Чтение секторов CMD18 в буфер.
Спойлер
#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;
int b;
char array[100] ;
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);
putchar('a');
while(1){
//CMD0
data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
data(0xFF);
b=SPDR;
if(b==0x01){break; }
}
putchar('b');
//CMD1
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
}
//CMD17 чтение байтов
data(0x52);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0xfe)
{temp= SPDR;
data(0xff);
}
while(1){
for (i=0;i<100;i++)
{
data(0xff);
array=SPDR ;
}
for (i=0;i<100;i++)
{
putchar(array);
}
}
}
Re: Инициализация SD карты+Atmega128a
Добавлено: Ср фев 06, 2013 08:41:43
nikityan
Спасибо) А можете пару библиотек кинуть которые в проэкте есть? А то мне ешё нужна процедура передачи команд.
Re: Инициализация SD карты+Atmega128a
Добавлено: Чт фев 07, 2013 00:36:19
nikityan
Ситуация такова:
У меня объявлены ножки МК которые будут принимать участие в работе с MicroSD.
Обозвал их так:
Спойлер
#define SDCLK 1
#define SDDO 3
#define SDCS 0
#define SDDI 2
Теперь мне просто нужно инициализировать карточку.
Дрыгаю портами (не доделано)
Спойлер
PORTB |= (1<<SDDO)|(1<<SDDI)|(1<<SDCS);
DDRB |= (1<<SDCLK)|(1<<SDDO)|(1<<SDCS);
После того как подрыгаю портами и подам 74 импульса, мне нужно передавать команды, которые дадут мне нужный результат.
Так как в Си я только начинающий прошу очень написать мне процедурку отправки команды\данных.
Ноги у меня указаны, нужно только сделать процедуру которая по ним будет отпралять команды\данные.
Помогите пожалуйста начинающему) Спасибо)
Re: Инициализация SD карты+Atmega128a
Добавлено: Чт фев 07, 2013 19:42:34
спящий
#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>
#include <spi.h>
это все стандартные библиотеки в Коде висион.Щас перешол на STM32 коде висиона нет.
data(x) -это отправка команд.
#define data(x) SPDR=x; while (!( SPSR&(1<<7)));
temp= SPDR; это принятие ответа,но чтобы ее получить нужно отправить 0xFF data(0xff)
вот отправляем CMD1 и проверяем ответ
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
}
обычно ответ приходил на 3 раз отправки 0xff
Спойлер
//CMD17 чтение байтов читает по 512 байт
data(0x52); или CMD18 непрерывно читает
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
Re: Инициализация SD карты+Atmega128a
Добавлено: Сб фев 09, 2013 17:51:09
nikityan
Не получается инициализация
Спойлер
void MMC_Init(void)
{
DDRB = (1<<SDDI)|(1<<SDCLK)|(1<<SDCS)|(0<<SDDO);
PORTB = (1<<SDDI)|(1<<SDCLK)|(1<<SDCS)|(1<<SDDO);
SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);
SPSR = (0x00);
for(i=0;i<80;i++)
{
data(0xff)
}
PORTB&=(~(1<<SDCS));
__delay_cycles(4000);
while(1){
//CMD0
data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
data(0xFF);
b=SPDR;
if(b==0x01){break; }
}
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
nlcd_Text("SD готова!...",20,5,BLUE,BLACK);
}
}
Re: Инициализация SD карты+Atmega128a
Добавлено: Сб фев 09, 2013 20:43:27
спящий
попробуй заменить
data(0xFF);
b=SPDR;
if(b==0x01){break; }
}
на просото ответ несразу приходит,и после каждой команды выводи число на экран чтобы найти ошибку,и сказать на какой команде косячит
putchar(temp);
while (temp!=0x01)
{temp= SPDR;
data(0xff)}
если непоможит настраивай SPI и проверь правильность подключения(я перепутал MISO и MOSI при подключении)
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 10, 2013 07:42:46
zero648
nikityan писал(а):Не получается инициализация
В С не силен, но мне кажется команда сброса в цикле крутится, её на до один раз отправить, а потом отправлять в цикле 0xFF и ждать ответа 0x01, потом команда инициализации
//CMD0
data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while(1){
data(0xFF);
b=SPDR;
if(b==0x01){break; }
}
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
nlcd_Text("SD готова!...",20,5,BLUE,BLACK);
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 10, 2013 15:07:03
nikityan
Ещё как силён) Спасибо помогли вы мне! Первый цикл проходит удачно. Второй тоже проходит но не выдаёт результата на экран, но если while (temp!=0x01) вместо 0x00 то результат есть и цикл заканчивается. Тоесть я могу работать дальше. Если флешки нет то циклы не прекрашаються следовательно всё виснет. Вообшем я убидился что он видит флешку) Естественно я хочу ститать wav файл простейшим образом и вывести звук. Есть у кого примерчики?
Спойлер
//CMD0
data(0x40);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while(1){
data(0xFF);
b=SPDR;
if(b==0x01){break; }
}
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp!=0x00)
{temp= SPDR;
data(0xff)
nlcd_Text("SD готова!...",20,5,BLUE,BLACK);
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 10, 2013 19:05:11
zero648
После CMD0 нужно сделать паузу в несколько милисекунд пока карта просыпается, ответ 0х01 говорит о том, что карта еще не проснулась. После паузы запускать команду инициализации CMD1 и ответом тогда будет 0х00, дальше можно без пауз отправлять команды.
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 10, 2013 22:20:24
nikityan
Тогда для проверки правильного ответа 0x00 я сделал вот так:
//CMD1
data(0x41);
data(0x00);
data(0x00);
data(0x00);
data(0x00);
data(0x95);
while (temp==0x00)
{temp= SPDR;
data(0xff)
nlcd_Text("SD готова!",20,5,RED,BLACK);
}
В cmd0 мы принимаем 0x01, что говорит о том что флешка жива но не проснулась, после окончания цикла мы передаём CMD1 и отлавливаем 0x00 как сделал я. Работает, пишет на экране что флешка готова значит принял ответ.
Есть один вопрос: было while (temp!=0x01) я поменял на while (temp==0x00) это правильно?
Re: Инициализация SD карты+Atmega128a
Добавлено: Вс фев 10, 2013 23:09:26
zero648
nikityan писал(а):
Есть один вопрос: было while (temp!=0x01) я поменял на while (temp==0x00) это правильно?
Я, понимаю, крутимся в цикле пока temp=0? Но так получается сразу вылетаем, потому что первый ответ будет 0xFF. Чтобы проверить, нужно вывести на экран ответ от карты, тогда будет понятно с каким кодом выходим из цикла.
Re: Инициализация SD карты+Atmega128a
Добавлено: Пн фев 11, 2013 00:32:12
nikityan
На экран не выходит. Я не знаю как выводить значения типа 0х00 как текст.
s=(char*)b;
if(b==0x01){
s=(char*)b;
nlcd_Text(s,20,5,BLUE,BLACK);
пробовал так не выводит
Re: Инициализация SD карты+Atmega128a
Добавлено: Пн фев 11, 2013 05:27:35
zero648
Выведи как десятичное, вроде как то так:
printf(“Ответ: %d\n”,temp);
Re: Инициализация SD карты+Atmega128a
Добавлено: Пн фев 11, 2013 08:22:14
nikityan
После посылки CMD0 какой ответ нужно получить?
Re: Инициализация SD карты+Atmega128a
Добавлено: Пн фев 11, 2013 11:00:44
zero648
nikityan писал(а):После посылки CMD0 какой ответ нужно получить?
должно быть 0x01
Re: Инициализация SD карты+Atmega128a
Добавлено: Пн фев 11, 2013 23:25:57
nikityan
Простите за глупый вопрос: но чем на языке отличается == и != ?
И какой ответ должен быть уже после CMD1?
p.s. с выводом значений не получается(вылазят кракозябры).
После CMD0 получаю как надо 0x01