Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Подскажите. Подключил SD карту к AVR.

Отправлено PREMIER 28 февраля 2008 г. 08:27


Взял кусок кода для ММС. Инициализацию карта вроде проходит (CMD0, CMD1, CMD16), даже что-то читает, но с адресов >10000. C адреса < 10000 зависает( FE не приходит от карты, прут FF). То что читает не соответствует действительности. Вся система запитана от 3.3В.
Пробовал инициализировать по другому (CMD0,CMD55,CMD41,CMD16), CMD16 не проходит. Карта 32МБ SANDISK. Из-за чего?

unsigned char sd_init()
{
unsigned char response;
unsigned int i;

configure_pin_mosi();
configure_pin_sck();
configure_pin_ss();
configure_pin_miso();

unselect_card();

SPCR = 0x53;
SPSR = 0x00;

for(i = 0; i < 10; ++i) spi(0xff);

select_card();

for(i = 0; ; ++i)
{
response = sd_send_command_r1(CMD_GO_IDLE_STATE,0);
if(response == (1<<R1_IDLE_STATE)) break;
if(i == 0x1ff)
{
unselect_card();
return 0;
}
}
for(i = 0; ; ++i)
{
response = sd_send_command_r1(CMD_SEND_OP_COND,0);
if(!(response & (1<<R1_IDLE_STATE))) break;
if(i == 0x7fff)
{
unselect_card();
return 0;
}
}

/*Äëÿ SD Card
for(i = 0; ; ++i)
{
response = sd_send_command_r1(CMD_APP_CMD,0);
if(response == (1<<R1_IDLE_STATE)) break;
if(i == 0x1ff)
{
unselect_card();
return 0;
}
}putsf("3com");
for(i = 0; ; ++i)
{
response = sd_send_command_r1(CMD_APP_SEND_OP_COND,0);
if(response == (1<<R1_IDLE_STATE)) break;
if(i == 0x1ff)
{
unselect_card();
return 0;
}
}
Äëÿ SD Card*/
if(sd_send_command_r1(CMD_SET_BLOCKLEN,512))
{
unselect_card();
return 0;
}
unselect_card();

SPCR = 0x50;
SPSR = 0x01;

return 1;
}

unsigned char sd_send_command_r1(unsigned char command, unsigned long int arg)
{
unsigned char response,i;
spi(0xff);
spi(0x40 | command);
spi((arg >> 24) & 0xff);
spi((arg >> 16) & 0xff);
spi((arg >> 8) & 0xff);
spi((arg >> 0) & 0xff);
spi(command == CMD_GO_IDLE_STATE ? 0x95 : 0xff);

for(i = 0; i < 10; ++i)
{
response = spi(0xff);
if(response != 0xff) break;
}
return response;
}
unsigned char read_data(unsigned long int adress, char* buffer)
{
char c;
unsigned long int block_adress;
unsigned int i;
block_adress = adress & 0xfffffe00;
select_card();
if(sd_send_command_r1(CMD_READ_SINGLE_BLOCK, block_adress))
{
unselect_card();
return 0;
}
while(1)
{
if (spi(0xff) == 0xfe)break;
};
for(i = 0; i < 512; ++i) {
c = spi(0xff);
//*buffer++ = c;
putchar(c);
};
spi(0xff);
spi(0xff);
unselect_card();
spi(0xff);
return 1;
}
void main(void)
{
unsigned char buffer[5], data[512];
unsigned long int argument;
//unsigned char response;

/* we will just use ordinary idle mode */
//set_sleep_mode(SLEEP_MODE_IDLE);

/* setup uart */
uart_init();

/* setup sd card slot */
if(!sd_init())
{
putsf("error initialization card");
}

/* provide a simple shell */

while(1)
{
/* print prompt */
putchar('>');
putchar(' ');

/* read command */
gets(buffer, sizeof(buffer));
if(buffer[0]<1)
continue;


/* argument = buffer[1];
argument <<= 8;
argument += buffer[2];
argument <<= 8;
argument += buffer[3];
argument <<= 8;
argument += buffer[4];

if(buffer[0] == (0x40|CMD_SET_BLOCKLEN))
{
select_card();
response = sd_send_command_r1(CMD_SET_BLOCKLEN, argument);
unselect_card();
putchar(response);
}else if(buffer[0] == (0x40|CMD_READ_SINGLE_BLOCK))
{
read_data(argument, data);
//puts(data);
}; */
argument = 0x00010000;
read_data(argument, data);
}
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 90:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru