Как писать на sd карту быстро и много?)
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Как писать на sd карту быстро и много?)
Всем привет. Имеется stm32f3discovery с подключенным датчиками: 3 датчика на i2c линии, 1 на uart, и два на АЦП. Требуется данные с этих датчиков писать на sd карту. Частота опроса датчиков 1Кгц. (М и до 300Гц убавить, если надо).
Почитав про особенности работы с sd картой по spi, понял, что писать нужно блоками по 512 байт, так эффективнее. Эти 512 байт можно(? еще не посмотрел дш) уместить в МК.
Так вот не понятно мне, когда я блок из МК на карту писать буду, я ж не смогу данные получать с датчиков? МК занят будет ведь? Тут я понял надо использовать DMA для отправки этого блока 512 на spi, и сразу же вернуться к датчикам. Так вот здесь будет пропуск данных или можно так настроить прерывания, что при заполнении буфера 512 дма сам отправит блок на spi?
Если уж дело на то пошло, то можно и опрашивать датчики через dma и держать МК холодным?)
Почитав про особенности работы с sd картой по spi, понял, что писать нужно блоками по 512 байт, так эффективнее. Эти 512 байт можно(? еще не посмотрел дш) уместить в МК.
Так вот не понятно мне, когда я блок из МК на карту писать буду, я ж не смогу данные получать с датчиков? МК занят будет ведь? Тут я понял надо использовать DMA для отправки этого блока 512 на spi, и сразу же вернуться к датчикам. Так вот здесь будет пропуск данных или можно так настроить прерывания, что при заполнении буфера 512 дма сам отправит блок на spi?
Если уж дело на то пошло, то можно и опрашивать датчики через dma и держать МК холодным?)
- Реклама
Re: Как писать на sd карту быстро и много?)
Вам нужно распараллелить задачи.
1) Поддержка SD: SPI 12 МГц + DMA. Даже при использовании FS можно сделать запись сектора в 512 байт за 1 мс.
2) Опрос по I2C: медленная штука, I2C + DMA тяжелый к подъему, придется Вам использовать поллинг. Эта задача загрузит мк наиболее.
3) Опрос по UART: самый отлаженный интерфейс, работает быстро и четко, UART + DMA.
4) Обработка данных с АЦП: настраиваем регулярный измерения + DMA, получаем прерывание по измерению сразу всех каналов
В итоге Ваша задача совсем не необычная. По алгоритму очень простая. Сложность вызывает написание 4 драйверов для мк, которые не занимают процессорное время во время выполнения задания.
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 карту быстро и много?)
У меня вопрос именно по записи на sd карту. На stm32f3 нет поддержки sdio, поэтому придется либо адаптировать библиотеку от stm32f4, либо взять arduino, подключить ЛА и записать файл. Потом взять данные с ЛА и повторить тоже самое на stm. Как думаете, прокатит?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18614
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как писать на sd карту быстро и много?)
надо иметь 2 буфера по 512 байт
в один пишите данные, другой в это время переносится на карту при помощи DMA, потом они меняются местами.
меняются местами - это значит, меняются значения указателей, не более того
есть еще библиотека работы с SD-картой от знаменитого Чена - говорят, самая быстрая. но в ней, если я не ошибаюсь, DMA не поддерживается - можно самостоятельно допилить.
в один пишите данные, другой в это время переносится на карту при помощи DMA, потом они меняются местами.
меняются местами - это значит, меняются значения указателей, не более того
есть еще библиотека работы с SD-картой от знаменитого Чена - говорят, самая быстрая. но в ней, если я не ошибаюсь, DMA не поддерживается - можно самостоятельно допилить.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
А как Вам мой вариант с пародированием диалога arduino с sd картой?
Просто по многу времени за компьютером не удаётся, поэтомоу стараюсь максимально потготовиться)
Просто по многу времени за компьютером не удаётся, поэтомоу стараюсь максимально потготовиться)
- Реклама
Re: Как писать на sd карту быстро и много?)
FireProoF, я и подразумевал SPI + DMA. Как написал ARV, я использовал Чановскую библиотеку sdio + свои ф-и для работы с SPI.
Если нужно - могу отправить. МК F401. Есть отдельно драйвер SPI + DMA на F100.
Если нужно - могу отправить. МК F401. Есть отдельно драйвер SPI + DMA на F100.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Было бы очень кстати) Как раз есть stm32f103. Карту можно и на него повесить тогда будет.drakon писал(а): Если нужно - могу отправить. МК F401. Есть отдельно драйвер SPI + DMA на F100.
P.S. den2538i@yandex.ru
Re: Как писать на sd карту быстро и много?)
Может пригодится
http://stm32f4-discovery.net/2014/07/li ... x-devices/
http://stm32f4-discovery.net/download/t ... pdmdl=1774
http://stm32f4-discovery.net/2014/07/li ... x-devices/
http://stm32f4-discovery.net/download/t ... pdmdl=1774
Иван Сусанин - первый полупроводник 
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Эти библиотеки для МК, имеющих SDIO, как я понял. На stm32f3 его нету(((((
Re: Как писать на sd карту быстро и много?)
Проект целиком.
Там есть SPI+DMA, I2S, переделанная diskio под пой драйвер SPI, называется sd_spi_stm32. В придачу FreeRTOS, FAT, MP3.
link
Там есть SPI+DMA, I2S, переделанная diskio под пой драйвер SPI, называется sd_spi_stm32. В придачу FreeRTOS, FAT, MP3.
link
Re: Как писать на sd карту быстро и много?)
It supports SPI or SDIO communication
Иван Сусанин - первый полупроводник 
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Новости с передовой)
Нашел библиотеку для подключения SD карту по SPI к МК. Правда не stm32f303, а f103. Замерил скорость записи на карту одного сектора. Получилось 27мс. Долго( Потому что даже на Arduino atmega328 тоже через spi запись идет за 18мс. Попробовал замерить скорость без записи на карту, т.е. определить сколько времени занимет передача именно по spi, вышло 13мс. Значит, даже если я настрою DMA для передачи буфера в SPI, минуя МК, то задержка в 14мс мне обеспечена.
Допустим 14мс. Допустим у меня будет два буфера, куда будут складываться показания с датчиков. Каждый из них объемом 5кБ = 5120 байт. Один опрос всех датчиков, грубо говоря, 30байт. Получается в буфере уместятся 5120/30=170 пакетов. Как выяснилось ранее, отправка одного буфера на карту занимает 14мс. Выходит я могу опрашивать датчики не чаще 1/(14мс/170) = 12,5Кгц
Если я всё верно рассчитал, то этого более, чем достаточно.
Нашел библиотеку для подключения SD карту по SPI к МК. Правда не stm32f303, а f103. Замерил скорость записи на карту одного сектора. Получилось 27мс. Долго( Потому что даже на Arduino atmega328 тоже через spi запись идет за 18мс. Попробовал замерить скорость без записи на карту, т.е. определить сколько времени занимет передача именно по spi, вышло 13мс. Значит, даже если я настрою DMA для передачи буфера в SPI, минуя МК, то задержка в 14мс мне обеспечена.
Допустим 14мс. Допустим у меня будет два буфера, куда будут складываться показания с датчиков. Каждый из них объемом 5кБ = 5120 байт. Один опрос всех датчиков, грубо говоря, 30байт. Получается в буфере уместятся 5120/30=170 пакетов. Как выяснилось ранее, отправка одного буфера на карту занимает 14мс. Выходит я могу опрашивать датчики не чаще 1/(14мс/170) = 12,5Кгц
Если я всё верно рассчитал, то этого более, чем достаточно.
Re: Как писать на sd карту быстро и много?)
14мс это время ожидания готовности внутреннего контроллера (бывает и больше). если кушировать и потом писать все копом то время ожидания остается одно - только в начале.
13 мс передавать 514 байт это говно. У Вас частота SPI около 3,16 кГц. Максимальная для stm32 это 12 МГц.
13 мс передавать 514 байт это говно. У Вас частота SPI около 3,16 кГц. Максимальная для stm32 это 12 МГц.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Какая есть.
Вот код функции записи блока на карту:
Вот код записи байта по SPI:
Вот код функции записи блока на карту:
Спойлер
Код: Выделить всё
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;
}Спойлер
Код: Выделить всё
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 карту быстро и много?)
drakon был прав. Частота SPI действительно была занижена и составляла f_pclk/256. Попробовал делитель 2 - карта не завелась. В итоге остановился на /4. Скорость записи сектора, включая инициализацию карты и т.д. не более 13мс!
При условии, что в 512 байт у меня будет помещаться 17 пакетов данных, т.е. 17 измерений, то частота опроса датчиков - 1,3кГц.
И это без DMA для записи на карту!
Теперь перехожу ко второму этапу: заполнение буфера измерений с помощью DMA. Для начала возьму буфер в 512 байт.
Вопрос: как правильно заполнять этот буфер, ведь данные у меня DMA будет собирать с разной перефирии (uart, i2c, adc)?
При условии, что в 512 байт у меня будет помещаться 17 пакетов данных, т.е. 17 измерений, то частота опроса датчиков - 1,3кГц.
И это без DMA для записи на карту!
Теперь перехожу ко второму этапу: заполнение буфера измерений с помощью DMA. Для начала возьму буфер в 512 байт.
Вопрос: как правильно заполнять этот буфер, ведь данные у меня DMA будет собирать с разной перефирии (uart, i2c, adc)?
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Ребят, такой вопрос. Есть gps-модуль. Он по UART шлёт пакет символов. Требуется записывать на карту не весь пакет, а выборочные куски (координаты, скорость, ...). Так вот, можно ли настроить DMA следующим образом: один канал принимает данные с UART и складывает их в буфер, второй канал выбирает из буфера нужные байты(они лежат в одном и том же месте) и клладёт их в другой буфер, который уже записывается на карту?
Re: Как писать на sd карту быстро и много?)
FireProoF, можно но это уже извращение. Экономии большой не будет, только не читаемый алгоритм получите. Парсить можно программно и писать на SD не текстом а бинарником, 8 байт на координаты + 4 байта времени.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Ну хорошо, допустим так. Не подскажите как использовать DMA при записи именно моим способом(несколько постов выше)? Как я понял, когда начинается запись сектора по spi, вот этот кусок нужно отдать dma.
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Как писать на sd карту быстро и много?)
Подключил все датчики. Собираю данные и записываю на карту. Все бы хорошо, да только время опроса датчиков и время записи плавает. Хочу делать временные отметки в записываемых данных. Вопрос: как это реализовать на stm32f103?
Пробовал заводить таймер на 1мс и так считать время. Но бывает, что этот таймер срабатывает в момент опроса/записи и все рушится.
Пробовал заводить таймер на 1мс и так считать время. Но бывает, что этот таймер срабатывает в момент опроса/записи и все рушится.


