현재 설치되어 있는 커널의 버전은 다음과 같습니다.

root@beaglebone:~# uname -a

Linux beaglebone 3.8.13-bone70 #1 SMP Fri Jan 23 02:15:42 UTC 2015 armv7l GNU/Linux

 

아래 내용으로 BB-SPI0DEV-00A0.dts 파일을 작성합니다.

root@beaglebone:~# nano BB-SPI0-01-00A0.dts

  1. /dts-v1/;  
  2. /plugin/;  
  3.   
  4. / {  
  5.     compatible = "ti,beaglebone""ti,beaglebone-black";  
  6.   
  7.     /* identification */  
  8.     part-number = "spi0pinmux";  
  9.   
  10.     fragment@0 {  
  11.         target = <&am33xx_pinmux>;  
  12.         __overlay__ {  
  13.             spi0_pins_s0: spi0_pins_s0 {  
  14.                 pinctrl-single,pins = <  
  15.                   0x150 0x30  /* spi0_sclk, INPUT_PULLUP | MODE0 */  
  16.                   0x154 0x30  /* spi0_d0, INPUT_PULLUP | MODE0 */  
  17.                   0x158 0x10  /* spi0_d1, OUTPUT_PULLUP | MODE0 */  
  18.                   0x15c 0x10  /* spi0_cs0, OUTPUT_PULLUP | MODE0 */  
  19.                 >;  
  20.             };  
  21.         };  
  22.     };  
  23.   
  24.     fragment@1 {  
  25.         target = <&spi0>;  
  26.         __overlay__ {  
  27.              #address-cells = <1>;  
  28.              #size-cells = <0>;  
  29.   
  30.              status = "okay";  
  31.              pinctrl-names = "default";  
  32.              pinctrl-0 = <&spi0_pins_s0>;  
  33.   
  34.              spidev@0 {  
  35.                  spi-max-frequency = <24000000>;  
  36.                  reg = <0>;  
  37.                  compatible = "linux,spidev";  
  38.             };  
  39.         };  
  40.     };  
  41. };  


그리고 이 파일을 컴파일 합니다.

root@beaglebone:~# dtc -O dtb -o /lib/firmware/ BB-SPI0-01-00A0.dtbo -b 0 -@ BB-SPI0-01-00A0.dts

 

이제 부팅시 자동으로 spi0가 활성화 되도록 다음 파일을 수정합니다.

root@beaglebone:~# nano /boot/uEnv.txt

 

아래 한줄을 아래 캡쳐화면처럼 추가 해주면 됩니다.

optargs=quiet drm.debug=7 capemgr.enable_partno=BB-SPI0-01

 

/etc/default/capemgr 파일에 추가해줍니다.

root@beaglebone:~# nano /etc/default/capemgr

 

CAPE=BB-SPI0-01

 

이제 비글본블랙을 재부팅해주면.. /dev/spidev1.0이 생성된 것을 확인할 수 있습니다..

 

SPI 태스트 코드를 다운로드 받아서

root@beaglebone:~# wget https://www.kernel.org/doc/Documentation/spi/spidev_test.c

 

컴파일 해보려 하는데 에러가 쭉 나네요.. 찾아보니 현재 사용중인 커널 버전에서 제공하는 spidev_test.c를 다운로드 받으면 된다고 하는 군요.

root@beaglebone:~# gcc spidev_test.c

spidev_test.c: In function 'transfer':

spidev_test.c:116:13: error: 'SPI_TX_QUAD' undeclared (first use in this function)

spidev_test.c:116:13: note: each undeclared identifier is reported only once for each function it appears in

spidev_test.c:117:5: error: 'struct spi_ioc_transfer' has no member named 'tx_nbits'

spidev_test.c:118:18: error: 'SPI_TX_DUAL' undeclared (first use in this function)

spidev_test.c:119:5: error: 'struct spi_ioc_transfer' has no member named 'tx_nbits'

spidev_test.c:120:13: error: 'SPI_RX_QUAD' undeclared (first use in this function)

spidev_test.c:121:5: error: 'struct spi_ioc_transfer' has no member named 'rx_nbits'

spidev_test.c:122:18: error: 'SPI_RX_DUAL' undeclared (first use in this function)

spidev_test.c:123:5: error: 'struct spi_ioc_transfer' has no member named 'rx_nbits'

spidev_test.c: In function 'parse_opts':

spidev_test.c:234:12: error: 'SPI_TX_DUAL' undeclared (first use in this function)

spidev_test.c:237:12: error: 'SPI_TX_QUAD' undeclared (first use in this function)

spidev_test.c:246:12: error: 'SPI_RX_DUAL' undeclared (first use in this function)

spidev_test.c:248:12: error: 'SPI_RX_QUAD' undeclared (first use in this function)

spidev_test.c: In function 'main':

spidev_test.c:269:18: error: 'SPI_IOC_WR_MODE32' undeclared (first use in this function)

spidev_test.c:273:18: error: 'SPI_IOC_RD_MODE32' undeclared (first use in this function)

root@beaglebone:~# error: 'SPI_TX_QUAD' undeclared (first use in this function)

-bash: syntax error near unexpected token `('

 

그래서 https://github.com/opennetworklinux/linux-3.8.13/blob/master/Documentation/spi/spidev_test.c 에서 가져왔습니다.

 

복사해서 spidev_test.c에 붙여넣고 아래 한 줄을 수정해주고(디바이스 이름을 현재 잡은 것으로 일치시켜주고)

static const char *device = "/dev/spidev1.0";

 

컴파일하니 일단 문제 없이 실행은 됩니다.

root@beaglebone:~# nano spidev_test.c

root@beaglebone:~# gcc spidev_test.c

root@beaglebone:~# ./a.out

spi mode: 0

bits per word: 8

max speed: 500000 Hz (500 KHz)

 

FF FF FF FF FF FF

FF FF FF FF FF FF

FF FF FF FF FF FF

FF FF FF FF FF FF

FF FF FF FF FF FF

FF FF FF FF FF FF

FF FF

 

출력 결과에 먼가 문제가 있군요… 비글본 블랙에서 SPI0에 해당하는 핀들은 다음과 같습니다.

Chip Select - CS0 - pin 17

Clock - SCLK - pin 22

MOSI - D0 - pin 21

MISO - D1 - pin 18

 

P9에 있는 핀 18번과 핀21번을 전선으로 연결시켜 주어야 정상적인 결과를 얻을 수 있다고 합니다.

http://embedded-basics.blogspot.kr/2014/10/enabling-spi0-on-beaglebone-black.html

 

다시 실행을 시켜보니 정상적인 결과가 얻어집니다.

MOSI로 출력된 신호가 다시 MISO로 입력되어 원하는 결과를 얻을 수 있는 것으로 보입니다.

 

root@beaglebone:~# ./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

 

 

참고

http://elinux.org/BeagleBone_Black_Enable_SPIDEV#SPI0

http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


후원계좌 카카오뱅크 3355112417955

  1. yundorri 2016.10.10 18:25

    감사합니다. 많은 도움이 되었어요.
    참고로 MAX SPI Speed Hz는 약 48MHz 이더군요.

+ Recent posts