roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:29

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Не пишет на SD карту atmega 32
СообщениеДобавлено: 16 май 2011, 22:25 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
Подскажите пожалуйста в чем может быть проблема.Не пишет на 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))


Вложения:
Комментарий к файлу: Проект , файл в протеусе и mmc
Hid_example_firmware.rar [2.24 МиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 00:22 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 09:39 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
Файл открывается,имя файла точно правильное,защита от записи и программная и физическая отключена.Как переходит на функцию
Код:
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
СообщениеДобавлено: 17 май 2011, 09:49 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Перед записью попробуй очистить буфер - мне помогло

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 09:54 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
А по подробней какой буфер имеется ввиду?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 09:55 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Буфер с которого запись ведется в файл, вроде buff называется

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 10:12 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
buffer[0]=0;//очистка буфера
res=pf_write(write_buf,strlen(write_buf),&s1);//Çàïèøåì â write.txt
вроде как то так,но не чего не изменилось


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 10:15 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Ты нулевой элемент очищаешь а остальные?

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 14:22 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
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
СообщениеДобавлено: 17 май 2011, 14:36 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Попробуй так:
Код:
memset(buffer, 0, sizeof(buffer));

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 14:42 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
Там смысл,в том,что запись и буфер находит в библиотеки так называемого Чана.И я ни как ни въеду в эту библиотеку.Пытаюсь сделать вот это 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
СообщениеДобавлено: 17 май 2011, 15:15 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Вот как раз я и пользуюсь библиотекой Элм Чена и перед пользованием буфером записи/чтения. Я его зануляю командой memset

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 15:31 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 15:45 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Еще раз повторюсь: очищать надо буфер записи/чтения. Из твоего первого поста:
Код:
res=pf_write(write_buf,strlen(write_buf),&s1);//Запишем в write.txt


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

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не пишет на SD карту atmega 32
СообщениеДобавлено: 17 май 2011, 16:04 
Не в сети

Зарегистрирован: 16 сен 2009, 15:41
Сообщения: 159
Откуда: Арзамас
Так вот и не понятно,как пишется.Может просто указателем указывается место.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO