Помогите разобраться с библиотекой

Armata
Offline
Зарегистрирован: 04.03.2018

Здравствуйте.Не могу разобраться с библиотекой USB_Host_Shield_2.0 . Есть МЕГА 2560 к ней подключен USB sheld 2.0 на чипе MAX3421, всё работает,примеры с мышкой и клавиатурой работают отлично,но я хочу подключить обычную USB флешку чтобы с неё читать текстовый документ и отправлять всё что в нём написано в монитор порта.Ну и писать на нёё файл.
Для начала решил попробовать пример,testusbhostFAT,судя по описанию он должен создать на флешке файл Hello.TxT,но ничего не создаётся и не считывается.

Всё что в мониторе порта показывает

Start
Current UsbDEBUGlvl 81
'+' and '-' increase/decrease by 0x01
'.' and ',' increase/decrease by 0x10
't' will run a 10MB write/read test and print out the time it took.
'e' will toggle vbus off for a few moments.
 
Long filename support: Enabled
Total EXT RAM banks 0
Available heap: 7086 Bytes
SP 21f4
Available heap: 7071 Bytes
VBUS on
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
USB state = 20
USB state = 13
Available heap: 6589 Bytes
USB state = 20
USB state = 13
Available heap: 6589 Bytes
 
На флешке пусто.
Код примера:
001/*
002 * Mega + USB storage + optional DS1307 + optional expansion RAM + funky status LED,
003 * Includes interactive debug level setting, and supports hot-plug.
004 *
005 * IMPORTANT! PLEASE USE Arduino 1.0.5 or better!
006 * Older versions HAVE MAJOR BUGS AND WILL NOT WORK AT ALL!
007 * Use of gcc-avr and lib-c that is newer than the Arduino version is even better.
008 * If you experience random crashes, use make.
009 * The options that the IDE use can generate bad code and cause the AVR to crash.
010 *
011 * This sketch requires the following libraries:
013 * <a href="https://github.com/xxxajk/xmem2" title="https://github.com/xxxajk/xmem2" rel="nofollow">https://github.com/xxxajk/xmem2</a> Install as 'xmem', provides memory services.
015 * <a href="https://github.com/xxxajk/RTClib" title="https://github.com/xxxajk/RTClib" rel="nofollow">https://github.com/xxxajk/RTClib</a> provides access to DS1307, or fake clock.
016 *
017 * Optional, to use the Makefile (Recommended! See above!):
019 *
020 */
021 
022/////////////////////////////////////////////////////////////
023// Please Note:                                            //
024// This section is for info with the Arduino IDE ONLY.     //
025// Unfortunately due to short sightedness of the Arduino   //
026// code team, that you must set the following in the       //
027// respective libraries.                                   //
028// Changing them here will have _NO_ effect!               //
029/////////////////////////////////////////////////////////////
030 
031// Uncomment to enable debugging
032//#define DEBUG_USB_HOST
033// This is where stderr/USB debugging goes to
034//#define USB_HOST_SERIAL Serial3
035 
036// If you have external memory, setting this to 0 enables FAT table caches.
037// The 0 setting is recommended only if you have external memory.
038//#define _FS_TINY 1
039 
040//#define _USE_LFN 3
041//#define _MAX_SS 512
042 
043 
044/////////////////////////////////////////////////////////////
045// End of Arduino IDE specific information                 //
046/////////////////////////////////////////////////////////////
047 
048// You can set this to 0 if you are not using a USB hub.
049// It will save a little bit of flash and RAM.
050// Set to 1 if you want to use a hub.
051#define WANT_HUB_TEST 1
052 
053// this is for XMEM2
054#define EXT_RAM_STACK 1
055#define EXT_RAM_HEAP 1
056#define LOAD_XMEM
057 
058#if defined(CORE_TEENSY) && !defined(_AVR_)
059#include <xmem.h>
060#include <spi4teensy3.h>
061#include <SPI.h>
062#endif
063 
064#if defined(__AVR__)
065#include <xmem.h>
066#elif defined(ARDUINO_ARCH_SAM)
067#include <SPI.h>
068#endif
069 
070#if WANT_HUB_TEST
071#include <usbhub.h>
072#endif
073#include <Wire.h>
074#define LOAD_RTCLIB
075#include <RTClib.h>
076#include <masstorage.h>
077#include <Storage.h>
078#include <PCpartition/PCPartition.h>
079#include <avr/interrupt.h>
080#include <FAT/FAT.h>
081#include <stdio.h>
082#if defined(__AVR__)
083static FILE tty_stdio;
084static FILE tty_stderr;
085volatile uint32_t LEDnext_time; // fade timeout
086volatile uint32_t HEAPnext_time; // when to print out next heap report
087volatile int brightness = 0; // how bright the LED is
088volatile int fadeAmount = 80; // how many points to fade the LED by
089#endif
090 
091USB Usb;
092 
093volatile uint8_t current_state = 1;
094volatile uint8_t last_state = 0;
095volatile bool fatready = false;
096volatile bool partsready = false;
097volatile bool notified = false;
098volatile bool runtest = false;
099volatile bool usbon = false;
100volatile uint32_t usbon_time;
101volatile bool change = false;
102volatile bool reportlvl = false;
103int cpart = 0;
104PCPartition *PT;
105 
106#if WANT_HUB_TEST
107#define MAX_HUBS 1
108USBHub *Hubs[MAX_HUBS];
109#endif
110 
111static PFAT *Fats[_VOLUMES];
112static part_t parts[_VOLUMES];
113static storage_t sto[_VOLUMES];
114 
115/*make sure this is a power of two. */
116#define mbxs 128
117static uint8_t My_Buff_x[mbxs]; /* File read buffer */
118 
119#if defined(__AVR__)
120 
121#define prescale1       ((1 << WGM12) | (1 << CS10))
122#define prescale8       ((1 << WGM12) | (1 << CS11))
123#define prescale64      ((1 << WGM12) | (1 << CS10) | (1 << CS11))
124#define prescale256     ((1 << WGM12) | (1 << CS12))
125#define prescale1024    ((1 << WGM12) | (1 << CS12) | (1 << CS10))
126 
127extern "C" {
128         extern unsigned int freeHeap();
129}
130static int tty_stderr_putc(char c, FILE *t) {
131        USB_HOST_SERIAL.write(c);
132        return 0;
133}
134 
135static int __attribute__((unused)) tty_stderr_flush(FILE *t) {
136        USB_HOST_SERIAL.flush();
137        return 0;
138}
139 
140static int tty_std_putc(char c, FILE *t) {
141        Serial.write(c);
142        return 0;
143}
144 
145static int tty_std_getc(FILE *t) {
146        while(!Serial.available());
147        return Serial.read();
148}
149 
150static int __attribute__((unused)) tty_std_flush(FILE *t) {
151        Serial.flush();
152        return 0;
153}
154 
155#else
156// Supposedly the DUE has stdio already pointing to serial...
157#if !defined(ARDUINO_ARCH_SAM)
158// But newlib needs this...
159extern "C" {
160        int _write(int fd, const char *ptr, int len) {
161                int j;
162                for(j = 0; j < len; j++) {
163                        if(fd == 1)
164                                Serial.write(*ptr++);
165                        else if(fd == 2)
166                                USB_HOST_SERIAL.write(*ptr++);
167                }
168                return len;
169        }
170 
171        int _read(int fd, char *ptr, int len) {
172                if(len > 0 && fd == 0) {
173                        while(!Serial.available());
174                        *ptr = Serial.read();
175                        return 1;
176                }
177                return 0;
178        }
179 
180#include <sys/stat.h>
181 
182        int _fstat(int fd, struct stat *st) {
183                memset(st, 0, sizeof (*st));
184                st->st_mode = S_IFCHR;
185                st->st_blksize = 1024;
186                return 0;
187        }
188 
189        int _isatty(int fd) {
190                return (fd < 3) ? 1 : 0;
191        }
192}
193#endif // !defined(ARDUINO_ARCH_SAM)
194#endif
195 
196void setup() {
197        bool serr = false;
198        for(int i = 0; i < _VOLUMES; i++) {
199                Fats[i] = NULL;
200                sto[i].private_data = new pvt_t;
201                ((pvt_t *)sto[i].private_data)->B = 255; // impossible
202        }
203        // Set this to higher values to enable more debug information
204        // minimum 0x00, maximum 0xff
205        UsbDEBUGlvl = 0x81;
206 
207#if !defined(CORE_TEENSY) && defined(__AVR__)
208        // make LED pin as an output:
209        pinMode(LED_BUILTIN, OUTPUT);
210        pinMode(2, OUTPUT);
211        // Ensure TX is off
212        _SFR_BYTE(UCSR0B) &= ~_BV(TXEN0);
213        // Initialize 'debug' serial port
214        USB_HOST_SERIAL.begin(115200);
215        // Do not start primary Serial port if already started.
216        if(bit_is_clear(UCSR0B, TXEN0)) {
217                Serial.begin(115200);
218                serr = true;
219        }
220 
221 
222        // Blink LED
223        delay(500);
224        analogWrite(LED_BUILTIN, 255);
225        delay(500);
226        analogWrite(LED_BUILTIN, 0);
227        delay(500);
228#else
229        while(!Serial);
230        Serial.begin(115200); // On the Teensy 3.x we get a delay at least!
231#endif
232#if defined(__AVR__)
233        // Set up stdio/stderr
234        tty_stdio.put = tty_std_putc;
235        tty_stdio.get = tty_std_getc;
236        tty_stdio.flags = _FDEV_SETUP_RW;
237        tty_stdio.udata = 0;
238 
239        tty_stderr.put = tty_stderr_putc;
240        tty_stderr.get = NULL;
241        tty_stderr.flags = _FDEV_SETUP_WRITE;
242        tty_stderr.udata = 0;
243 
244        stdout = &tty_stdio;
245        stdin = &tty_stdio;
246        stderr = &tty_stderr;
247#endif
248        printf_P(PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
249        printf_P(PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
250        printf_P(PSTR("'+' and '-' increase/decrease by 0x01\r\n"));
251        printf_P(PSTR("'.' and ',' increase/decrease by 0x10\r\n"));
252        printf_P(PSTR("'t' will run a 10MB write/read test and print out the time it took.\r\n"));
253        printf_P(PSTR("'e' will toggle vbus off for a few moments.\r\n\r\n"));
254        printf_P(PSTR("Long filename support: "
255#if _USE_LFN
256                "Enabled"
257#else
258                "Disabled"
259#endif
260                "\r\n"));
261        if(serr) {
262                fprintf_P(stderr, PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
263                fprintf_P(stderr, PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
264                fprintf_P(stderr, PSTR("Long filename support: "
265#if _USE_LFN
266                        "Enabled"
267#else
268                        "Disabled"
269#endif
270                        "\r\n"));
271        }
272 
273#if !defined(CORE_TEENSY) && defined(__AVR__)
274        analogWrite(LED_BUILTIN, 255);
275        delay(500);
276        analogWrite(LED_BUILTIN, 0);
277        delay(500);
278        analogWrite(LED_BUILTIN, 255);
279        delay(500);
280        analogWrite(LED_BUILTIN, 0);
281        delay(500);
282        analogWrite(LED_BUILTIN, 255);
283        delay(500);
284        analogWrite(LED_BUILTIN, 0);
285        delay(500);
286 
287        LEDnext_time = (uint32_t)millis() + 1;
288#if EXT_RAM
289        printf_P(PSTR("Total EXT RAM banks %i\r\n"), xmem::getTotalBanks());
290#endif
291        printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
292        printf_P(PSTR("SP %x\r\n"), (uint8_t *)(SP));
293#endif
294 
295        // Even though I'm not going to actually be deleting,
296        // I want to be able to have slightly more control.
297        // Besides, it is easier to initialize stuff...
298#if WANT_HUB_TEST
299        for(int i = 0; i < MAX_HUBS; i++) {
300                Hubs[i] = new USBHub(&Usb);
301#if defined(__AVR__)
302                printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
303#endif
304        }
305#endif
306        // Initialize generic storage. This must be done before USB starts.
307        Init_Generic_Storage();
308 
309        while(Usb.Init(1000) == -1) {
310                printf_P(PSTR("No USB HOST Shield?\r\n"));
311                Notify(PSTR("OSC did not start."), 0x40);
312        }
313 
314#if !defined(CORE_TEENSY) && defined(__AVR__)
315        cli();
316        TCCR3A = 0;
317        TCCR3B = 0;
318        // (0.01/(1/((16 *(10^6)) / 8))) - 1 = 19999
319        OCR3A = 19999;
320        TCCR3B |= prescale8;
321        TIMSK3 |= (1 << OCIE1A);
322        sei();
323 
324        HEAPnext_time = (uint32_t)millis() + 10000;
325#endif
326#if defined(__AVR__)
327        HEAPnext_time = (uint32_t)millis() + 10000;
328#endif
329}
330 
331void serialEvent() {
332        // Adjust UsbDEBUGlvl level on-the-fly.
333        // + to increase, - to decrease, * to display current level.
334        // . to increase by 16, , to decrease by 16
335        // e to flick VBUS
336        // * to report debug level
337        if(Serial.available()) {
338                int inByte = Serial.read();
339                switch(inByte) {
340                        case '+':
341                                if(UsbDEBUGlvl < 0xff) UsbDEBUGlvl++;
342                                reportlvl = true;
343                                break;
344                        case '-':
345                                if(UsbDEBUGlvl > 0x00) UsbDEBUGlvl--;
346                                reportlvl = true;
347                                break;
348                        case '.':
349                                if(UsbDEBUGlvl < 0xf0) UsbDEBUGlvl += 16;
350                                reportlvl = true;
351                                break;
352                        case ',':
353                                if(UsbDEBUGlvl > 0x0f) UsbDEBUGlvl -= 16;
354                                reportlvl = true;
355                                break;
356                        case '*':
357                                reportlvl = true;
358                                break;
359                        case 't':
360                                runtest = true;
361                                break;
362                        case 'e':
363                                change = true;
364                                usbon = false;
365                                break;
366                }
367        }
368}
369 
370#if !defined(CORE_TEENSY) && defined(__AVR__)
371// ALL teensy versions LACK PWM ON LED
372 
373ISR(TIMER3_COMPA_vect) {
374        if((int32_t)((uint32_t)millis() - LEDnext_time) >= 0L) {
375                LEDnext_time = (uint32_t)millis() + 30;
376 
377                // set the brightness of LED
378                analogWrite(LED_BUILTIN, brightness);
379 
380                // change the brightness for next time through the loop:
381                brightness = brightness + fadeAmount;
382 
383                // reverse the direction of the fading at the ends of the fade:
384                if(brightness <= 0) {
385                        brightness = 0;
386                        fadeAmount = -fadeAmount;
387                }
388                if(brightness >= 255) {
389                        brightness = 255;
390                        fadeAmount = -fadeAmount;
391                }
392        }
393}
394#endif
395 
396bool isfat(uint8_t t) {
397        return (t == 0x01 || t == 0x04 || t == 0x06 || t == 0x0b || t == 0x0c || t == 0x0e || t == 0x1);
398}
399 
400void die(FRESULT rc) {
401        printf_P(PSTR("Failed with rc=%u.\r\n"), rc);
402        //for (;;);
403}
404 
405void loop() {
406        FIL My_File_Object_x; /* File object */
407 
408#if defined(__AVR__)
409        // Print a heap status report about every 10 seconds.
410        if((int32_t)((uint32_t)millis() - HEAPnext_time) >= 0L) {
411                if(UsbDEBUGlvl > 0x50) {
412                        printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
413                }
414                HEAPnext_time = (uint32_t)millis() + 10000;
415        }
416        TCCR3B = 0;
417#endif
418#if defined(CORE_TEENSY)
419        // Teensy suffers here, oh well...
420        serialEvent();
421#endif
422        // Horrid! This sort of thing really belongs in an ISR, not here!
423        // We also will be needing to test each hub port, we don't do this yet!
424        if(!change && !usbon && (int32_t)((uint32_t)millis() - usbon_time) >= 0L) {
425                change = true;
426                usbon = true;
427        }
428 
429        if(change) {
430                change = false;
431                if(usbon) {
432                        Usb.vbusPower(vbus_on);
433                        printf_P(PSTR("VBUS on\r\n"));
434                } else {
435                        Usb.vbusPower(vbus_off);
436                        usbon_time = (uint32_t)millis() + 2000;
437                }
438        }
439        Usb.Task();
440        current_state = Usb.getUsbTaskState();
441        if(current_state != last_state) {
442                if(UsbDEBUGlvl > 0x50)
443                        printf_P(PSTR("USB state = %x\r\n"), current_state);
444#if !defined(CORE_TEENSY) && defined(__AVR__)
445                if(current_state == USB_STATE_RUNNING) {
446                        fadeAmount = 30;
447                }
448#endif
449                if(current_state == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
450#if !defined(CORE_TEENSY) && defined(__AVR__)
451                        fadeAmount = 80;
452#endif
453                        partsready = false;
454                        for(int i = 0; i < cpart; i++) {
455                                if(Fats[i] != NULL)
456                                        delete Fats[i];
457                                Fats[i] = NULL;
458                        }
459                        fatready = false;
460                        notified = false;
461                        cpart = 0;
462                }
463                last_state = current_state;
464        }
465 
466        // only do any of this if usb is on
467        if(usbon) {
468                if(partsready && !fatready) {
469                        if(cpart > 0) fatready = true;
470                }
471                // This is horrible, and needs to be moved elsewhere!
472                for(int B = 0; B < MAX_USB_MS_DRIVERS; B++) {
473                        if((!partsready) && (UHS_USB_BulkOnly[B]->GetAddress())) {
474 
475                                // Build a list.
476                                int ML = UHS_USB_BulkOnly[B]->GetbMaxLUN();
477                                //printf("MAXLUN = %i\r\n", ML);
478                                ML++;
479                                for(int i = 0; i < ML; i++) {
480                                        if(UHS_USB_BulkOnly[B]->LUNIsGood(i)) {
481                                                partsready = true;
482                                                ((pvt_t *)(sto[i].private_data))->lun = i;
483                                                ((pvt_t *)(sto[i].private_data))->B = B;
484                                                sto[i].Reads = *UHS_USB_BulkOnly_Read;
485                                                sto[i].Writes = *UHS_USB_BulkOnly_Write;
486                                                sto[i].Status = *UHS_USB_BulkOnly_Status;
487                                                sto[i].Initialize = *UHS_USB_BulkOnly_Initialize;
488                                                sto[i].Commit = *UHS_USB_BulkOnly_Commit;
489                                                sto[i].TotalSectors = UHS_USB_BulkOnly[B]->GetCapacity(i);
490                                                sto[i].SectorSize = UHS_USB_BulkOnly[B]->GetSectorSize(i);
491                                                printf_P(PSTR("LUN:\t\t%u\r\n"), i);
492                                                printf_P(PSTR("Total Sectors:\t%08lx\t%lu\r\n"), sto[i].TotalSectors, sto[i].TotalSectors);
493                                                printf_P(PSTR("Sector Size:\t%04x\t\t%u\r\n"), sto[i].SectorSize, sto[i].SectorSize);
494                                                // get the partition data...
495                                                PT = new PCPartition;
496 
497                                                if(!PT->Init(&sto[i])) {
498                                                        part_t *apart;
499                                                        for(int j = 0; j < 4; j++) {
500                                                                apart = PT->GetPart(j);
501                                                                if(apart != NULL && apart->type != 0x00) {
502                                                                        memcpy(&(parts[cpart]), apart, sizeof (part_t));
503                                                                        printf_P(PSTR("Partition %u type %#02x\r\n"), j, parts[cpart].type);
504                                                                        // for now
505                                                                        if(isfat(parts[cpart].type)) {
506                                                                                Fats[cpart] = new PFAT(&sto[i], cpart, parts[cpart].firstSector);
507                                                                                //int r = Fats[cpart]->Good();
508                                                                                if(Fats[cpart]->MountStatus()) {
509                                                                                        delete Fats[cpart];
510                                                                                        Fats[cpart] = NULL;
511                                                                                } else cpart++;
512                                                                        }
513                                                                }
514                                                        }
515                                                } else {
516                                                        // try superblock
517                                                        Fats[cpart] = new PFAT(&sto[i], cpart, 0);
518                                                        //int r = Fats[cpart]->Good();
519                                                        if(Fats[cpart]->MountStatus()) {
520                                                                //printf_P(PSTR("Superblock error %x\r\n"), r);
521                                                                delete Fats[cpart];
522                                                                Fats[cpart] = NULL;
523                                                        } else cpart++;
524 
525                                                }
526                                                delete PT;
527                                        } else {
528                                                sto[i].Writes = NULL;
529                                                sto[i].Reads = NULL;
530                                                sto[i].Initialize = NULL;
531                                                sto[i].TotalSectors = 0UL;
532                                                sto[i].SectorSize = 0;
533                                        }
534                                }
535 
536                        }
537                }
538 
539                if(fatready) {
540                        if(Fats[0] != NULL) {
541                                struct Pvt * p;
542                                p = ((struct Pvt *)(Fats[0]->storage->private_data));
543                                if(!UHS_USB_BulkOnly[p->B]->LUNIsGood(p->lun)) {
544                                        // media change
545#if !defined(CORE_TEENSY) && defined(__AVR__)
546                                        fadeAmount = 80;
547#endif
548                                        partsready = false;
549                                        for(int i = 0; i < cpart; i++) {
550                                                if(Fats[i] != NULL)
551                                                        delete Fats[i];
552                                                Fats[cpart] = NULL;
553                                        }
554                                        fatready = false;
555                                        notified = false;
556                                        cpart = 0;
557                                }
558 
559                        }
560                }
561                if(fatready) {
562                        FRESULT rc; /* Result code */
563                        UINT bw, br, i;
564                        if(!notified) {
565#if !defined(CORE_TEENSY) && defined(__AVR__)
566                                fadeAmount = 5;
567#endif
568                                notified = true;
569                                FATFS *fs = NULL;
570                                for(int zz = 0; zz < _VOLUMES; zz++) {
571                                        if(Fats[zz]->volmap == 0) fs = Fats[zz]->ffs;
572                                }
573                                printf_P(PSTR("\r\nOpen an existing file (message.txt).\r\n"));
574                                rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ);
575                                if(rc) printf_P(PSTR("Error %i, message.txt not found.\r\n"), rc);
576                                else {
577                                        printf_P(PSTR("\r\nType the file content.\r\n"));
578                                        for(;;) {
579                                                rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &br); /* Read a chunk of file */
580                                                if(rc || !br) break; /* Error or end of file */
581                                                for(i = 0; i < br; i++) {
582                                                        /* Type the data */
583                                                        if(My_Buff_x[i] == '\n')
584                                                                Serial.write('\r');
585                                                        if(My_Buff_x[i] != '\r')
586                                                                Serial.write(My_Buff_x[i]);
587                                                        Serial.flush();
588                                                }
589                                        }
590                                        if(rc) {
591                                                f_close(&My_File_Object_x);
592                                                goto out;
593                                        }
594 
595                                        printf_P(PSTR("\r\nClose the file.\r\n"));
596                                        rc = f_close(&My_File_Object_x);
597                                        if(rc) goto out;
598                                }
599                                printf_P(PSTR("\r\nCreate a new file (hello.txt).\r\n"));
600                                rc = f_open(&My_File_Object_x, "0:/Hello.TxT", FA_WRITE | FA_CREATE_ALWAYS);
601                                if(rc) {
602                                        die(rc);
603                                        goto outdir;
604                                }
605                                printf_P(PSTR("\r\nWrite a text data. (Hello world!)\r\n"));
606                                rc = f_write(&My_File_Object_x, "Hello world!\r\n", 14, &bw);
607                                if(rc) {
608                                        goto out;
609                                }
610                                printf_P(PSTR("%u bytes written.\r\n"), bw);
611 
612                                printf_P(PSTR("\r\nClose the file.\r\n"));
613                                rc = f_close(&My_File_Object_x);
614                                if(rc) {
615                                        die(rc);
616                                        goto out;
617                                }
618outdir:{
619#if _USE_LFN
620                                        char lfn[_MAX_LFN + 1];
621                                        FILINFO My_File_Info_Object_x; /* File information object */
622                                        My_File_Info_Object_x.lfname = lfn;
623#endif
624                                        DIR My_Dir_Object_x; /* Directory object */
625                                        printf_P(PSTR("\r\nOpen root directory.\r\n"));
626                                        rc = f_opendir(&My_Dir_Object_x, "0:/");
627                                        if(rc) {
628                                                die(rc);
629                                                goto out;
630                                        }
631 
632                                        printf_P(PSTR("\r\nDirectory listing...\r\n"));
633#if defined(__AVR__)
634                                        printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
635#endif
636                                        for(;;) {
637#if _USE_LFN
638                                                My_File_Info_Object_x.lfsize = _MAX_LFN;
639#endif
640 
641                                                rc = f_readdir(&My_Dir_Object_x, &My_File_Info_Object_x); /* Read a directory item */
642                                                if(rc || !My_File_Info_Object_x.fname[0]) break; /* Error or end of dir */
643 
644                                                if(My_File_Info_Object_x.fattrib & AM_DIR) {
645                                                        Serial.write('d');
646                                                } else {
647                                                        Serial.write('-');
648                                                }
649                                                Serial.write('r');
650 
651                                                if(My_File_Info_Object_x.fattrib & AM_RDO) {
652                                                        Serial.write('-');
653                                                } else {
654                                                        Serial.write('w');
655                                                }
656                                                if(My_File_Info_Object_x.fattrib & AM_HID) {
657                                                        Serial.write('h');
658                                                } else {
659                                                        Serial.write('-');
660                                                }
661 
662                                                if(My_File_Info_Object_x.fattrib & AM_SYS) {
663                                                        Serial.write('s');
664                                                } else {
665                                                        Serial.write('-');
666                                                }
667 
668                                                if(My_File_Info_Object_x.fattrib & AM_ARC) {
669                                                        Serial.write('a');
670                                                } else {
671                                                        Serial.write('-');
672                                                }
673 
674#if _USE_LFN
675                                                if(*My_File_Info_Object_x.lfname)
676                                                        printf_P(PSTR(" %8lu  %s (%s)\r\n"), My_File_Info_Object_x.fsize, My_File_Info_Object_x.fname, My_File_Info_Object_x.lfname);
677                                                else
678#endif
679                                                        printf_P(PSTR(" %8lu  %s\r\n"), My_File_Info_Object_x.fsize, &(My_File_Info_Object_x.fname[0]));
680                                        }
681                                }
682out:
683                                if(rc) die(rc);
684 
685                                DISK_IOCTL(fs->drv, CTRL_COMMIT, 0);
686                                printf_P(PSTR("\r\nTest completed.\r\n"));
687 
688                        }
689 
690                        if(runtest) {
691                                ULONG ii, wt, rt, start, end;
692                                FATFS *fs = NULL;
693                                for(int zz = 0; zz < _VOLUMES; zz++) {
694                                        if(Fats[zz]->volmap == 0) fs = Fats[zz]->ffs;
695                                }
696                                runtest = false;
697                                f_unlink("0:/10MB.bin");
698                                printf_P(PSTR("\r\nCreate a new 10MB test file (10MB.bin).\r\n"));
699                                rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_WRITE | FA_CREATE_ALWAYS);
700                                if(rc) goto failed;
701                                for(bw = 0; bw < mbxs; bw++) My_Buff_x[bw] = bw & 0xff;
702                                fflush(stdout);
703                                start = (uint32_t)millis();
704                                while(start == (uint32_t)millis());
705                                for(ii = 10485760LU / mbxs; ii > 0LU; ii--) {
706                                        rc = f_write(&My_File_Object_x, My_Buff_x, mbxs, &bw);
707                                        if(rc || !bw) goto failed;
708                                }
709                                rc = f_close(&My_File_Object_x);
710                                if(rc) goto failed;
711                                end = (uint32_t)millis();
712                                wt = (end - start) - 1;
713                                printf_P(PSTR("Time to write 10485760 bytes: %lu ms (%lu sec) \r\n"), wt, (500 + wt) / 1000UL);
714                                rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_READ);
715                                fflush(stdout);
716                                start = (uint32_t)millis();
717                                while(start == (uint32_t)millis());
718                                if(rc) goto failed;
719                                for(;;) {
720                                        rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &bw); /* Read a chunk of file */
721                                        if(rc || !bw) break; /* Error or end of file */
722                                }
723                                end = (uint32_t)millis();
724                                if(rc) goto failed;
725                                rc = f_close(&My_File_Object_x);
726                                if(rc) goto failed;
727                                rt = (end - start) - 1;
728                                printf_P(PSTR("Time to read 10485760 bytes: %lu ms (%lu sec)\r\nDelete test file\r\n"), rt, (500 + rt) / 1000UL);
729failed:
730                                if(rc) die(rc);
731                                DISK_IOCTL(fs->drv, CTRL_COMMIT, 0);
732                                printf_P(PSTR("10MB timing test finished.\r\n"));
733                        }
734                }
735        }
736}

 

 

 

 

 

Ссылка на библиотеку  https://github.com/felis/USB_Host_Shield_2.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

и чо, ты реально думаешь, кто-то будет в этой портянке разбираца?

Armata
Offline
Зарегистрирован: 04.03.2018

Насколько я понимаю создание файла делается командой
 

1rc = f_open(&My_File_Object_x, "0:/Hello.TxT", FA_WRITE | FA_CREATE_ALWAYS);

Открывает и читает команда :
 

1rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ);

Правильно?

Armata
Offline
Зарегистрирован: 04.03.2018

Надеюсь на то что кто-то либо имел дело с подобным и подскажет,либо подскажет по командам.

b707
Offline
Зарегистрирован: 26.05.2017

Armata - не могу не согласится с DetSimen-ом. Вряд ли вам стоит надеятся, что кто-то придет и одним ответом решит проблему. Если хотите - можете конечно еще подождать доброго дядюшку, который бросит все свои дела и с головой погрузится в вашу задачу. Но я бы особо не рассчитывал и пошел другим путем: - у вас есть текст программы и текст библиотеки. Есть диагностический вывод. Я бы для начала покопался. что означают те статусы USB. что возвращает ваш код и попытался погнять, где он затыкается и почему. Ведь по выводу совершенно очевидно, что программа вообще не доходит до работы с файловой системой

Armata
Offline
Зарегистрирован: 04.03.2018

Дело в том что даже при включеном режиме отладки,по инструкции из библиотеки,ничего не меняется.Я пытался найти коды ошибок но пока безуспешно,не знаю где они лежат.

b707
Offline
Зарегистрирован: 26.05.2017

Armata пишет:

Я пытался найти коды ошибок но пока безуспешно,не знаю где они лежат.

ну это просто стыдно. Смотрите тот код, что Вы выложили. Я понимаю. что код писали не вы - но читать-то его и разбираться. что он делает - вы обязаны. Иначе бросьте программирование и идите пиво пить.

Ищите, где печатается статус. Это примерно 450 строка.  Потом поднимаемся чуть выше и смотрим. откуда он берется. Очевидно, статус USB возвращается функциейв строке 440

current_state = Usb.getUsbTaskState();

Далее ищите код этой функции в скетче или в библиотеке - и разбираетесь с ним точно так же. Вполне возможно, что в самой функции Usb.getUsbTaskState(); еще не будет кодов ошибок - тогда точно таким же способом ищем методы, которые жта функция вызывает и смотрим там... и так далее.

Armata
Offline
Зарегистрирован: 04.03.2018

Спасибо,пиво не употребляю.Бросать не собираюсь програмирование.
Понимаю что правилами тут прописано что к таким как я будут относится здесь не с милостью,но всё же помощи прошу не в BLINK.
Ошибки нашел уже 
MASS_ERR_INVALID_LUN 0x13

MASS_ERR_GENERAL_USB_ERROR 0xFF

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

на этот щёт есть хорошая русская поговорка "не по Сеньке шапка".  Именно потому, что не с блинка начал.