현재 설치되어 있는 커널의 버전은 다음과 같습니다.
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
- /dts-v1/;
- /plugin/;
- / {
- compatible = "ti,beaglebone", "ti,beaglebone-black";
- /* identification */
- part-number = "spi0pinmux";
- fragment@0 {
- target = <&am33xx_pinmux>;
- __overlay__ {
- spi0_pins_s0: spi0_pins_s0 {
- pinctrl-single,pins = <
- 0x150 0x30 /* spi0_sclk, INPUT_PULLUP | MODE0 */
- 0x154 0x30 /* spi0_d0, INPUT_PULLUP | MODE0 */
- 0x158 0x10 /* spi0_d1, OUTPUT_PULLUP | MODE0 */
- 0x15c 0x10 /* spi0_cs0, OUTPUT_PULLUP | MODE0 */
- >;
- };
- };
- };
- fragment@1 {
- target = <&spi0>;
- __overlay__ {
- #address-cells = <1>;
- #size-cells = <0>;
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&spi0_pins_s0>;
- spidev@0 {
- spi-max-frequency = <24000000>;
- reg = <0>;
- compatible = "linux,spidev";
- };
- };
- };
- };
그리고 이 파일을 컴파일 합니다.
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
참고
'Beaglebone Black' 카테고리의 다른 글
BeagleBone Black에서 커널 모듈 프로그래밍 (6) | 2015.09.20 |
---|---|
Beaglebone Black을 USB 연결 시 인터넷 사용하기 (0) | 2015.09.14 |
BeagleBone Black에서 스위치 누르면 LED켜보기 (0) | 2015.09.06 |
BeagleBone Black에서 LED 깜빡이도록 하기 ( mmap 사용 ) (6) | 2015.08.26 |
BeagleBone Black 처음 사용해보기 (0) | 2015.08.18 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!