Перейти к содержанию
    

pim4444

Участник
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Флешка сдохла (( Но была найдена причина ошибок. В моей программе не было зажержки после токена FD. Т.е. взял другую флешку , поставил задержку после многоблочной записи - все заработало верно( ниче не переворачивается, в затык не уходит, в виндовс открывается)
  2. :smile3046: GPIO_ResetBits(GPIOD, GPIO_Pin_7); // SendCMD((23 | 0x80), 10); /*!< Send CMD24 (SD_CMD_WRITE_SINGLE_BLOCK) to write multiple block */ SD_SendCmd( 25 , (sect << 9) +offset , 0xFF); for (i = 0; i< 99; i++) { z = SD_ReadByte(); if (z == 0x00) break; if ( i == 8) goto END_Start_Measure; } /*!< Send a dummy byte */ SD_WriteByte(0xFF); SD_WriteByte(0xFF); while(1) { /*!< Send the data token to signify the start of the data */ SD_WriteByte(0xFC); BuffADCPosW = 1; SPI2->DR = 0x01; SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_TXE , ENABLE); *(uint32_t*)0x40020c18 = 0x00020000;//Reset PD0 (LED1 bright off) while (1) { if ( (((SPI2->SR& 0x02) != 0)&& (SPI2->CR2& 0x80)) == RESET) { SPI2->DR = 0x11;//<<0x1;//<<0x01;//Buffer1[BuffADCPosW]; //<< 0x01; //Buffer1[BuffADCPos]; //<<0x01; // 0x11 <<0x01; BuffADCPosW++; SPI2->CR2 |= (0x80); } if ( BuffADCPosW >= 512) { SPI2->CR2 &= ~(0x80); SD_ReadByte(); SD_ReadByte(); BuffADCPosW = 0; break; } } for (i = 0;; i++) { z = SD_ReadByte(); if (z != 0xff) { if ((z & 0x1f) == 0x5) break; else goto END_Start_Measure; } if (i >= 8) goto END_Start_Measure; } while ( SD_ReadByte() == 0 ) {;} Привел код. Сделано по аналогии коду, что приводился в этой теме ранее (на 4 страничке). Проблема в строчке while ( SD_ReadByte() == 0 ) {;} - если раньше тут затык происходил случайно, то сейчас уверенно каждый раз в этом месте. Проблема тут в том, что после получения DataResponse начинает всегда читать 0 и соответственно бесконечно крутиться в этом цикле. А спустя пару минут частота на линии SCK пропадает.
  3. Выяснилось, что мультиблочная запись происходит, но посмотреть файл в windows нельзя. Файл открывается с ошибкой и ничего не отображается. При поблочной записи такого нет. Почему так? windows не распознает мультиблочную запись? Вторая тут проблема - при такой записи сдвигаются байты. Причем не равномерно. Первый блок нормально. Потом на 1 байт в лево. Иногда первый байт блока теряется. Это то из-за чего может быть? SD не успевает за SPI? Может ли такое искажение быть из за прерываний от АЦП? Еще большая проблема о которой не писал раньше, т.к. возникает не часто, но ее последствия весьма плачевны. В любой момент записи ( подлочной или мультиблочной) начинает валить непрерывно частота по линии SCK. Программа уходит в затык. При перезапуске флешка не отвечает на команды. Приходится выключать питание платы и только после этого флешка нормально работает. Да. offset -смещение от начала файла. Инкрементируется на 512 после записи каждого блока
  4. Пробовал и больше восьми. Всеравно ответ 0xFF
  5. SD_SendCmd( 24 , (sect << 9) +offset , 0xFF); - это команда записи единичного блока CMD24 GPIO_SetBits(GPIOD, GPIO_Pin_7); SPI_I2S_SendData(SPI2, 0xff); GPIO_ResetBits(GPIOD, GPIO_Pin_7); - задержка для устаканивания команды (читал что надо) . Пробова и без нее и большую задержку ставить. resp = SPI_I2S_ReceiveData(SD_SPI); - читаю буфер SPI т.к. там должен быть ответ от SD
  6. После выполнения этого кода SD_SendCmd( 24 , (sect << 9) +offset , 0xFF); GPIO_SetBits(GPIOD, GPIO_Pin_7); SPI_I2S_SendData(SPI2, 0xff); GPIO_ResetBits(GPIOD, GPIO_Pin_7); resp = SPI_I2S_ReceiveData(SD_SPI); resp равна 0xFF, что означает SD_RESPONSE_FAILURE . В чем причина ?? Запись происходит :blink:
  7. Поставил проверку- карта иногда выдает ошибки. Сейчас буду разбирать что к чему. Если знаете коды ответов SD на команду CMD24 , напишите пож. Вы тут не совсем поняли. Наоборот, данные поступают в ровень со временем с записи блока. Увеличить время сбора данных не допустимо
  8. я после отправки использую конструкцию while ( SD_ReadByte() == 0 ) - вроде как тотже Data Response. Вот вот :blink: Но без него не работает! Просто CMD24 + 0xFE - ниче не пишет. Понять не могу как это. Может где задержки ставить надо, м.б. токены так и остаются на диске . Тут не могли бы пояснить. Как есть сейчас : запись и сбор синхронны , есть 2 буфера по 512, пока в один собирается информация , из другого переписывается на SD. При задержке данные просто переписываются :( Подскажите как этого избежать с большим буфером? Ведь если в случае задержки на 4 мс туда ложить данные чтобы не терялись, то 64 таких задержек и буфер полон! В реальном времени он не успеет освободиться , т.к. будут непрерывно идти новые данные.
  9. skripach, вы не совсем правильно меня поняли ) Сейчас я пишу через команду CMD24. При попытке записи через команду CMD25 умерли флешки. Если неправильный алгоритм поправьте меня пож. : CMD25, FC, блок 512, FC, блок 512, ..., FC, блок 512 , FD. Сейчас я наблюдаю картину, которую не могу объяснить никак( Обратите внимание! ): Хотя я пишу данные через команду CMD24 , без записи в конце токена 0xFD данные не сохраняются!!!! Насчет задержек очень печально :( Данные поступают с частотой 512 байт в 4 мс в течении длительного времени. При задержке записи уже на 2 мс возможна потеря важнейших данных, т.к. измеряемый физический процесс длится всего 5 мс, а произойти он может в любой момент измеряемого времени( 10 минут). Тут ни один буфер не поможет.
  10. SDIO + DMA + FatFs

    Привет. Не мог бы ты выложить весь код мультиблоковой записи( как я вижу ты написал свой, ну или по крайней мере не Ченовский :rolleyes: ) Я бьюсь сейчас над похожей проблемой. Подробнее в другой теме форума
  11. На карточку запись происходит посекторно, факт. Для моей карточки размер сектора равен 512 байтам. Так как писать БОЛЬШИМИ кусками ? Последовательность : CMD25... , FC, FC, ..., FC, FD - и есть мультисекторная запись( м.б. можно по другому ?!) , при которой у меня дохнут флешки
  12. ММм. Наверно я плохо объяняю или сам чего то недопонимаю ) После долгих колупаний запись из ОЗУ 512 байт (!!!сектор) в буфер SPI( или SD) стала равна 2 мс - значение постоянное. Смотрю все дело на осцилографе( MOSI,MISO) .После отправки 512 байт за 2 мс , карта уходит в состояние Busy . Оно длится ОБЫЧНО 2,4 мс .Под обычно я подразумеваю, то что оно так длится 19 из 20 раз записи блоков. А иногда превышает это значение в несколько раз. Я бы все понял если бы скачек наблюдался периодично.Но он может произойти и после 50 блоков! Да и размер задержки не фиксирован. Плавает в диапазоне от 2,4 до 12 мс. Предварительное стирание , смена карточки ( другие Gumo и Trancened) картину дела не меняют. Алокация кластеров происходит заранее. Т.е. сама функция записи на протяжении 32 Мб не меняется. Посоветуйте хоть в чем копаться На других форумах ничего внятного по дело сказать не смогли , вся надежда на вас :rolleyes: По 3 вопросу: когда флешки умерли, я использовал такую последовательность : CMD25... , FC, FC, ..., FC, FD. Про 2 проблему не забываем :rolleyes:
  13. Здраствуйте все. Почитал вашу тему- находка для меня Пару месяцев время от времени пытаюсь с нуля разобраться с записью на SD через SPI. Работаю с STM32L. Все бы радовало в библиотеки Чена, но заказчики сказали что запись блока равная 30 мс ( с учетом сбора с АЦП) не годилься. Тут то и начались долгие копания в нутрях библиотек,даташитов и тп. За 2 месяца удалось уменьшить сбор и запись блока до 4 мс. Карточка если что Gumo на 2Гб Но проблема другая. Иногда сильно скачет время записи до 10 мс, а точнее скачет время переписи из буфера SPI на саму SD.Где то читал что оно статично. Кто может подсказать в чем дело?? Проблема №2: поскольку библиотеку расковырял и сделал свой обработчик записи, использованные мной конструкции работают , но как потом выяснилось являются вкорне не правильными. А используя я неправильно токены данных ( замечу что все работает!!! :laughing: ) посылаю CMD24 потом FE, а в конце FD . Изначально использовал этот токен FD при незнании его значения.Теперь если его убираю- запись не происходит. Ктонибудь объяснит в чем дело? Проблема№ 3: Когда узнал как правильно производить мультиблоковую запись - убил 3 флешки. Ипугался и бросил это дело ) Но тут этот вопрос поднимался и я увидел 1 новую строчку , которой не было в моей процедуре SendCMD(ACMD23, lenght); Что делает эта команда? Могли ли умереть флешки при мультиблоковой записи без использования этой команды?
  14. Зраствуйте! Недавно начал работать с платой STM32L152 -EVAL и тут же тупик. При очередной загрузке программы вылезла ошибка с которой бьюсь уже неделю: Mon Dec 12, 2011 15:51:10: Fatal error: Failed to read CPUID for Cortex device Session aborted! Mon Dec 12, 2011 15:51:10: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\config\flashloader\ST\FlashSTM32L15xxxRAM16K.out Mon Dec 12, 2011 15:51:10: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\config\flashloader\ST\FlashSTM32L15xxB.flash Перепробовал все! Но как не бьюсь, плату никак не видно. Segger J-Link STM32 Unlock выдает что подключился J-Link, показывает скорость и дальше выдает ошибку не могу идентифицировать устройство. J-Tag вообще не видется. Подскажите пожалуйста в чем проблема и как ее решить? Заранее благодарен.
×
×
  • Создать...