你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux下的SPI总线驱动

[日期:2012-12-16] 来源:CSDN  作者:weiqing1981127 [字体: ]

一.SPI理论介绍

SPI总线全名,串行外围设备接口,是一种串行的主从接口,集成于很多微控制器内部。和I2C使用2根线相比,SPI总线使用4根线:MOSI (SPI 总线主机输出/ 从机输入)、 MISO (SPI总线主机输入/从机输出)、SCLK(时钟信号,由主设备产生)、CS(从设备使能信号,由主设备控制)。由于SPI总线有专用的数据线用于数据的发送和接收,因此可以工作于全双工,当前市面上可以找到的SPI外围设备包括RF芯片、智能卡接口、E2PROM、RTC、触摸屏传感器、ADC。

SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK 时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C 系统要稍微复杂一些。

 

二.SPI驱动移植

我们下面将的驱动的移植是针对Mini2440的SPI驱动的移植

Step1 :在Linux Source Code中修改arch/arm/mach-s3c2440/mach-mini2440.c文件,加入头文件:

#include <linux/spi/spi.h> 

#include <../mach-s3c2410/include/mach/spi.h>

 

然后加入如下代码:

static struct spi_board_info s3c2410_spi0_board[] = 

        [0] = { 

                .modalias = "spidev",  //设备的名称用来和驱动进行匹配

                .bus_num = 0,    //总线的编号,实际指对应的SPI寄存器

                .chip_select = 0,  //反映了这个芯片是不是被连接到SPI上

                .irq = IRQ_EINT9,    //设备的中断号

                .max_speed_hz = 500 * 1000,  //SPI的最大速率

                } 

}; 

 

static struct s3c2410_spi_info s3c2410_spi0_platdata = { 

        .pin_cs = S3C2410_GPG(2), 

      .num_cs = 1,    //所有的片选信号

        .bus_num = 0,    //SPI多对应的总线编号

        .gpio_setup = s3c24xx_spi_gpiocfg_bus0_gpe11_12_13,  //引脚设置函数

}; 

 

static struct spi_board_info s3c2410_spi1_board[] = 

{

      [0] = { 

              .modalias = "spidev", 

              .bus_num = 1, 

              .chip_select = 0, 

                .irq = IRQ_EINT2, 

                .max_speed_hz = 500 * 1000, 

                } 

}; 

 

static struct s3c2410_spi_info s3c2410_spi1_platdata = { 

        .pin_cs = S3C2410_GPG(3), 

        .num_cs = 1, 

        .bus_num = 1, 

        .gpio_setup = s3c24xx_spi_gpiocfg_bus1_gpg5_6_7, 

}; 

 

Step2:在mini2440_devices[]平台数组中添加如下代码:

&s3c_device_spi0, 

&s3c_device_spi1,

 

Step3:最后在mini2440_machine_init函数中加入如下代码:

s3c_device_spi0.dev.platform_data= &s3c2410_spi0_platdata; 

spi_register_board_info(s3c2410_spi0_board, ARRAY_SIZE(s3c2410_spi0_board)); 

s3c_device_spi1.dev.platform_data= &s3c2410_spi1_platdata; 

spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board));

 

Step4:最后需要修改arch/arm/plat-s3c24xx/KConfig文件

找到

config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 

        bool 

        help 

        SPI GPIO configuration code for BUS0 when connected to 

        GPE11, GPE12 and GPE13. 

 

config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7 

        bool 

      help 

          SPI GPIO configuration code for BUS 1 when connected to 

          GPG5, GPG6 and GPG7.

修改为

config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 

        bool "S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13" 

        help 

        SPI GPIO configuration code for BUS0 when connected to 

        GPE11, GPE12 and GPE13. 

 

config S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7 

        bool "S3C24XX_SPI_BUS1_GPG5_GPG6_GPG7" 

      help 

          SPI GPIO configuration code for BUS 1 when connected to 

          GPG5, GPG6 and GPG7.

 

Step5:最后make menuconfig配置,选中System Type和SPI support相应文件


Step6:执行make生成zInage,将编译好的内核导入开发板,并且编译测试程序运行即可。

好了,我们的SPI驱动移植就做好了,我们可以编写SPI测试代码进行测试。

linux
相关资讯       SPI驱动  Linux SPI驱动  SPI总线  LinuxI驱动开发 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理���员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款