Пятница, 28.07.2017
BBB Ready!
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2015 » Апрель » 1 » Потуги с SPI на BBB
21:03
Потуги с SPI на BBB

Ссылки:
https://www.linux.com/learn/tutorials/746860-how-to-access-chips-over-the-spi-on-beaglebone-black
http://stackoverflow.com/questions/23691084/reading-sensor-with-spi
http://hipstercircuits.com/enable-spi-with-device-tree-on-beaglebone-black-copy-paste/

 

1. Смотрим в таблицу, видим, что можно использовать SPI0 и SPI1 на разъеме P9 (p9.28, p9.29, p9.30, p9.31) beagleboneblack. На всякий случай напомню у меня

root@beaglebone:/lib/firmware# uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Sep 4 09:09:32 CEST 2013 armv7l GNU/Linux

SPI0 я откинул, так как он закроет мне UART2.
Итак, привет SPI1.

2. Ну, в папке /dev/ нет ничего что бы называлось хоть как то близко к spi.

Делаем все как в 3ей ссылке, и вот облом не выходит:

Start nano

nano BB-SPI1-01-00A0.dts

Copy-paste this into the file:

/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";

    /* identification */
    part-number = "BB-SPI1-01";

    /* version */
    version = "00A0";

    /* state the resources this cape uses */
    exclusive-use =
        /* the pin header uses */
        "P9.31",
        "P9.29",
        "P9.30",
        "P9.28",
        "P9.13",
        "P9.12", 
        "spi1";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            pinctrl_spi1: pinctrl_spi1_pins {
                pinctrl-single,pins = <                                        
                    0x190 0x13    /* P9_31 = mcasp0_aclkx.spi1_sclk                 , OUTPUT_PULLUP | MODE3 */
                    0x194 0x33    /* P9_29 = mcasp0_fsx.spi1_d0                     , INPUT_PULLUP  | MODE3 */
                    0x198 0x13    /* P9_30 = mcasp0_axr0.spi1_d1                     , OUTPUT_PULLUP | MODE3 */
                    0x19c 0x13    /* P9_28 = mcasp0_ahclkr.spi1_cs0                 , OUTPUT_PULLUP | MODE3 */                    
                    0x164 0x12  /* P9_42 = GPIO0_7 =  eCAP0_in_PWM0_out.gpio0[7] , OUTPUT_PULLUP | MODE2 */
                >;
            };
        };
    };

    fragment@1 {
        target = <&spi1>;
        __overlay__ {
            #address-cells     = <1>;
            #size-cells     = <0>;
            status            = "okay";
            pinctrl-names    = "default";
            pinctrl-0        = <&pinctrl_spi1>;    
            cs-gpios         = <&gpio4 17 0>, <&gpio1 7 0>;

            spi1_0{
                #address-cells       = <1>;
                #size-cells       = <0>;
                compatible           = "spidev";
                reg               = <0>;
                spi-max-frequency = <16000000>;
                spi-cpha;          
            };
            spi1_1{
                #address-cells       = <1>;
                #size-cells       = <0>;
                compatible           = "spidev";
                reg               = <1>;
                spi-max-frequency = <16000000>;
                // Mode 0 (CPOL = 0, CPHA = 0)
            };
        };
    };
};

Close the file (Ctrl-o, Ctrl-x) and compile using dtc:

dtc -O dtb -o BB-SPI1-01-00A0.dtbo -b 0 -@ BB-SPI1-01-00A0.dts

Then, copy the file into /lib/firmware/:

 cp BB-SPI1-01-00A0.dtbo /lib/firmware/

Then enable the device tree overlay:

 echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots

 


root@beaglebone:/dev#  echo BB-SPI1-01 > /sys/devices/bone_capemgr.8/slots
-sh: echo: write error: File exists

Вобщем почитал http://stackoverflow.com/questions/17707987/beaglebone-linux-issues-appending-a-line-to-a-file написано что SPI1 не может одновременно работать s HDMI. Я это уже видел много раз, но надеялся что пронесет. Чтож, читаем как отключтьб HDMI...

3. HDMI turn off

root@beaglebone:/dev# cat /sys/devices/bone_capemgr.*/slots
 0: 54:PF---
 1: 55:PF---
 2: 56:PF---
 3: 57:PF---
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART1
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART2
 9: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4

 

mount /dev/mmcblk0p1  /mnt/card

nano /mnt/card/uEnv.txt

мой файл:
optargs=quiet drm.debug=7

Пишем
       optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN

Перезагружаемся

root@beaglebone:~# cat /sys/devices/bone_capemgr.*/slots
 0: 54:PF---
 1: 55:PF---
 2: 56:PF---
 3: 57:PF---
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART1
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART2
 9: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4

 

root@beaglebone:~# echo BB-SPI1-01 > /sys/devices/bone_capemgr.8/slots
-sh: echo: write error: File exists

Хм...

Итог.

Вроде получилось, я попробовал сделать все то же с spi0 вышло, spi1 ну никак. В итоге просто сделал строку в файле uEnv.txt 

optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  capemgr.enable_partno=BB-SPI0-01,BB-SPI1-01

и появилось три файла в папке /dev/

root@beaglebone:~# ls /dev/spi*
/dev/spidev1.0  /dev/spidev2.0  /dev/spidev2.1
root@beaglebone:~#

Код:

static const char *spi_name = "/dev/spidev2.0";

uint32_t readMAX(int spiDev)
{
     struct spi_ioc_transfer xfer;
      char rxBuffer[8];
      uint32_t data= 0;
      int res=0;

      xfer.rx_buf = (unsigned long)rxBuffer;
      xfer.len = 8;
      xfer.speed_hz = 100000;
      xfer.cs_change = 1;
      xfer.bits_per_word = 4;
      xfer.delay_usecs= 10;

      while( 1){
        res = ioctl(spiDev, SPI_IOC_MESSAGE(1), &xfer);
        usleep(100000);
      }

 

int main() {
  int spiDev = open(spi_name, O_RDWR);
    readMAX(spiDev);

Ногами дергает, прием не проверял пока

 

 

Прием на втором порте не работал. Исправился:

Кажется, вопрос решился. Точно не уверен, тестирую. 
По умолчанию, в папке /lib/firmware были файлы
BB-SPI0-01-00A0.dtbo
BB-SPI1-01-00A0.dtbo
Поэтому uEnv.txt я написал:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  capemgr.enable_partno=BB-SPI0-01,BB-SPI1-01
При старте либо создавалось 3 файла в папке /dev/
spidev1.0
spidev2.0
spidev2.1
И второй порт лагал, либо один файл
spidev1.0

Я, следуя инструкции по включению, сделал три новых файла
BB-SPIDEV0-00A0.dts
BB-SPIDEV1-00A0.dts
BB-SPIDEV1A1-00A0.dts, получил из них *.dtbo
и переписал строку uEnv
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN  capemgr.enable_partno=BB-SPIDEV0,BB-SPIDEV1

При первом включении создалось 
root@beaglebone:~# ls /dev/sp*
/dev/spidev1.0  /dev/spidev1.1  /dev/spidev2.0  /dev/spidev2.1
И второй порт заработал нормально. В чем причина такого поведения, не знаю. Стабильность появления второго порта после перезагрузки буду проверять

Просмотров: 223 | Добавил: bobapro | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Календарь
«  Апрель 2015  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
27282930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2017
    Бесплатный хостинг uCoz