Author Topic: SPI  (Read 30258 times)

Rizvan

  • Guest
SPI
« on: February 09, 2014, 10:10:24 am »
Всем привет. Скажите пожалуйста, если ли у кого нибудь опыт работы с SPI на кубике, на что ориентироваться, какую OS для этого лучше использовать, какие инструменты?

Offline Hve

  • Newbie
  • *
  • Posts: 39
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #1 on: February 09, 2014, 11:22:09 am »
Есть в англоязычной ветке такая тема http://www.cubieforums.com/index.php/topic,941.0.html Судя по последнему посту и ссылке не всё у всех удачно проходит

Offline av

  • Newbie
  • *
  • Posts: 9
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #2 on: March 30, 2014, 12:54:16 pm »
Сегодня я его заборол! %)

Использую cubian-text-mode плюс самостоятельно поставленный LXDE.

Для запуска этого зверя потребовалось пересобрать ядро:
0. читаем про включение поддержки (http://docs.cubieboard.org/tutorials/dvk521/documentations/a20/driver_porting_and_configuration)
1. берём ядро от patwood: git clone  git@github.com:patrickhwood/linux-sunxi.git
2. Выкачиваем конфиг с работающего cubietruck (/proc/config.gz), кладём его в ядро как .config
2. ищем в интернетах заветный файл spi-sun7i.c ибо ссылка из доки не работает (http://dl.cubieboard.org/parteners/waveshare/Source_Code/a20-cubieboard-dvk/driver%20source/spi-sun7i.c)
3. правим всё, как написано в мануале. Я дополнительно в make передавал "SUBARCH=mach-sun7i". Не знаю, насколько это важно
Code: [Select]
$make ARCH=arm SUBARCH=mach-sun7i gconfig
$make -j4 ARCH=arm SUBARCH=mach-sun7i  CROSS_COMPILE=arm-linux-gnueabihf- uImage modules
$make ARCH=arm SUBARCH=mach-sun7i  CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=output modules_install
4. заливаем собранное ядро и модули в Кубик
5. правим script.bin и перезагружаемся
6. sudo modprobe spi-sun7i && ls /dev/spi*
7. PROFIT! Profit??
8. Не! Правим _на_кубике_ файл /usr/include/linux/spi/spidev.h: добавляем строчку "__u16           interbyte_usecs;" в структуру struct spi_ioc_transfer. Должно выйти так:
Code: [Select]
struct spi_ioc_transfer {
        __u64           tx_buf;
        __u64           rx_buf;

        __u32           len;
        __u32           speed_hz;

        __u16           interbyte_usecs; // <<===
        __u16           delay_usecs;
        __u8            bits_per_word;
        __u8            cs_change;
        __u32           pad;
9. Ищем (в ядре например) spidev_test.c и компилим его.
10. замыкаем 8-9 (spidev2.0 MISO/MOSI) ноги и запускаем ./a.out:
Code: [Select]
# ./a.out
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
« Last Edit: March 30, 2014, 12:56:41 pm by av »

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #3 on: April 10, 2014, 12:24:24 am »
Отличная тема! Помогла мне поднять SPI! Большое спасибо! Но хотелось бы запустить на этом SPI радиомодуль nRF24l01! Можно ли портировать на кубик библиотеку RF24 от resperry pi для общения кубика например с arduino? Погуглив не нашел решения данной проблемы... В програмировании я можно сказать новичек и смутно понимаю как работают библиотеки... Буду благодарен любой помощо!

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: SPI
« Reply #4 on: April 13, 2014, 04:30:28 pm »
Занимаюсь как бы тем же - пытаюсь запустить nRF24l01 на cubietruck.

Есть даже портированная на кубик либа rf24-rpi, но по неким астрологическим причинам добится нормальной работы так и не удалось...(грешу на модули)

В либе присутствуют два варианта управлением CSN - аппаратный и программный. Программный включается дефайном SPI_SOFTWARE_CSN в файле rf24_config.h.
Собирается вся либа командой make all. Тестовая программа запускается командой sudo ./rf24-test

Далее, о настройке spi.
В script.fex секция spi-девайса выглядит так:

Code: [Select]
[spi0_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PI10<2><default><default><default>
spi_cs1 = port:PI14<2><default><default><default>
spi_sclk = port:PI11<2><default><default><default>
spi_mosi = port:PI12<2><default><default><default>
spi_miso = port:PI13<2><default><default><default>

[spi1_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA00<3><default><default><default>
spi_cs1 = port:PA04<3><default><default><default>
spi_sclk = port:PA01<3><default><default><default>
spi_mosi = port:PA02<3><default><default><default>
spi_miso = port:PA03<3><default><default><default>

[spi2_para]
spi_used = 1
spi_cs_bitmap = 1
spi_cs0 = port:PC19<3><default><default><default>
spi_cs1 = port:PB13<2><default><default><default>
spi_sclk = port:PC20<3><default><default><default>
spi_mosi = port:PC21<3><default><default><default>
spi_miso = port:PC22<3><default><default><default>

[spi3_para]
spi_used = 0
spi_cs_bitmap = 1
spi_cs0 = port:PA05<3><default><default><default>
spi_cs1 = port:PA09<3><default><default><default>
spi_sclk = port:PA06<3><default><default><default>
spi_mosi = port:PA07<3><default><default><default>
spi_miso = port:PA08<3><default><default><default>

[spi_devices]
spi_dev_num = 1

[spi_board0]
modalias = "spidev"
max_speed_hz = 8000000
bus_num = 2
chip_select = 0
mode = 0
full_duplex = 1
manual_cs = 0

В качестве ce используется 10й пин cn8 (pb16). За csn в программном режиме выступает pb17 (вроде, контакт 12-cn8, не помню точно...). Пины spi - 5 (cs0), 6 (mosi), 7 (sck), 8 (miso) коннектора cn8.
Да, вся библиотека настроена на использование /dev/spidev2.0

Пробуй, напишеш о результатах.
Лично мне на любое обращение к трансиверу приходит ответ 0xE...
« Last Edit: April 13, 2014, 04:36:26 pm by bearpaw »

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #5 on: April 16, 2014, 06:42:35 am »
При попытке собрать библиотеку выдает следующее:
Code: [Select]
root@Cubian:/home/cubie/gitwork/RF24/librf24-rpi/librf24# make all
g++ -Wall -fPIC -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -c RF24.cpp
In file included from /usr/include/c++/4.6/bits/char_traits.h:41:0,
                 from /usr/include/c++/4.6/string:42,
                 from spi.h:11,
                 from RF24_config.h:23,
                 from RF24.cpp:10:
/usr/include/c++/4.6/bits/stl_algobase.h: In function ‘int std::__lg(int)’:
/usr/include/c++/4.6/bits/stl_algobase.h:981:15: sorry, unimplemented: Thumb-1 hard-float VFP ABI
RF24.h: In constructor ‘RF24::RF24(std::string, uint32_t, uint8_t)’:
RF24.h:52:12: warning: ‘RF24::spispeed’ will be initialized after [-Wreorder]
RF24.h:50:11: warning:   ‘uint8_t RF24::ce_pin’ [-Wreorder]
RF24.cpp:241:1: warning:   when initialized here [-Wreorder]
make: *** [RF24.o] Error 1
Перед сборкой библиотеки не нужно править какие не будь файлы?
У меня первый кубик, это не как не влияет на сборку библиотеки? Если нет то скиньте, пожалуйста, библиотеку которая у вас собралась.
« Last Edit: April 16, 2014, 06:44:27 am by Mochalov_da »

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: SPI
« Reply #6 on: April 16, 2014, 07:19:00 am »
При попытке собрать библиотеку выдает следующее:
Code: [Select]
root@Cubian:/home/cubie/gitwork/RF24/librf24-rpi/librf24# make all
g++ -Wall -fPIC -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -c RF24.cpp
In file included from /usr/include/c++/4.6/bits/char_traits.h:41:0,
                 from /usr/include/c++/4.6/string:42,
                 from spi.h:11,
                 from RF24_config.h:23,
                 from RF24.cpp:10:
/usr/include/c++/4.6/bits/stl_algobase.h: In function ‘int std::__lg(int)’:
/usr/include/c++/4.6/bits/stl_algobase.h:981:15: sorry, unimplemented: Thumb-1 hard-float VFP ABI
RF24.h: In constructor ‘RF24::RF24(std::string, uint32_t, uint8_t)’:
RF24.h:52:12: warning: ‘RF24::spispeed’ will be initialized after [-Wreorder]
RF24.h:50:11: warning:   ‘uint8_t RF24::ce_pin’ [-Wreorder]
RF24.cpp:241:1: warning:   when initialized here [-Wreorder]
make: *** [RF24.o] Error 1
Перед сборкой библиотеки не нужно править какие не будь файлы?
У меня первый кубик, это не как не влияет на сборку библиотеки? Если нет то скиньте, пожалуйста, библиотеку которая у вас собралась.

То, что Вы собираете - либа для Распберри и работать на кубике не будет. Если всё же хотите скомпилить её - уберите флаги компилятора
Code: [Select]
-march=armv6zk -mtune=arm1176jzf-s
Советую всё же скачать файл из вложения в моём предыдущем посте, и собирать его... Там уже портированая для кубитрака либа.
Но, да, править придётся. Всё что надо поправить для совместимости с первым кубибордом - работу с gpio.
« Last Edit: April 16, 2014, 07:22:41 am by bearpaw »

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #7 on: April 17, 2014, 08:15:23 am »
Но, да, править придётся. Всё что надо поправить для совместимости с первым кубибордом - работу с gpio.
А можно по подробнее... где и что нужно поправить для работы моих GPIO?

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: SPI
« Reply #8 on: April 17, 2014, 11:19:13 am »
Часов в 11 по по киевскому времени выложу адаптированую под a10 библиотеку.

sent from my samsung i9100


Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: SPI
« Reply #9 on: April 17, 2014, 04:02:52 pm »
Интересная для меня тема. Имею два штука nRF24L01+. Пока учу матчасть.
Вопросы: а есть ли либа на пуре C, без плюсов ? Чем отличаются spidev и spidev2.0 (у меня ядро 3.4.61) ?
« Last Edit: April 23, 2014, 04:15:04 pm by UnКаЙF »

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: SPI
« Reply #10 on: April 17, 2014, 04:31:42 pm »
Так, выкладываю версию для первого кубика
По компиляции и запуску всё так же.
Единственное что необходимо, так это поменять в файле main.cpp задание портов и SPI-девайса
Code: [Select]
RF24 radio(SUNXI_GPB(16), SUNXI_GPB(17), "/dev/spidev2.0");на подходящие Вам.
Параметры конструктора:
Code: [Select]
RF24(uint16_t _cepin, uint16_t _cspin, string spidev);
Желаю удачи при тестировании!

Offline bearpaw

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +7/-0
    • View Profile
Re: SPI
« Reply #11 on: April 17, 2014, 05:08:16 pm »
Интересная для меня тема. Имею два штука nRF24L01 (не 01 и +). Пока учу матчасть.
Вопросы: а есть ли либа на пуре C, без плюсов ? Чем отличаются spidev и spidev2.0 (у меня ядро 3.4.61) ?

Для пуре С не знаю, а что мешает юзать плюсы?
spidev2.0: 2 - номер шины, 0 - номер девайса (ChipSelect'a)
« Last Edit: April 17, 2014, 11:47:05 pm by bearpaw »

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: SPI
« Reply #12 on: April 18, 2014, 05:04:34 am »
Quote
Для пуре С не знаю, а что мешает юзать плюсы?
Мешает собственный мозг.  ;D Туго у мя с плюсами.
Quote
spidev2.0: 2 - номер шины, 0 - номер девайса
Думал, что это версия драйвера.

Offline UnКаЙF

  • Full Member
  • ***
  • Posts: 241
  • Karma: +9/-6
    • View Profile
Re: SPI
« Reply #13 on: April 21, 2014, 11:35:03 am »
По nRF24L01 много граблей можно обойти почитав: http://kazus.ru/forums/showthread.php?t=19992&highlight=niXto
В, частности, советуют вешать электролит на питание, - иначе сброс настроек при переключении режимов.
________
Прочитал ДШ и some over...  Делаю переходник для подключения двух nRF24L01+ к SPI2 на кубитрак.
« Last Edit: April 23, 2014, 04:16:45 pm by UnКаЙF »

Offline Mochalov_da

  • Newbie
  • *
  • Posts: 25
  • Karma: +0/-0
    • View Profile
Re: SPI
« Reply #14 on: April 22, 2014, 06:46:02 am »
Тест запустился!!! Только не знаю радоваться ли?! Вот что он выдает:
Code: [Select]
STATUS = 0xff RX_DR=1 TX_DS=1 MAX_RT=1 RX_P_NO=7 TX_FULL=1
RX_ADDR_P0-1 = 0xffffffffff 0xffffffffff
RX_ADDR_P2-5 = 0xff 0xff 0xff 0xff
TX_ADDR = 0xffffffffff
RX_PW_P0-6 = 0xff 0xff 0xff 0xff 0xff 0xff
EN_AA = 0xff
EN_RXADDR = 0xff
RF_CH = 0xff
RF_SETUP = 0xff
CONFIG = 0xff
DYNPD/FEATURE = 0xff 0xff
Data Rate = 1MBPS
Model = nRF24L01
CRC Length = 16 bits
PA Power = PA_HIGH
Now sending length 4...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 6...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 8...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 10...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 12...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 14...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 16...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 18...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 20...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 22...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 24...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 26...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 28...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 30...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 32...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Now sending length 4...Got response size=255 value=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Почему value какие то каракули? Это так и надо?