roboforum.ru

Технический форум по робототехнике.

Не пишет на SD карту atmega 32

Не пишет на SD карту atmega 32

grek » 16 май 2011, 22:25

Подскажите пожалуйста в чем может быть проблема.Не пишет на sd карту.Чтение работает.Защита от записи отключена
Код: Выделить всёРазвернуть
   
res=pf_write(write_buf,strlen(write_buf),&s1);//Запишем в write.txt
uart_transmit_message("writing @write ok@ in write.txt ");
if ((res==0x00)&&(s1==strlen(write_buf))) uart_transmit_message("OK\r\n");
else uart_transmit_message("FAIL\r\n");

не пойму почему не выполняется данное условие (s1==strlen(write_buf))
Вложения
Hid_example_firmware.rar
Проект , файл в протеусе и mmc
(2.24 МиБ) Скачиваний: 0

Re: Не пишет на SD карту atmega 32

HarryStar » 17 май 2011, 00:22

А коды ошибок не анализировали?
Я делал в CVAVR со встроенной библиотекой, там нормальные коды ошибок выдаются, можно все понять.
На вскидку:
1) Перепроверьте все же защиту от записи. Она программная. Положение переключателя на карте роли не играет. Главное - 0 или 1 подано на соотв ножку МК(по уму туда нужно подсоединить переключатель от SD разъема, но проще замкнуть куда надо).
2) Имена файлов. Например указанная мной библиотека не понимает русские буквы и длинные имена. Только дос-стандарт 8.3 и на имена файлов и на каталоги
3) Все ли предварительные действия сделаны? Смонтирован ли диск, открыт ли файл на запись? На каждом шаге проверяйте коды ошибок.

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 09:39

Файл открывается,имя файла точно правильное,защита от записи и программная и физическая отключена.Как переходит на функцию
Код: Выделить всёРазвернуть
FRESULT pf_write (
   const void* buff,   /* Pointer to the data to be written */
   WORD btw,         /* Number of bytes to write (0:Finalize the current write operation) */
   WORD* bw         /* Pointer to number of bytes written */
)
{
   CLUST clst;
   DWORD sect, remain;
   const BYTE *p = buff;
   WORD wcnt;
   FATFS *fs = FatFs;


   *bw = 0;
   if (!fs) return FR_NOT_ENABLED;      /* Check file system */
   if (!(fs->flag & FA_OPENED))      /* Check if opened */
      return FR_NOT_OPENED;

   if (!btw) {      /* Finalize request */
      if ((fs->flag & FA__WIP) && disk_writep(0, 0)) goto fw_abort;
      fs->flag &= ~FA__WIP;
      return FR_OK;
   } else {      /* Write data request */
      if (!(fs->flag & FA__WIP))      /* Round down fptr to the sector boundary */
         fs->fptr &= 0xFFFFFE00;
   }
   remain = fs->fsize - fs->fptr;
   if (btw > remain) btw = (WORD)remain;         /* Truncate btw by remaining bytes */

   while (btw)   {                           /* Repeat until all data transferred */
      if (((WORD)fs->fptr % 512) == 0) {            /* On the sector boundary? */
         if ((fs->fptr / 512 % fs->csize) == 0) {   /* On the cluster boundary? */
            clst = (fs->fptr == 0) ?         /* On the top of the file? */
               fs->org_clust : get_fat(fs->curr_clust);
            if (clst <= 1) goto fw_abort;
            fs->curr_clust = clst;            /* Update current cluster */
            fs->csect = 0;                  /* Reset sector offset in the cluster */
         }
         sect = clust2sect(fs->curr_clust);      /* Get current sector */
         if (!sect) goto fw_abort;
         fs->dsect = sect + fs->csect++;
         if (disk_writep(0, fs->dsect)) goto fw_abort;   /* Initiate a sector write operation */
         fs->flag |= FA__WIP;
      }
      wcnt = 512 - ((WORD)fs->fptr % 512);      /* Number of bytes to write to the sector */
      if (wcnt > btw) wcnt = btw;
      if (disk_writep(p, wcnt)) goto fw_abort;   /* Send data to the sector */
      fs->fptr += wcnt; p += wcnt;            /* Update pointers and counters */
      btw -= wcnt; *bw += wcnt;
      if (((WORD)fs->fptr % 512) == 0) {
         if (disk_writep(0, 0)) goto fw_abort;   /* Finalize the currtent secter write operation */
         fs->flag &= ~FA__WIP;
      }
   }

   return FR_OK;

fw_abort:
   fs->flag = 0;
   return FR_DISK_ERR;
}
#endif

и возвращает при выходе из нее FR_OK
но при запросе условия (res==0x00)&&(s1==strlen(write_buf)) оно не выполняется из-за второй части.Как я понимаю,количество байтов из буфера WORD btw,на который указывает buff не соответствует числу записанных байт.Да и что,то по ошибкам не могу понять.Так ка res при выходе из функции равно 0x00.

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 09:49

Перед записью попробуй очистить буфер - мне помогло

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 09:54

А по подробней какой буфер имеется ввиду?

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 09:55

Буфер с которого запись ведется в файл, вроде buff называется

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 10:12

buffer[0]=0;//очистка буфера
res=pf_write(write_buf,strlen(write_buf),&s1);//Çàïèøåì â write.txt
вроде как то так,но не чего не изменилось

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 10:15

Ты нулевой элемент очищаешь а остальные?

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 14:22

for(s=0;s>512;s++)
{
buffer[s]=0;//
}
res=pf_write(write_buf,strlen(write_buf),&s1);
Мне почему то кажется не в этом дело,данные напрямую по адресам флешки записываются.А вот если открывать файл и писать, то не хочет,используя данную библиотеку.

Добавлено спустя 3 часа 52 минуты 14 секунд:
galex1981 , ты может подскажешь где этот буфер чистится.Не как не могу найти.То что я чистил это совершенно не то.Ни как не пойму почему не пишит.

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 14:36

Попробуй так:
Код: Выделить всёРазвернуть
memset(buffer, 0, sizeof(buffer));

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 14:42

Там смысл,в том,что запись и буфер находит в библиотеки так называемого Чана.И я ни как ни въеду в эту библиотеку.Пытаюсь сделать вот это http://www.avrlab.com/node/156 .Первая глава получилась и пишет и читает.А вот вторая, пока только пишет.

FRESULT pf_write (
const void* buff, /* Pointer to the data to be written */
WORD btw, /* Number of bytes to write (0:Finalize the current write operation) */
WORD* bw /* Pointer to number of bytes written */
)

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 15:15

Вот как раз я и пользуюсь библиотекой Элм Чена и перед пользованием буфером записи/чтения. Я его зануляю командой memset

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 15:31

memset(buffer, 0, sizeof(buffer));
А куда это впихнуть,если с операцией чтения все понятно.То с записью вообще ни чего не ясно.Я немного не понимаю,что именно надо чистить.Так как очистку на вставлять в библиотеку чена.Где этот буфер находится мне непонятно.
Если когда я писал данные по адресу там использовался глобальный буфер //char buffer [512]={}; // Буффер чтения/записи
а сейчас он у меня закомпелирован и сответственно используется другой.Возможно указатель,ни как не разберусь.

Re: Не пишет на SD карту atmega 32

galex1981 » 17 май 2011, 15:45

Еще раз повторюсь: очищать надо буфер записи/чтения. Из твоего первого поста:
Код: Выделить всёРазвернуть
res=pf_write(write_buf,strlen(write_buf),&s1);//Запишем в write.txt


я так понял что это write_buf, если ты используешь в функции записи другой буфер то зануляешь перед использованием его. При инициализации сам массив не зануляется а заполняется чем угодно - отсюда могут быть глюки записи чаще всего...

Re: Не пишет на SD карту atmega 32

grek » 17 май 2011, 16:04

Так вот и не понятно,как пишется.Может просто указателем указывается место.


Rambler\'s Top100 Mail.ru counter