用Beaglebone Black的SPI

刘东丽   2014-2-26 11:37 楼主
帖子来源:http://blog.csdn.net/wyt2013/article/details/16921573

SPI是可以全双工通信的一种串行总线,两个设备之间双向通信的话一般使用3根线:SCLK,MISO,MOSI,多个设备之间双向通信的话,每个设备还需要再加上一根地址线CSn。相比之下I2C只能半双工,而且一般需要上拉电阻,但无论几个设备,都只需要2根线。更多基础知识请谷歌百度。

Beaglebone Black使用的AM3359芯片上有两个SPI,但SPI1连接到了板子的HDMI芯片上,所以除非禁用HDMI,否则我们只能使用SPI0。本文将利用自带的spidev驱动使能SPI0,并进行一下简单的验证。

配置device tree
首先我们用我在《使用BBB的I2C》这篇文章中使用的方法检验一下SPI相关的引脚功能是否配置正确。检查结果是,不正确,也就是说SPI默认是没有启用的,新版arm linux配置硬件的方式是利用device tree,所以我们必须要配置一个device tree来启用它。我们先到 /lib/firmware 目录中看看有没有现成的device tree source (.dts)文件可供使用。我们发现有一个BB-SPI0-00A0.dts。内容如下


[cpp] view plaincopyprint?
/dts-v1/;  
/plugin/;  
  
/ {  
    compatible = "ti,beaglebone", "ti,beaglebone-black";  
  
    /* identification */  
    part-number = "BB-SPI0";  
    version = "00A0";  
  
    /* state the resources this cape uses */  
    exclusive-use =  
        /* the pin header uses */  
        "P9.17",    /* spi0_cs0 */  
        "P9.18",    /* spi0_d1 */  
        "P9.21",    /* spi0_d0 */  
        "P9.22",    /* spi0_sclk */  
        /* the hardware ip uses */  
        "spi0";  
  
    fragment@0 {  
        target = <&am33xx_pinmux>;  
        __overlay__ {  
            /* default state has all gpios released and mode set to uart1 */  
            bb_spi0_pins: pinmux_bb_spi0_pins {  
                pinctrl-single,pins = <  
                    0x150 0x30  /* spi0_sclk.spi0_sclk, INPUT_PULLUP | MODE0 */  
                    0x154 0x30  /* spi0_d0.spi0_d0, INPUT_PULLUP | MODE0 */  
                    0x158 0x10  /* spi0_d1.spi0_d1, OUTPUT_PULLUP | MODE0 */  
                    0x15c 0x10  /* spi0_cs0.spi0_cs0, OUTPUT_PULLUP | MODE0 */  
                >;  
            };  
        };  
    };  
  
    fragment@1 {  
        target = <&spi0>; /* spi0 is numbered correctly */  
        __overlay__ {  
            status = "okay";  
            pinctrl-names = "default";  
            pinctrl-0 = <&bb_spi0_pins>;  
  
            #address-cells = <1>;   
            #size-cells = <0>;   
  
            /* add any spi devices connected here */  
            /* note that you can do direct SPI via spidev now */  
  
            // commented out example of an adafruit 1.8" TFT display   
            // from firmare/capes/cape-bone-adafruit-lcd-00A0.dts   
            // lcd@0 {   
            //  #address-cells = <1>;   
            //  #size-cells = <0>;   
            //   
            //  compatible = "adafruit,tft-lcd-1.8-red", "sitronix,st7735";   
            //  reg = <0>;   
            //   
            //  spi-max-frequency = <8000000>;   
            //  spi-cpol;   
            //  spi-cpha;   
            //   
            //  pinctrl-names = "default";   
            //  pinctrl-0 = <&bone_adafruit_lcd_pins>;   
            //   
            //  st7735-rst = <&gpio4 19 0>;   
            //  st7735-dc = <&gpio4 21 0>;   
            // };   
        };  
    };  
};  

/dts-v1/;
/plugin/;

/ {

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复