Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:3
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:7
Форум » starterkit.ru » Embedded Linux
как ускорить работу SPI
sergzaytsev
Добавлено 16.09.2016 18:08
0
Сообщение: 1
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
Добрый вечер, уважаемые коллеги!
Изделие SK-iMX6S-SODIMM, совместное использование с SK-iMX6-MB-SODIMM.
Настроил ecspi2 для работы с SPI FLASH, пишу/читаю с помощью spi_ioc_transfer вот таким образом (код ниже):
tx[0] = CMD;
tx[1] = Data0;
tx[2] = Data1;
struct spi_ioc_transfer tr = {
tr.tx_buf = (unsigned long)tx,
tr.rx_buf = (unsigned long)rx,
tr.len = ARRAY_SIZE(tx),
tr.delay_usecs = delay,
tr.speed_hz = speed,
tr.bits_per_word = bits,
};
ret = ioctl(sfd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1) qDebug() << "Can't send spi message";

delay = 1, speed = 100кГц, bits = 8.
Осциллографом увидел, что трансферы выполняются медленно, всего 25 трансферов в секунду (период 40мсек), причем сам трансфер выполняется за 300 микросекунд.
Можно ли увеличить производительность канала SPI и как увеличить количество выполненных трансферов в секунду?
Заранее благодарен.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 16.09.2016 18:29 Сообщение: 2
sasamy
4.70

Пункты: 76642
Регистрация: 14.08.2009
В ядре 3.14.14 spi работает без DMA поэтому такая низкая пропускная способность. Попробуйте 4.1.15 - там в драйвере spi есть поддержка dma.
Спуститься к концу Подняться к началу
Персональная информация
sergzaytsev
Добавлено 17.09.2016 00:48 Сообщение: 3
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
75 байт в секунду - это скорость улитки. Причем я вижу на осциллографе, что трансфер выполняется мгновенно, а потом процессор 40 миллисекунд простаивает, почему - непонятно. Я в бесконечном цикле выполняю один трансфер за другим, больше процессор ничем не занят.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 17.09.2016 13:01 Редактировалось 17.09.2016 13:16 Сообщение: 4
sasamy
4.70

Пункты: 76642
Регистрация: 14.08.2009
Цитата

75 байт в секунду


Какие-то сказки рассказываете. Вот немного подправленый тест

http://pastebin.com/WXfphS02

из документации ядра

http://lxr.free-electrons.com/source/Documentation/spi/spidev_test.c?v=3.14

подправлено для 1000 трансферов, в каждом передается 38 байт

i = 1000;
while (i--)
transfer(fd);

передача в синхронном режиме

http://lxr.free-electrons.com/source/Documentation/spi/spidev?v=3.14#L107

Цитата

- At this time there is no async I/O support; everything is purely synchronous.


Цитата

# uname -a
Linux buildroot 3.14.14 #87 SMP Sat Sep 17 11:39:08 MSK 2016 armv7l GNU/Linux
# time ./spidev_test
spi mode: 0
bits per word: 8
max speed: 1000000 Hz (1000 KHz)
real 0m 0.67s
user 0m 0.00s
sys 0m 0.02s
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux