реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> проблемы с SDHC
alexey123_45
сообщение Feb 20 2018, 06:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Здравствуйте
Сделал драйвер для работы с SDHC картой на STM32F407. Раз в 3 секунды непрерывно записываю данные в файл, файловая система FAT32. Работаю через SPI. Некоторые карты перестают работать(а какие-то совершенно нормально работают) через несколько часов непрерывной записи. Посмотрел осциллографом, карта после операции записи в сектор не выходит из состояния busy. При этом возвращается статус о корректном завершении операции записи.В чем может быть проблема?

Сообщение отредактировал alexey123_45 - Feb 20 2018, 06:37
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 06:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(alexey123_45 @ Feb 20 2018, 09:36) *
Здравствуйте
Сделал драйвер для работы с SDHC картой на STM32F407. Раз в 3 секунды непрерывно записываю данные в файл, файловая система FAT32. Работаю через SPI. Некоторые карты перестают работать через несколько часов непрерывной записи. Посмотрел осциллографом, карта после операции записи в сектор не выходит из состояния busy. При этом возвращается статус о корректном завершении операции записи.В чем может быть проблема?

Не знаю. У меня такая же проблема, но на SDIO. Отправить карту в нокаут просто: записываем сектор, затем читаем какой-то сектор.
Если перед чтением поставить задержку, то все ок. Если снизить частоту интерфейса, то все ок.
Что только не делал со статусом карты и битами SDIO - результат нулевой.
Писать на карту можно сколь-угодно долго - никаких проблем. Но последователь чтение-запись-чтение без пауз - получаем из любой карты busy-труп.
В Спецификации SD и в Интернете - пустота по этому вопросу.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Feb 20 2018, 06:52
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



Т.е. попробовать снизить частоту записи? Да,действительно, в спецификации ничего не сказано. Но есть еще один эффект, когда перебиваешь питание прибора, и соответственно, SDHC карты, то карта продолжает сбоить на этом же месте.Т.е. дальше запись не идет. Первое же чтение-запись и намертво залипает в busy

Сообщение отредактировал alexey123_45 - Feb 20 2018, 08:03
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 09:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(alexey123_45 @ Feb 20 2018, 09:52) *
Т.е. попробовать снизить частоту записи?

Нет - запись можно вести потоком без каких-либо пауз с максимально возможным темпом.
Как только в статусе появляется ready - сразу же начинаю новую запись, и нет проблем.
Но при использовании FAT нужно получать очередной свободный кластер, для этого придется считать с карты.
Так вот такое считывание после предварительной записи отправляет карты в вечный busy.
Цитата(alexey123_45 @ Feb 20 2018, 09:52) *
карта продолжает сбоить на этом же месте.Т.е. дальше запись не идет. Первое же чтение-запись и намертво залипает в busy

Скорее всего, это момент считывания таблицы FAT для поиска свободного кластера.
Go to the top of the page
 
+Quote Post
alexey123_45
сообщение Feb 20 2018, 09:56
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 1-03-13
Пользователь №: 75 850



А как это можно победить?
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 10:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(alexey123_45 @ Feb 20 2018, 12:56) *
А как это можно победить?

Как победить - не знаю.
Я сделал костыль: в функции "записать сектор" смотрю, если перед этим была операция чтения, то выжидаю некую паузу.
Выше слегка наврал: проблема происходит после запись-чтение-запись.
Если сделать запись-чтение-пауза-запись, то все ок.
Код
int SDIO_Read(DWORD sector, BYTE *buf, const int buf_size, const void *p, tSDIO_CALLBACK *cb)
{
...
    sdio_last_rd = 1;
...
}

int SDIO_Write(DWORD sector, BYTE *buf, const int buf_size, const void *p, tSDIO_CALLBACK *cb)
{
...
    if(sdio_last_rd)
    {
        sdio_last_rd = 0;
        for(i = 0; i < 500; i++) SDIO_Delay();
    }
...
}
Go to the top of the page
 
+Quote Post
картошка
сообщение Feb 20 2018, 12:40
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673



Цитата(alexey123_45 @ Feb 20 2018, 09:36) *
Сделал драйвер для работы с SDHC картой на STM32F407.


Просто для статистики. Используете HAL или StdLib ???

Была такая проблема с определенными секторами. По моему с секурити областями связано. Так и не решил. Использовал другую карту где отсутствует такая вещь. Было еще пару проблем с делай тимингами CS линии, когда привинчивал FAT через SPI.

Сообщение отредактировал картошка - Feb 20 2018, 12:47
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 12:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(картошка @ Feb 20 2018, 15:40) *
Просто для статистики. Используете HAL или StdLib ???

В копилку статистики: я не использую.
Go to the top of the page
 
+Quote Post
картошка
сообщение Feb 20 2018, 13:04
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-12-05
Из: Odessa
Пользователь №: 12 673



Цитата(adnega @ Feb 20 2018, 15:46) *
В копилку статистики: я не использую.


Извиняюсь за оскорбление Вашего трудового стажа . a14.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 14:49
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(картошка @ Feb 20 2018, 16:04) *
Извиняюсь за оскорбление Вашего трудового стажа . a14.gif

На старой работе, где руководство запрещало "собственные велосипеды", в одном из проектов я принципиально решил использовать StdLib и другие
готовые решения (FreeRTOS, uIP). Докладываю: это был первый и последний раз. По времени разработки, изучения, решения проблем - сделать
свой велосипед было бы гораздо легче и лучше. Мне повезло, что у меня уже есть богатая библиотека решений, но для новичков со стандартными
средствами запуск будет быстрее, чем писать все самому. При этом помним большими буквами, что применение библиотек не освобождает
от необходимости чтения DS, RM, AN и т.п. Иногда приходится изучать StdLib|HAL, чтобы понять как производитель рекомендует работать.
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Feb 20 2018, 16:46
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(alexey123_45 @ Feb 20 2018, 12:36) *
При этом возвращается статус о корректном завершении операции записи.В чем может быть проблема?

https://www.lijingquan.net/wp-content/uploa...icationV6.0.pdf
Страница 35.
Переходы межу операциями чтения и записи - должны подтверждаться сменой статуса режима карты. Через определённое время бездействия (зависит от карты) - алгоритм сам переходит в состояние Stand-by State, даже без проверки статуса. Но это время не нормированное, почти лотерея.
И да, писать драйвер для SD - это наверное второе по увлекательности занятие.
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 20 2018, 17:30
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AVI-crak @ Feb 20 2018, 19:46) *
Через определённое время бездействия (зависит от карты) - алгоритм сам переходит в состояние Stand-by State, даже без проверки статуса. Но это время не нормированное, почти лотерея.

Карта, с которой работаешь должна быть в режиме "tran". Из этого режима ее можно читать и писать.
Про произвольный переход по таймауту в режим "stby" ничего не знаю - Card State Transition Table говорит,
что из "tran" в "stby" можно попасть только через CMD7.
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Feb 20 2018, 23:06
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Это так, но при длительной записи - встроенный в карту микропроцессор оптимизирует запись, проще говоря - не снимает режим записи. Это часть оптимизации на скорость. Когда чтение чередуется с записью - команды выполняются безусловно.
Этот эффект можно увидеть на графиках скорости записи разных карт одного класса, всегда есть такие что чуть-чуть вырываются в перёд.
Go to the top of the page
 
+Quote Post
Grape
сообщение Feb 21 2018, 09:52
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 22-10-04
Пользователь №: 956



Цитата(adnega @ Feb 20 2018, 09:44) *
Не знаю. У меня такая же проблема, но на SDIO. Отправить карту в нокаут просто: записываем сектор, затем читаем какой-то сектор.
...
Карта, с которой работаешь должна быть в режиме "tran". Из этого режима ее можно читать и писать.


Правильно я понимаю, и перед записью и перед чтением есть проверка на состояние "tran"?
и все равно - нокаут, если не вставить задержку?
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 21 2018, 11:05
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Grape @ Feb 21 2018, 12:52) *
Правильно я понимаю, и перед записью и перед чтением есть проверка на состояние "tran"?
и все равно - нокаут, если не вставить задержку?

Ага. Каждая процедура чтения и записи сектора начинается с CMD13_SEND_STATUS.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 12:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016