SPI总线(二)SPI子系统

一. 模式特点

三线:SS、CLK、MOSI和MISO同一根数据线,半双工

四线:SS、CLK、MOSI、MISO,全双工

CPOL:时钟极性, =0 时钟空闲时 低电平  =1 时钟空闲时 高电平

CPHA:时钟相位, =0 数据将在时钟第1个边沿进行读取     =1 数据将在时钟第2个边沿进行读取

二. SPI驱动模型:SPI核心层、SPI主机控制器层、SPI(从机)设备驱动层。

SPI总线(二)SPI子系统_第1张图片

1. SPI核心
SPI控制器驱动和设备驱动之间的纽带,它提供了SPI控制器驱动和设备驱动的注册、注销方法等。
2.SPI总线驱动
对控制器的驱动实现。
3. SPI设备驱动
对SPI从设备的驱动实现,如spi flash

1. SPI核心层

1.1 相关文件:devices/spi/spi.c、include/linux/spi/spi.h

1.2作用

1)提供了SPI总线驱动和设备驱动的注册、注销方法等。

2)使 SPI设备驱动可以访问使用 SPI 控制器驱动提供的向SPI总线传递数据所使用的方法、函数

1.3 SPI控制器层接口

//分配spi_master结构
struct spi_master *spi_alloc_master(struct device *dev, unsigned size)

//注册spi_master结构
int spi_register_master(struct spi_master *master)

//注销spi_master结构
void spi_unregister_master(struct spi_master *master)
1.3 SPI设备驱动层接口
// 分配spi_driver结构到spi总线
int spi_register_driver(struct spi_driver *sdrv)

// 注销spi_driver总线
static inline void spi_unregister_driver(struct spi_driver *sdrv)

//分配、添加spi_device结构到spi总线上;
struct spi_device *spi_new_device(struct spi_master *master, struct spi_board_info *chip)
1.4 构建spi总线(内核中已经做好)
static int __init spi_init(void)
{
    int    status;

    buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
    if (!buf) {
        status = -ENOMEM;
        goto err0;
    }

    status = bus_register(&spi_bus_type);
    if (status < 0)
        goto err1;

    status = class_register(&spi_master_class);
    if (status < 0)
        goto err2;
    return 0;

err2:
    bus_unregister(&spi_bus_type);
err1:
    kfree(buf);
    buf = NULL;
err0:
    return status;
}

postcore_initcall(spi_init);
2. SPI主机控制器层构建(基于platform总线)

struct spi_master: 主控制器接口,用来描述控制器驱动


你可能感兴趣的:(SPI)