Petit FAT vs Proteus

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 17
Зарегистрирован: Пн фев 09, 2015 21:19:07

Сообщение Ziper009 »

Привет, великодушно.
Возникла проблема друзья, нужна помощь.
Такое дело значит. Я работаю с проектом наподобие, одна из вариаций wav плеера на attiny85 мистера чана http://elm-chan.org/works/sd8p/report.html
так вот attiny85 + sd карточка, звуки с неё берутся и играются. Всё на железе работает прекрасно, но я решил добавить пару функций и тут WinAVR как всегда своей сообразительностью и оптимизацией намудрил, а может наоборот я намудрил и в результате он компилит код но естественно он не работает как надо.
Я решил в протеусе в отладчике посмотреть в чём дело, отладить но обнаружил что карточка MMC там почему то не работает. В железе работает на проверенном коде а в протеусе mmc карта не работает. Даже если взять проект чановский http://elm-chan.org/works/sd8p/report.html то в протеусе тоже mmm карта не инициализируеться.
Проблема в том как заставить карточку mmc в протеусе работать что можно было продолжить отладку??
Нужно чтоб именно Petit FAT (урезанный FAT был) с полным чановским FAT карточка работает в протеусе а вот с урезанным FAT (Petit FAT) она отказывается инициализироваться. Образ mmc карты рабочий! Я этот образ проверял с полным FAT карточка работает, а если этот же образ применить с Petit FAT то карточка не инициализируеться(((
Инициализацию провожу классически.

volatile FRESULT res; // глобальная переменная чтоб была видна при отладке в протеусе
res = pf_mount(&Fs); // инициализируем Petit FAT
if (res == FR_OK) { // инициализация прошла успешно
// делаем что нам надо
}

res = pf_mount(&Fs); // инициализируем Petit FAT
отладчик в протеусе показывает после этой строчки что в переменной res находится значение FR_NOT_READY(2) то есть инициализация файловой системы не прошла.
Я полез дальше и оказывается что в самой функции по инициалтзации файловой системы pf_mount(&Fs) есть вызов функции по инициализации самой карточки disk_initialize() собственно эта функция и возвращает ошибку FR_NOT_READY(2) и дальше инициализация не идёт почему то((

FR_NOT_READY означает
Привод не может быть инициализирован из-за ошибки диска (disk error) или отсутствия носителя данных (no medium).

Помогите пожалуйста разобраться как надо инициализировать карточку с файловой системой Petit FAT?? по идее я всё делаю правельно и на железе работает, но мне надо именно что в протеусе нормально происходила инициализация так как мне далеше надо в его отладчике код отлаживать уже с инициализированной sd картой.
Может есть у кого нибуть исходники где карточка Petit FAT нормально работает в протеусе?? Помогите очень надо из за этого глюка вся работа встала на месте((.

Компиляток WinAVR, протеус 7.10, образ карточки который использую прилогаю. Попробуйте пожалуйста, будет и у вас данный образ нормально карточку инициализировать.

Файл сюда не приклепляется, выложил на файло обменник
https://yadi.sk/d/Rkc8J-cHfBckK
Реклама
Родился
Сообщения: 17
Зарегистрирован: Пн фев 09, 2015 21:19:07

Сообщение Ziper009 »

аа всё я сам разобрался уже в чём дело :)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ziper009 писал(а):аа всё я сам разобрался уже в чём дело :)
никому не говорите, в чем проблема!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Сообщения: 17
Зарегистрирован: Пн фев 09, 2015 21:19:07

Сообщение Ziper009 »

ARV писал(а):
Ziper009 писал(а):аа всё я сам разобрался уже в чём дело :)
никому не говорите, в чем проблема!
Да ничего я не разобрался :( оказывается проблема всё тоже самая. Просто я перепутал , думал что решил её так как FR_OK (0) это 0 то после перезапуска контроллера переменная обнулялась вот и отладчик показывал FR_OK (0) :(
Проблема осталась.
Как сделать чтоб в протеусе sd карточка (Petit FAT) инициализировалась ? Может есть у кого нибуть рабочий проект для протеуса?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 17
Зарегистрирован: Пн фев 09, 2015 21:19:07

Сообщение Ziper009 »

Что то друзья видимо я вообще ничего не понимаю в этой жизни.
Решил я вообщем подключить в протеусе spi отладчик в режиме снифера и глянуть о чём вообще контроллер с карточкой разговаривает. проверял я с проектом на atmega8 там стоит полная чановская FAT и всё работает в протеусе замечательно.
СпойлерИзображение
а проверяю на чановском проекте wav плеера, для примера, чтоб проверить там не работает!
Хотя всё тоже самое спрашиваем но карточка не отвечает и молчит образы mm карты из этих проектов одинаковые настройки тоже. Да и если спрашиваем что надо то ведь дело не к контроллерах и прошивках карточка то должна ответить по любому если спросили верно. Только в одном случае она отвечает а в другом нет ПОЧЕМУ ТАКОЕ МОЖЕТ БЫТЬ? это не может быть глюком протеуса ведь работает в другом проекте и не в прошивке дело не в библиотеках так в чём тогда??
СпойлерИзображение
Реклама
Родился
Сообщения: 17
Зарегистрирован: Пн фев 09, 2015 21:19:07

Сообщение Ziper009 »

Oxford писал(а):Код корявый у него, возможно с задержками проблемы. Код драйвера там жестко привязан на конкретные задержки.
Вы были правы. весь день провёл с отладчиком и нашёл баг у чана при инициализации.
СпойлерИзображение
СпойлерИзображение
при инициализации карточки в стартовом условии не хватает одного FF поэтому карточка не отвечает и возникает ошибка. Такое вроди возникает только у MMC карт на sd карты не сказывается поэтому в железе работает а в протеусе не инициализируется потому что в протеусе именно модель MMC карты.
Уже пол дела сделали теперь надо исправить ошибку.
В приложеном архиве проект wav плеера чана. Так вот там в файле mmc.с есть функция
static BYTE send_cmd (
BYTE cmd, /* Command byte */
DWORD arg /* Argument */
)
{
}
в этой функции есть код который глючит
/* Send command packet */
xmit_spi(cmd); /* Start + Command index */
xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
xmit_spi((BYTE)arg); /* Argument[7..0] */
n = 0x01; /* Dummy CRC + Stop */
if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */
if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */
xmit_spi(n);

он посылает стартовое условие, отсылает команду и контрольную сумму.
проблема тут xmit_spi(cmd); отсылается команда но одного FF не дописывает.

а в файле asmfunc.S сама функция отправки xmit_spi
Спойлер;---------------------------------------------------------------------------;
; Transmit a byte
;
; void xmit_spi (BYTE);

.global xmit_spi
.func xmit_spi
xmit_spi:
ldi r25, 0b000100 ; PB2(SCK)
in r22, _SFR_IO_ADDR(PORTB)

ldi r23, 8
1: bst r24, 7 ;MMC DI = data bit to be sent
bld r22, B_DO ;
out _SFR_IO_ADDR(PORTB), r22 ;
lsl r24 ;/
out _SFR_IO_ADDR(PINB), r25 ;SCK = H
out _SFR_IO_ADDR(PINB), r25 ;SCK = L
dec r23 ;while(--r23)
brne 1b ;/

sbi _SFR_IO_ADDR(PORTB), B_DO ;MMC DI = H
ret
.endfunc



;---------------------------------------------------------------------------;
так вот помогите что надо переделать где тут?

в рабочем чановском проекте где полная FAT так написанно
Спойлер/* Send command packet */
xmit_spi(0x40 | cmd); /* Start + Command index */
xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
xmit_spi((BYTE)arg); /* Argument[7..0] */
n = 0x01; /* Dummy CRC + Stop */
if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */
if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */
xmit_spi(n);
сама функция xmit_spi в рабочем идёт макросом
Спойлер/*-----------------------------------------------------------------------*/
/* Transmit a byte to MMC via SPI (Platform dependent) */
/*-----------------------------------------------------------------------*/

#define xmit_spi(dat) SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF)

я пробовал просто добавить один байт который не хватает
Спойлер/* Send command packet */
xmit_spi(0xFF);
xmit_spi(cmd); /* Start + Command index */ //xmit_spi(0x40 | cmd);
xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */
xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */
xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */
xmit_spi((BYTE)arg); /* Argument[7..0] */
n = 0x01; /* Dummy CRC + Stop */
if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */
if (cmd == CMD8) n = 0x87;/* Valid CRC for CMD8(0x1AA) */
xmit_spi(n);
так стартовое условие получается правильное и карточка начинает отвечать но всё виснет она отвечает постоянно FF

Так в чём же дело то как заставить карточку работать в протеусе ?? Помогите разобраться.

Приложение wav плеер + проект для протеуса
https://yadi.sk/d/bicWD_mcfDDX7
Реклама
Ответить

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