修订历史 版本 日期 原因 V1.00 2018/8/18 创建文档
目 录 1 SPI总线关键结构体 1 1.1 总线传输控制消息块 1 1.2 SPI总线适配器 2 1.3 SPI设备 3 2 SPI各个结构体之间的联系 3 2.1 总线链表 3 2.2 总线与设备 3 3 参考资料 4
1 SPI总线关键结构体 1.1 总线传输控制消息块 传输控制消息包括操作单位bits数、传输控制参数(时钟极性、相位和字节序等配置)、发送和接收缓冲区及其长度、传输结束的回调函数。如程序清单 1.1所示。 程序清单 1.1
typedef struct lw_spi_message {
UINT16 SPIMSG_usBitsPerOp; /* 操作单位bits数 */
UINT16 SPIMSG_usFlag; /* 传输控制参数 */
#define LW_SPI_M_CPOL_0 0x0000 /* CPOL 配置 */
#define LW_SPI_M_CPOL_1 0x0001
#define LW_SPI_M_CPHA_0 0x0000 /* CPHA 配置 */
#define LW_SPI_M_CPHA_1 0x0002
#define LW_SPI_M_CPOL_EN 0x0004 /* 是否设置新的 CPOL 配置 */
/* 否则 CPOL 配置与上次传输相同*/
#define LW_SPI_M_CPHA_EN 0x0008 /* 是否设置新的 CPHA 配置 */
/* 否则 CPHA 配置与上次传输相同*/
/*********************************************************************************************************
LW_SPI_M_WRBUF_FIX, LW_SPI_M_RDBUF_FIX 主要用于半双工的 SPI 操作 (多数从机器件都是这种操作模式).
1: 当 LW_SPI_M_WRBUF_FIX 有效时, 表明本次操作是读操作, 每次发送的数据都是 SPIMSG_pucWrBuffer 的第一个字
符, 而读到的数据将依次存放在 SPIMSG_pucRdBuffer 中.
所以: 读缓冲的大小必须可以存放 SPIMSG_usLen 个字符, 而写缓冲的大小可以仅是 1 个字符长度.
2: 当 LW_SPI_M_RDBUF_FIX 有效时, 表明本次操作是写操作, 对读到什么数据并不感兴趣, 所以每次读到的数据都放
在 SPIMSG_pucRdBuffer 的第一个字符处.
所以: 写缓冲的大小必须可以存放 SPIMSG_usLen 个字符, 而读缓冲的大小可以仅是 1 个字符长度.
*********************************************************************************************************/
#define LW_SPI_M_WRBUF_FIX 0x0010 /* 发送缓冲区仅发送第一个字符 */
/* 永远发送第一个字符 */
#define LW_SPI_M_RDBUF_FIX 0x0020 /* 接收缓冲区仅接收第一个字符 */
/* 接收的数据永远发在第一个接收*/
/* 缓冲指针的位置 */
#define LW_SPI_M_MSB 0x0040 /* 从高位到低位 */
#define LW_SPI_M_LSB 0x0080 /* 从低位到高位 */
UINT32 SPIMSG_uiLen; /* 长度(缓冲区大小) */
/* 长度为0, 只设置传输控制参数 */
UINT8 *SPIMSG_pucWrBuffer; /* 发送缓冲区 */
UINT8 *SPIMSG_pucRdBuffer; /* 接收缓冲区 */
VOIDFUNCPTR SPIMSG_pfuncComplete; /* 传输结束后的回调函数 */
PVOID SPIMSG_pvContext; /* 回调函数参数 */
} LW_SPI_MESSAGE;
1.2 SPI总线适配器 总线设配器包括总线节点、总线适配器操作函数、总线操作锁和设备链表。如程序清单 1.2所示。总线节点是用于管理所有SPI总线的链表节点;总线适配器操作函数包括总线传输函数和总线控制函数;总线操作锁用于实现总线互斥操作;设备链表是由所有关联当前SPI适配器的设备组成的链表。 程序清单 1.2
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 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;
1.3 SPI设备 SPI设备结构成员包括挂载的适配器指针、设备挂载链、设备使用计数、设备名称。如程序清单 1.3所示。 程序清单 1.3
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;
2 SPI各个结构体之间的联系 2.1 总线链表 所有SPI总线适配器都是链接在以_G_plineBusAdapterHeader为头节点的链表上。如图 2.1所示。 图 2.1 SPI总线链表 2.2 总线与设备 总线与设备的逻辑关系如图 2.2所示。 图 2.2 总线与设备关系 3 参考资料 《SylixOS_driver_usermanual》