Вот кусочек
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено diper 04 февраля 2004 г. 14:05
В ответ на: MMC (Multimedia Card) проблема с чтением записью отправлено Paul_Sh 04 февраля 2004 г. 12:30

у моей карты почемуто
параметр MMC_TIME_DATA_MIN
не соответствует даташиту

/* Временные характеристики карты *********************************************/
#define MMC_TIME_CARD_SELECT 0 // CS минимальное задержка между выбором карты и командой
#define MMC_TIME_CARD_RELEASE 0 // EC минимальное задержка между ответом и отпусканием карты
#define MMC_TIME_CARD_DESELECTED 0 // DS минимальное время для нахождения в отпущенном сотоянии
#define MMC_TIME_DATA_MIN 0 // ????(pdf==1)AC мин задержка между ответом и началом данных
#define MMC_TIME_DATA_TIMEOUT 100 // ?????AC тайм аут данных
#define MMC_TIME_RESPOSE_MIN 1 // CR мин задержка между командой и ответом
#define MMC_TIME_RESPOSE_TIMEOUT 8 // CR тайм аут ответа
#define MMC_TIME_NEW_COMMAND 1 // RC минимальная задержка между ответом и новой командой
#define MMC_TIME_CSD_MIN 0 // CX мин задержка между ответом и началом данных CSD
#define MMC_TIME_CSD_TIMEOUT 8 // CX тайм аут данных CSD
#define MMC_TIME_DATA_WRITE 1 // WR мин задержка между ответом и началом записываеммых данных
#define MMC_TIME_WRITE_BREAK 1 // BR задержка между командой переывания записи и переходом в состояние BUSY
#define MMC_TIME_WRITE_TIMEOUT 200 // ???? Тайм аут записи


/* Команды для карты (если карты не поддерживает какую нето команду то в шею ее) */
#define MMC_CMD_GO_IDLE_STATE 0 // Перезапуск карты
#define MMC_CMD_SEND_OP_COND 1 // Инициализация карты
#define MMC_CMD_SEND_STATUS 13 // Чтение статуса карты
#define MMC_CMD_SET_BLOCK_LEN 16 // Установка длины блока
#define MMC_CMD_READ_BLOCK 17 // Чтение блока
#define MMC_CMD_WRITE_BLOCK 24 // Запись блока
#define MMC_CMD_CRC_ON_OFF 59 // Включение/выключение контроля CRC

#define MMC_TRANSMIT_MASK 0x40

/* Назначение битов response **************************************************/
#define MMC_RESPONSE_IDLE_STATE BIT0 // In idle state: The card is in idle state and running the initializing process.
#define MMC_RESPONSE_ERASE_RESET BIT1 // Erase reset: An erase sequence was cleared before executing because an out of erase sequence command was received.
#define MMC_RESPONSE_ILLEGAL_CMD BIT2 // Illegal command: An illegal command code was detected.
#define MMC_RESPONSE_CRC_EEROR BIT3 // Communication CRC error: The CRC check of the last command failed.
#define MMC_RESPONSE_ERASE_SEQ_ERR BIT4 // Erase sequence error: An error in the sequence of erase commands occurred.
#define MMC_RESPONSE_ADDRESS_ERR BIT5 // Address error: A misaligned address, which did not match the block length, was used in the command.
#define MMC_RESPONSE_PARAM_ERR BIT6 // Parameter error: The command's argument (e.g. address, block length) was out of the allowed range for this card.
#define MMC_RESPONSE_FLAG BIT7 // Флаг что это response

//Data Token Head
#define MMC_DATA_TOKEN_HEAD 0xFE

/* Назначение битов в Data Error Token ****************************************/
#define MMC_DATA_ERROR_TOKEN_ERROR BIT0 // Ошибка
#define MMC_DATA_ERROR_TOKEN_CONTROLLER BIT1 // Внутренняя ошибка контроллера
#define MMC_DATA_ERROR_TOKEN_ECC BIT2 // ошибка данных на карте, попытка восстановления не удалась
#define MMC_DATA_ERROR_TOKEN_OUT_RANGE BIT3 // параметр команды вышел за пределы
#define MMC_DATA_ERROR_TOKEN_LOCKED BIT4 // карта заблокирована

/* Назначение битов возвращаемых после команды выдачи статуса *****************/
#define MMC_STATUS_LOCKED BIT0
#define MMC_STATUS_L_UL_FAILED BIT1
#define MMC_STATUS_ERROR BIT2
#define MMC_STATUS_CONTROLLER_ERR BIT3
#define MMC_STATUS_ECC_FAILED BIT4
#define MMC_STATUS_WP BIT5
#define MMC_STATUS_ERASE_PARAM BIT6
#define MMC_STATUS_OUT_RANGE BIT7
#define MMC_STATUS_IDLE BIT0
#define MMC_STATUS_ERASE_RESET BIT1
#define MMC_STATUS_ILLEGAL_CMD BIT2
#define MMC_STATUS_CRC_ERROR BIT3
#define MMC_STATUS_ERASE_SEQ BIT4
#define MMC_STATUS_ADDRESS BIT5
#define MMC_STATUS_PARAM BIT6
#define MMC_STATUS_FLAG BIT7

// Макрос задержки на VAR байтов
#define MMCDelay(VAR) for(i=0;i/* Глобальные переменные ******************************************************/
uchar MMCError; // Код последней ошибки для интерфейса верхнего уровня

uchar MMCReadSector(uchar *buf,ulong sector){
uint i;
uchar c;
#ifndef MMC_SPI_NO_INIT
SPIInit(MMC_SPI_MODE,MMC_SPI_BAUD_RATE);
#endif
SPISelectSlave(SPI_SLAVE_MMC);

MMCDelay(MMC_TIME_NEW_COMMAND);

//Комнда "чтение"
MMCCommand(MMC_CMD_READ_BLOCK,sector<<9);
c=MMCGetResponse();
if(c!=MMC_ERR_NO_ERROR){ //отвергнута команда чтения
MMCError=c;
return 0;
}

//Ожидаем начало(загаловок) данных
c=MMCWaitDataStart();
if(c!=MMC_ERR_NO_ERROR){//получен Data Error Token
MMCError=c;
return 0;
}

//Считывем данные
for(i=0;i<512;i++){
*buf=SPIWriteReadByte(0xFF);
buf++;
}

//считывем CRC
SPIWriteReadByte(0xFF); //читаем
SPIWriteReadByte(0xFF); // CRC ..и забиваем на него (пока)
MMCDelay(MMC_TIME_NEW_COMMAND);

SPISelectSlave(SPI_SLAVE_NONE);
return 1;
}

uchar MMCGetResponse(void){
uchar c,e;
e=0;
wait_response:
if(e>MMC_TIME_RESPOSE_TIMEOUT) return MMC_ERR_TIMEOUT;//тайм аут
c=SPIWriteReadByte(0xFF);
e++;
_IF_BIS(MMC_RESPONSE_FLAG,c) goto wait_response;
if(c==0) return MMC_ERR_NO_ERROR;
_IF_BIS(MMC_RESPONSE_ERASE_RESET,c) return MMC_ERR_ERASE_RESET;
_IF_BIS(MMC_RESPONSE_ILLEGAL_CMD,c) return MMC_ERR_ILLEGAL_CMD;
_IF_BIS(MMC_RESPONSE_CRC_EEROR,c) return MMC_ERR_CRC;
_IF_BIS(MMC_RESPONSE_ERASE_SEQ_ERR,c) return MMC_ERR_ERASE_SEQ;
_IF_BIS(MMC_RESPONSE_ADDRESS_ERR,c) return MMC_ERR_ADDRESS;
_IF_BIS(MMC_RESPONSE_PARAM_ERR,c) return MMC_ERR_PARAM;
return MMC_ERR_ERROR; //также если карта находится в сотоянии IDLE
}


uchar MMCWaitDataStart(void){
uchar c,e;
e=0;
wait_data:
if(e>MMC_TIME_DATA_TIMEOUT) return MMC_ERR_TIMEOUT; //тайм аут
c=SPIWriteReadByte(0xFF);
if(c==0xFF) goto wait_data;
if(c==MMC_DATA_TOKEN_HEAD) return MMC_ERR_NO_ERROR;
_IF_BIS(MMC_DATA_ERROR_TOKEN_CONTROLLER,c) return MMC_ERR_CONTROLLER;
_IF_BIS(MMC_DATA_ERROR_TOKEN_ECC,c) return MMC_ERR_ECC;
_IF_BIS(MMC_DATA_ERROR_TOKEN_OUT_RANGE,c) return MMC_ERR_OUT_RANGE;
_IF_BIS(MMC_DATA_ERROR_TOKEN_LOCKED,c) return MMC_ERR_LOCKED;
return MMC_ERR_ERROR;
}



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru