Как писать на sd карту быстро и много?)

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Всем привет. Имеется stm32f3discovery с подключенным датчиками: 3 датчика на i2c линии, 1 на uart, и два на АЦП. Требуется данные с этих датчиков писать на sd карту. Частота опроса датчиков 1Кгц. (М и до 300Гц убавить, если надо).
Почитав про особенности работы с sd картой по spi, понял, что писать нужно блоками по 512 байт, так эффективнее. Эти 512 байт можно(? еще не посмотрел дш) уместить в МК.
Так вот не понятно мне, когда я блок из МК на карту писать буду, я ж не смогу данные получать с датчиков? МК занят будет ведь? Тут я понял надо использовать DMA для отправки этого блока 512 на spi, и сразу же вернуться к датчикам. Так вот здесь будет пропуск данных или можно так настроить прерывания, что при заполнении буфера 512 дма сам отправит блок на spi?
Если уж дело на то пошло, то можно и опрашивать датчики через dma и держать МК холодным?)
Реклама
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Как писать на sd карту быстро и много?)

Сообщение drakon »

Вам нужно распараллелить задачи.
1) Поддержка SD: SPI 12 МГц + DMA. Даже при использовании FS можно сделать запись сектора в 512 байт за 1 мс.
2) Опрос по I2C: медленная штука, I2C + DMA тяжелый к подъему, придется Вам использовать поллинг. Эта задача загрузит мк наиболее.
3) Опрос по UART: самый отлаженный интерфейс, работает быстро и четко, UART + DMA.
4) Обработка данных с АЦП: настраиваем регулярный измерения + DMA, получаем прерывание по измерению сразу всех каналов

В итоге Ваша задача совсем не необычная. По алгоритму очень простая. Сложность вызывает написание 4 драйверов для мк, которые не занимают процессорное время во время выполнения задания.
Реклама
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

У меня вопрос именно по записи на sd карту. На stm32f3 нет поддержки sdio, поэтому придется либо адаптировать библиотеку от stm32f4, либо взять arduino, подключить ЛА и записать файл. Потом взять данные с ЛА и повторить тоже самое на stm. Как думаете, прокатит?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18614
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как писать на sd карту быстро и много?)

Сообщение ARV »

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

есть еще библиотека работы с SD-картой от знаменитого Чена - говорят, самая быстрая. но в ней, если я не ошибаюсь, DMA не поддерживается - можно самостоятельно допилить.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

А как Вам мой вариант с пародированием диалога arduino с sd картой?
Просто по многу времени за компьютером не удаётся, поэтомоу стараюсь максимально потготовиться)
Реклама
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Как писать на sd карту быстро и много?)

Сообщение drakon »

FireProoF, я и подразумевал SPI + DMA. Как написал ARV, я использовал Чановскую библиотеку sdio + свои ф-и для работы с SPI.
Если нужно - могу отправить. МК F401. Есть отдельно драйвер SPI + DMA на F100.
Реклама
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

drakon писал(а): Если нужно - могу отправить. МК F401. Есть отдельно драйвер SPI + DMA на F100.
Было бы очень кстати) Как раз есть stm32f103. Карту можно и на него повесить тогда будет.
P.S. den2538i@yandex.ru
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Как писать на sd карту быстро и много?)

Сообщение Myp3ik »

Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Эти библиотеки для МК, имеющих SDIO, как я понял. На stm32f3 его нету(((((
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Как писать на sd карту быстро и много?)

Сообщение drakon »

Проект целиком.
Там есть SPI+DMA, I2S, переделанная diskio под пой драйвер SPI, называется sd_spi_stm32. В придачу FreeRTOS, FAT, MP3.
link
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Как писать на sd карту быстро и много?)

Сообщение Myp3ik »

It supports SPI or SDIO communication
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Новости с передовой)
Нашел библиотеку для подключения SD карту по SPI к МК. Правда не stm32f303, а f103. Замерил скорость записи на карту одного сектора. Получилось 27мс. Долго( Потому что даже на Arduino atmega328 тоже через spi запись идет за 18мс. Попробовал замерить скорость без записи на карту, т.е. определить сколько времени занимет передача именно по spi, вышло 13мс. Значит, даже если я настрою DMA для передачи буфера в SPI, минуя МК, то задержка в 14мс мне обеспечена. :facepalm:
Допустим 14мс. Допустим у меня будет два буфера, куда будут складываться показания с датчиков. Каждый из них объемом 5кБ = 5120 байт. Один опрос всех датчиков, грубо говоря, 30байт. Получается в буфере уместятся 5120/30=170 пакетов. Как выяснилось ранее, отправка одного буфера на карту занимает 14мс. Выходит я могу опрашивать датчики не чаще 1/(14мс/170) = 12,5Кгц :shock:
Если я всё верно рассчитал, то этого более, чем достаточно.
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Как писать на sd карту быстро и много?)

Сообщение drakon »

14мс это время ожидания готовности внутреннего контроллера (бывает и больше). если кушировать и потом писать все копом то время ожидания остается одно - только в начале.
13 мс передавать 514 байт это говно. У Вас частота SPI около 3,16 кГц. Максимальная для stm32 это 12 МГц.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Какая есть.
Вот код функции записи блока на карту:
Спойлер

Код: Выделить всё

uint8_t SD_WriteSector(uint32_t BlockNumb,uint8_t *buff)
{
  uint8_t     response;
  uint16_t    i,wait=0;
 
  //послать команду "запись одного блока" с указанием его номера
  if( SD_sendCommand(WRITE_SINGLE_BLOCK, BlockNumb)) return 1;
 
  CS_ENABLE;
  spi_send(0xfe);    
 
/*Замерял время выполнения этого цикла*/
  //записать буфер сектора в карту
  for(i=0; i<512; i++) spi_send(*buff++);
 
  spi_send(0xff);                //читаем 2 байта CRC без его проверки
  spi_send(0xff);
 
  response = spi_read();
 
  if( (response & 0x1f) != 0x05) //если ошибка при приеме данных картой
  { CS_DISABLE; return 1; }
 
  //ожидаем окончание записи блока данных
  while(!spi_read())             //пока карта занята,она выдает ноль
  if(wait++ > 0xfffe){CS_DISABLE; return 1;}
 
  CS_DISABLE;
  spi_send(0xff);   
  CS_ENABLE;         
 
  while(!spi_read())               //пока карта занята,она выдает ноль
  if(wait++ > 0xfffe){CS_DISABLE; return 1;}
  CS_DISABLE;
 
  return 0;
}
Вот код записи байта по SPI:
Спойлер

Код: Выделить всё

uint8_t spi_send (uint8_t data)
{ 
  while (!(SPI1->SR & SPI_SR_TXE));      //убедиться, что предыдущая передача завершена
  SPI1->DR = data;                       //загружаем данные для передачи
  while (!(SPI1->SR & SPI_SR_RXNE));     //ждем окончания обмена
  return (SPI1->DR);		         //читаем принятые данные
}
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

drakon был прав. Частота SPI действительно была занижена и составляла f_pclk/256. Попробовал делитель 2 - карта не завелась. В итоге остановился на /4. Скорость записи сектора, включая инициализацию карты и т.д. не более 13мс! :tea:
При условии, что в 512 байт у меня будет помещаться 17 пакетов данных, т.е. 17 измерений, то частота опроса датчиков - 1,3кГц. :music:
И это без DMA для записи на карту!

Теперь перехожу ко второму этапу: заполнение буфера измерений с помощью DMA. Для начала возьму буфер в 512 байт.
Вопрос: как правильно заполнять этот буфер, ведь данные у меня DMA будет собирать с разной перефирии (uart, i2c, adc)?
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Ребят, такой вопрос. Есть gps-модуль. Он по UART шлёт пакет символов. Требуется записывать на карту не весь пакет, а выборочные куски (координаты, скорость, ...). Так вот, можно ли настроить DMA следующим образом: один канал принимает данные с UART и складывает их в буфер, второй канал выбирает из буфера нужные байты(они лежат в одном и том же месте) и клладёт их в другой буфер, который уже записывается на карту?
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: Как писать на sd карту быстро и много?)

Сообщение drakon »

FireProoF, можно но это уже извращение. Экономии большой не будет, только не читаемый алгоритм получите. Парсить можно программно и писать на SD не текстом а бинарником, 8 байт на координаты + 4 байта времени.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Ну хорошо, допустим так. Не подскажите как использовать DMA при записи именно моим способом(несколько постов выше)? Как я понял, когда начинается запись сектора по spi, вот этот кусок нужно отдать dma.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Как писать на sd карту быстро и много?)

Сообщение FireProoF »

Подключил все датчики. Собираю данные и записываю на карту. Все бы хорошо, да только время опроса датчиков и время записи плавает. Хочу делать временные отметки в записываемых данных. Вопрос: как это реализовать на stm32f103?
Пробовал заводить таймер на 1мс и так считать время. Но бывает, что этот таймер срабатывает в момент опроса/записи и все рушится.
Ответить

Вернуться в «ARM»