SPI适配器

SPI适配器

每一条SPI总线对应一个SPI适配器。在内核中,每一个适配器提供了一个描述的结构,也定义了Adapter支持的操作。再通过SPI核心层将SPI设备与SPI适配器关联起来。
SPI总线适配器相关信息位于“libsylixos/SylixOS/system/device/spi”下,其适配器创建原型如下:

/*********************************************************************************************************
** 函数名称: API_SpiAdapterCreate
** 功能描述: 创建一个 spi 适配器
** 输 入  : pcName        适配器名称,即shell命令buss显示的名称;
**           pspifunc      操作函数组,是SPI总线传输函数的指针;
** 输 出  : ERROR CODE,成功返回ERROR_NONE,失败返回PX_ERROR
*********************************************************************************************************/
INT  API_SpiAdapterCreate (CPCHAR          pcName,  
                           PLW_SPI_FUNCS   pspifunc) 

函数API_SpiAdapterCreate使用结构体PLW_SPI_FUNCS来向内核提供传输函数集合,其详细描述如下:

/*********************************************************************************************************
  SPI 总线传输函数集
  SPIFUNC_pfuncMasterXfer:SPI传输函数,SPI设备会直接调用此函数实现消息发
  送。第一个参数pspiadapter为SPI总线适配器指针,第二个参数pspimsg为SPI
  设备需要传输的消息结构体首地址指针,第三个参数iNum为需要传输的消息个数,
  以上三个参数即可告知SPI设备如何调用此函数实现消息传输; 

  SPIFUNC_pfuncMasterCtl:SPI适配器控制函数,用来实现与硬件控制器相关的控
  制。第一个参数pspiadapter为SPI总线适配器指针,第二个参数iCmd为控制命令,
  第三个参数lArg与iCmd相关。
*********************************************************************************************************/

typedef struct lw_spi_funcs {
    INT                    (*SPIFUNC_pfuncMasterXfer)(PLW_SPI_ADAPTER   pspiadapter,
                                                      PLW_SPI_MESSAGE   pspimsg,
                                                      INT               iNum);
                                                                        /*  适配器数据传输              */
    INT                    (*SPIFUNC_pfuncMasterCtl)(PLW_SPI_ADAPTER   pspiadapter,
                                                     INT               iCmd,
                                                     LONG              lArg);
                                                                        /*  适配器控制                  */
} LW_SPI_FUNCS;
typedef LW_SPI_FUNCS        *PLW_SPI_FUNCS;

注册到内核的传输函数集合中要用到多种结构体,
PLW_SPI_ADAPTER 总线适配器结构体指针主要包含当前总线适配器节点信息;
PLW_SPI_DEVICE 总线设备结构体指针主要包含当前I2C设备的相关信息;
PLW_SPI_MESSAGE 消息请求结构体指针作用是指向需要发送的消息缓冲区;
提供以上三种结构体后控制器即可知道如何进行发送,各种结构体的详细描述如下:
首先介绍SPI总线适配器结构体,该结构体详细描述如下:

/*********************************************************************************************************
  SPI 总线适配器
  SPIADAPTER_pbusadapter:系统总线节点结构体; 
  SPIADAPTER_pi2cfunc:指向总线适配器的操作函数,即API_SpiAdapterCreate函数注册到核心层的操作函数集指针; 
  SPIADAPTER_hBusLock:SPI总线锁,不需要手动处理; 
  SPIADAPTER_plineDevHeader:指向此适配器下挂载的设备链表,不需要手动处理。 
*********************************************************************************************************/
struct lw_spi_funcs;
typedef struct lw_spi_adapter {
    LW_BUS_ADAPTER           SPIADAPTER_pbusadapter;                    /*  总线节点                    */
    struct lw_spi_funcs     *SPIADAPTER_pspifunc;                       /*  总线适配器操作函数          */
    
    LW_OBJECT_HANDLE         SPIADAPTER_hBusLock;                       /*  总线操作锁                  */
    
    LW_LIST_LINE_HEADER      SPIADAPTER_plineDevHeader;                 /*  设备链表                    */
} LW_SPI_ADAPTER;
typedef LW_SPI_ADAPTER      *PLW_SPI_ADAPTER;

SPI设备结构体详细描述如下:

/*********************************************************************************************************
  SPI 设备类型
*********************************************************************************************************/

typedef struct lw_spi_device {
    PLW_SPI_ADAPTER              SPIDEV_pspiadapter;                    /*  挂载的适配器                */
    LW_LIST_LINE                 SPIDEV_lineManage;                     /*  设备挂载链                  */
    atomic_t                     SPIDEV_atomicUsageCnt;                 /*  设备使用计数                */
    CHAR                         SPIDEV_cName[LW_CFG_OBJECT_NAME_SIZE]; /*  设备的名称                  */
} LW_SPI_DEVICE;
typedef LW_SPI_DEVICE           *PLW_SPI_DEVICE;

SPI消息结构体是SPI主机和从机通信的消息格式,该结构体的详细描述如下:

/*********************************************************************************************************
  SPI 总线传输控制消息
*********************************************************************************************************/

typedef struct lw_spi_message {
    UINT16                   SPIMSG_usBitsPerOp;                        /*  操作单位bits数              */
    UINT16                   SPIMSG_usFlag;                             /*  传输控制参数                */
    UINT32                   SPIMSG_uiLen;                              /*  长度(缓冲区大小)            */
    UINT8                   *SPIMSG_pucWrBuffer;                        /*  发送缓冲区                  */
    UINT8                   *SPIMSG_pucRdBuffer;                        /*  接收缓冲区                  */
    VOIDFUNCPTR              SPIMSG_pfuncComplete;                      /*  传输结束后的回调函数        */
    PVOID                    SPIMSG_pvContext;                          /*  回调函数参数                */
} LW_SPI_MESSAGE;
typedef LW_SPI_MESSAGE      *PLW_SPI_MESSAGE;

传输控制参数表

传输控制参数取值 含义
LW_SPI_M_CPOL_0 CPOL配置
LW_SPI_M_CPOL_1 CPOL配置
LW_SPI_M_CPHA_0 CPHA配置
LW_SPI_M_CPHA_1 CPHA配置
LW_SPI_M_CPOL_EN 是否设置新的CPOL配置
LW_SPI_M_CPHA_EN 是否设置新的CPHA配置
LW_SPI_M_WRBUF_FIX 发送缓存区仅发送第一个字节
LW_SPI_M_RDBUF_FIX 接收缓存区仅接收第一个字节
LW_SPI_M_MSB 从高位到低位
LW_SPI_M_LSB 从低位到高位

你可能感兴趣的:(#,SylixOS中的SPI模块)