一、spi通信 中控制器驱动及spi设备、spi设备驱动的关系入下图:

控制器驱动以及设备全志已经完成,在/driver/spi/spi--sunxi.c  中,打开源码文件可以看到spi控制器属于平台总线,匹配成功会产生一个控制器对象spi_master,当spi_master注册时会和spi_board_info进行结合,生成spi_device对象。

我们需要做的就是描述一个spi设备的spi_board_info 类型的对象。

首先我们要先了解用到的结构体:

描述spi_device 对象的结构体:

  1. struct spi_device {
  2. struct device dev; //基于device成员扩展, 在/sys/bus/spi/devie目录有相应的子目录(名为spi%d.%d)
  3. struct spi_master *master; //spi控制器对象的地址
  4. u32 max_speed_hz; //设备工作时钟最大多少HZ
  5. u8 chip_select;   
  6. u8 mode;
  7. #define SPI_CPHA 0x01 /* clock phase */
  8. #define SPI_CPOL 0x02 /* clock polarity */
  9. #define SPI_MODE_0 (0|0) /* (original MicroWire) */
  10. #define SPI_MODE_1 (0|SPI_CPHA)
  11. #define SPI_MODE_2 (SPI_CPOL|0)
  12. #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
  13. #define SPI_CS_HIGH 0x04 /* chipselect active high? */
  14. #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
  15. #define SPI_3WIRE 0x10 /* SI/SO signals shared */
  16. #define SPI_LOOP 0x20 /* loopback mode */
  17. #define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */
  18. #define SPI_READY 0x80 /* slave pulls low to pause */
  19. u8 bits_per_word; //传输的数据以多少位为单位
  20. int irq; //中断号
  21. void *controller_state;
  22. void *controller_data; //给控制器的驱动使用,不同的控制器需要的类型不同,
                               可以进入/driver/spi/spi_sunxi.c查看controller_data的类型
  23. char modalias[SPI_NAME_SIZE]; //spi设备的名字
  24. };
  1. // spi设备驱动类型
  2. struct spi_driver {
  3. const struct spi_device_id *id_table;
  4. int (*probe)(struct spi_device *spi);
  5. int (*remove)(struct spi_device *spi);
  6. void (*shutdown)(struct spi_device *spi);
  7. int (*suspend)(struct spi_device *spi, pm_message_t mesg);
  8. int (*resume)(struct spi_device *spi);
  9. struct device_driver driver; //基于device_driver扩展, 驱动模型
  10. };
  11.  
  12. extern int spi_register_driver(struct spi_driver *sdrv);
  13. static inline void spi_unregister_driver(struct spi_driver *sdrv);
  1. 描述spi设备的结构体
  2. struct spi_board_info spi_infos[] = {
  3. {
  4. .modalias = "mcp2515",  //设备名
  5. .platform_data = NULL,   //根据spi驱动决定是否用了平台数据。dev.platform_data
  6. .controller_data = &sunxi_data,//需查控制器的驱动代码,可得知需要提供struct sunxi_spi_config类型数据. 注意不同的同台,需要数据类型也会不同
  7.  
  8.    .irq = gpio_to_irq(GPIOA(10)),
  9. .max_speed_hz = , //2MHz
  10. .bus_num = , // 接编号为0的控制器
  11. .mode = SPI_MODE_0,//通信模式
  12. },
  13.  
  14. };
  15.  
  16.   注:.controller_data 是和控制器驱动数据相关的,需要产看相应的控制器,如全志的spi控制器驱动代码在
      /drivers/spi/spi-sunxi.c.通过查看类新如下图。

结构体类型如下:

spi设备描述过程的更多相关文章

  1. 理解一下单片机的I2C和SPI通信

    应某位网友要求,今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解. I2C和SPI是两种不同的通信协议. 听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已, ...

  2. SPI总线(同步)

    一.SPI总线简介 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口.SPI 用 于CPU与各种外围器件进行全双工. ...

  3. SPI总线的特点、工作方式及常见错误解答

    1.SPI总线简介 SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种同步串行接口.它用于CPU与各种外围器件进行全双工.同步串 ...

  4. STM32学习笔记——SPI串行通讯(向原子哥学习)

    一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...

  5. SPI通信

    SPI是由Motorola公司提出的一种同步串行外围接口:它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用: SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是 ...

  6. S3C2440的SPI解析

    位串行数据的频率.如果只希望发送,则接收数据可以保持伪位(dummy).此外如果只希望接收,则需要发送伪位'1'数据 使用SPI主要需要以下寄存器 选择SPI模式,中断模式,查询模式等SCK选择,主从 ...

  7. stm之SPI通信协议

    SPI (Serial Peripheral interface),顾名思义就是串行外围设备接口.SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为P ...

  8. 【接口时序】4、SPI总线的原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

  9. SPI 驱动框架

    SPI 驱动框架 1. 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to ...

随机推荐

  1. C++中获取当前时间并格式化输出

    #include <string> #include <time.h> using namespace std; string getTime() { time_t timep ...

  2. (递归)Hanoi Tower

    #include<stdio.h>void move(int n,char a,char b){ printf("将第%d个盘子从%c移动到%c\n",n,a,b);  ...

  3. 寒假day22

    今天解决了标签模块的一些错误,同时美化了界面

  4. textare限制拖动;提示文字(点击消失,不输入恢复提示信息)

    1.在textarea添加一个样式:style="resize:none;" 2.提示文字(鼠标点击的时候消失,不输入恢复提示信息): <input name="t ...

  5. 使用java service wrapper将java程序注册为window服务

    1.下载java service wrapper 下载地址:http://wrapper.tanukisoftware.com/doc/english/download.jsp 针对自己的需求下载相应 ...

  6. HALCON导出函数

    Halcon小函数的封装和代码导出 一.Halcon小函数的封装和修改 1.名词解释: 算子:指Halcon中最基础.最底层的函数(即你看不到它的代码实现),一个算子只有一句话,例如threshold ...

  7. 十分简明易懂的FFT(快速傅里叶变换)

    https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ...

  8. 1-4 无监督学习(Unsupervised Learning)

    无监督学习定义: [无监督学习]中没有任何的标签或者是有相同的标签或者就是没标签.所以我们已知数据集,却不知如何处理,也未告知每个数据点是什么.别的都不知道,就是一个数据集.你能从数据中找到某种结构吗 ...

  9. CodeForces - 350B(反向建图,)

    B - Resort CodeForces - 350B B. Resort time limit per test 2 seconds memory limit per test 256 megab ...

  10. Eclipse 配置spring boot pom.xml第1行报错的两种解决办法

    现象 通过spring boot项目导入eclipse后,pom.xml文件的第一行总是报错.这里使用的spring版本是2.1.5,2.1.4以前的版本等其他版本的spring没有这个问题. 解决办 ...