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))
А коды ошибок не анализировали? Я делал в CVAVR со встроенной библиотекой, там нормальные коды ошибок выдаются, можно все понять. На вскидку: 1) Перепроверьте все же защиту от записи. Она программная. Положение переключателя на карте роли не играет. Главное - 0 или 1 подано на соотв ножку МК(по уму туда нужно подсоединить переключатель от SD разъема, но проще замкнуть куда надо). 2) Имена файлов. Например указанная мной библиотека не понимает русские буквы и длинные имена. Только дос-стандарт 8.3 и на имена файлов и на каталоги 3) Все ли предварительные действия сделаны? Смонтирован ли диск, открыт ли файл на запись? На каждом шаге проверяйте коды ошибок.
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; } }
и возвращает при выходе из нее FR_OK но при запросе условия (res==0x00)&&(s1==strlen(write_buf)) оно не выполняется из-за второй части.Как я понимаю,количество байтов из буфера WORD btw,на который указывает buff не соответствует числу записанных байт.Да и что,то по ошибкам не могу понять.Так ка res при выходе из функции равно 0x00.
for(s=0;s>512;s++) { buffer[s]=0;// } res=pf_write(write_buf,strlen(write_buf),&s1); Мне почему то кажется не в этом дело,данные напрямую по адресам флешки записываются.А вот если открывать файл и писать, то не хочет,используя данную библиотеку.
Добавлено спустя 3 часа 52 минуты 14 секунд: galex1981 , ты может подскажешь где этот буфер чистится.Не как не могу найти.То что я чистил это совершенно не то.Ни как не пойму почему не пишит.
Там смысл,в том,что запись и буфер находит в библиотеки так называемого Чана.И я ни как ни въеду в эту библиотеку.Пытаюсь сделать вот это 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 */ )
memset(buffer, 0, sizeof(buffer)); А куда это впихнуть,если с операцией чтения все понятно.То с записью вообще ни чего не ясно.Я немного не понимаю,что именно надо чистить.Так как очистку на вставлять в библиотеку чена.Где этот буфер находится мне непонятно. Если когда я писал данные по адресу там использовался глобальный буфер //char buffer [512]={}; // Буффер чтения/записи а сейчас он у меня закомпелирован и сответственно используется другой.Возможно указатель,ни как не разберусь.
res=pf_write(write_buf,strlen(write_buf),&s1);//Запишем в write.txt
я так понял что это write_buf, если ты используешь в функции записи другой буфер то зануляешь перед использованием его. При инициализации сам массив не зануляется а заполняется чем угодно - отсюда могут быть глюки записи чаще всего...