Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
обращение к SPI устройствам, сидящим на разных chip_select - Embedded Linux - Форум - starterkit.ru
Ник:
Пароль:

Контакты

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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:3
Форум » starterkit.ru » Embedded Linux
обращение к SPI устройствам, сидящим на разных chip_select
sergzaytsev
Добавлено 14.08.2017 17:46
0
Сообщение: 1
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
Добрый день, уважаемые коллеги!
Изделие SK-iMX6S-SODIMM, совместное использование с SK-iMX6-MB-SODIMM.
Прописал в dts файле 4 устройства, сидящие на одном SPI, они появились в каталоге /dev с именами spidev0.0, spidev0.1, spidev0.2 и spidev0.3.
Открываются все устройства без ошибок.
Обращение к spidev0.0 идет нормально, к остальным устройствам доступа нет (сигналы chip_select сидят в неактивном состоянии).
Структура spi_ioc_transfer имеет вид:
struct spi_ioc_transfer tr = {
tr.tx_buf = (unsigned long)tx,
tr.rx_buf = (unsigned long)rx,
tr.len = 2,
tr.delay_usecs = delay,
tr.speed_hz = speed,
tr.bits_per_word = bits,
};
При сборке программного проекта вылезают сообщения о том,
что не инициализированы должным образом члены класса
spi_ioc_transfer::cs_change и spi_ioc_transfer::pad.

Подскажите люди добрые, что я не доделал.
Искренне благодарю.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.08.2017 20:22 Сообщение: 2
sasamy
4.70

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

Прописал в dts файле 4 устройства, сидящие на одном SPI, они появились в каталоге /dev с именами spidev0.0, spidev0.1, spidev0.2 и spidev0.3.


Покажите как вы их прописали - пины CS которые вы используете нужно переключить на контроллер GPIO.
Спуститься к концу Подняться к началу
Персональная информация
sergzaytsev
Добавлено 15.08.2017 14:09 Сообщение: 3
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
Sasamy добрый день.

пины CS прописаны в dts так:

&ecspi1 {
fsl,spi-num-chipselects = <4>;
cs-gpios = <&gpio5 25 0>, <&gpio3 0 0>, <&gpio3 1 0>, <&gpio3 2 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1_sodimm>;
status = "okay";

spidev@0 {
compatible = "linux,spidev";
reg = <0>;
spi-max-frequency = <100000>;
};

spidev@1 {
compatible = "linux,spidev";
reg = <1>;
spi-max-frequency = <100000>;
};

spidev@2 {
compatible = "linux,spidev";
reg = <2>;
spi-max-frequency = <100000>;
};

spidev@3 {
compatible = "linux,spidev";
reg = <3>;
spi-max-frequency = <100000>;
};
};

Пины переключены так:

&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog>;

hog {
pinctrl_hog: hoggrp {
fsl,pins = <
/* ECSPI1 Chip Select Signals */
MX6QDL_PAD_CSI0_DAT7__GPIO5_IO25 0x80000000
MX6QDL_PAD_EIM_DA0__GPIO3_IO00 0x80000000
MX6QDL_PAD_EIM_DA1__GPIO3_IO01 0x80000000
MX6QDL_PAD_EIM_DA2__GPIO3_IO02 0x80000000

У меня в этой секции все порты ввода вывода описаны: клавиатура, порты RS-485 и др. Все работает.
Пины эти были ранее привязаны к другим устройствам, которые я не использую - я эти устройства закомментил.

С Уважением, С.Зайцев.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 15.08.2017 14:24 Редактировалось 15.08.2017 14:25 Сообщение: 4
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
По DTS вроде всё в порядке, но

Цитата

MX6QDL_PAD_EIM_DA0__GPIO3_IO00 0x80000000
MX6QDL_PAD_EIM_DA1__GPIO3_IO01 0x80000000
MX6QDL_PAD_EIM_DA2__GPIO3_IO02 0x80000000


конфигурационные пины с подтяжками к 3.3 В через резистоы 11 кОм - возможно в этом дело. Попробуйте для эксперимента другой пин(ы) не EIM
Спуститься к концу Подняться к началу
Персональная информация
sergzaytsev
Добавлено 15.08.2017 17:27 Сообщение: 5
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
Sasamy добрый день еще раз.
А попробовал для примера по управлять через команды:
echo 16 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio16/direction
echo 1 > /sys/class/gpio/gpio16/value
echo 0 > /sys/class/gpio/gpio16/value

два пина: gpio3_0 и gpio7_12, они у меня в dts прописаны одинаково.
Так вот: оба пина ведут себя одинаково - если они распределены как CS за SPI устройством, то они не управляются через GPIO - это понятно - они заняты драйвером SPI. Но когда они свободны, они управляются оба как положено. Т.е. по какой то причине они оба не хотят работать именно с SPI устройством, хотя пин gpio5_25 работает с SPI замечательно (он там работает как сигнал CS0).
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 16.08.2017 03:52 Редактировалось 16.08.2017 04:07 Сообщение: 6
sasamy
4.70

Пункты: 76182
Регистрация: 14.08.2009
Проверил на ядре 4.1.15 с вашими исправлениями DTS - все CS переключаются. Проверял подправленым тестом из документации ядра

http://www.starterkit.ru/html/index.php?name=forum&op=view&id=26958#26961

там передается 1000 трансферов так что даже простым вольтметром видно что CS во время передачи в 0 уходит.

Скорей всего ошибка в вашем коде.
Спуститься к концу Подняться к началу
Персональная информация
sergzaytsev
Добавлено 17.08.2017 20:41 Сообщение: 7
sergzaytsev
0

Пункты: 3694
Регистрация: 19.07.2016
Sasamy спасибо большое, нашел багу, заработало.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux