SPI 总线是一种4线总线,提供了一种高速、高效率的串行通信技术。SPI 通信通常有一个主设备和一个或多个从设备,需要至少4根线,它们是 MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)
其中,CS是从芯片是否被主芯片选中的控制信号,SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输
本驱动程序提供了FT2000/4、D2000平台的SPI主设备功能
FT2000/4、D2000上包含 2 个通用 SPI 接口,仅作为通用 SPI 主设备使用,外部最多挂载 4 个 SPI 从设备
.
├── fspim.c
├── fspim.h
├── fspim_g.c
├── fspim_hw.c
├── fspim_hw.h
├── fspim_intr.c
├── fspim_options.c
└── fspim_sinit.c
4 应用示例
以下部分将指导您完成 FSPIM 驱动的软件配置:
关于 SFUD 框架的使用,可以参考sfud.md
typedef struct
{
u32 instance_id; /* Device instance id */
uintptr base_addr; /* Device base address */
u32 irq_num; /* Device interrupt id */
u32 irq_prority; /* Device interrupt priority */
FSpimSlaveDevice slave_dev_id; /* Slave device id */
u32 max_freq_hz; /* Clock frequency in Hz */
FSpimTransByte n_bytes; /* Bytes in transfer */
FSpimCpolType cpol; /* Polarity of the clock */
FSpimCphaType cpha; /* Phase of the clock */
boolean en_test; /* Enable test mode */
} FSpimConfig;
typedef struct
{
FSpimConfig config; /* Current active configs */
u32 is_ready; /* Device is initialized and ready */
u32 length; /* Data length in transfer */
const void *tx_buff; /* Tx buffer beg */
void *rx_buff; /* Rx buffer beg */
const void *tx_buff_end; /* Tx buffer end */
void *rx_buff_end; /* Rx buffer end */
u32 tx_fifo_len; /* Depth of tx fifo */
u32 rx_fifo_len; /* Depth of rx fifo */
FSpimEvtHandler evt_handler[FSPIM_INTR_EVT_NUM]; /* event handler for interrupt */
void *evt_param[FSPIM_INTR_EVT_NUM]; /* parameters ptr of event handler */
} FSpim;
enum
{
FSPIM_SLAVE_DEV_0 = 0,
FSPIM_SLAVE_DEV_1,
FSPIM_SLAVE_DEV_2,
FSPIM_SLAVE_DEV_3,
FSPIM_NUM_OF_SLAVE_DEV
};
enum
{
FSPIM_1_BYTE = 1,
FSPIM_2_BYTE = 2,
FSPIM_MAX_BYTES_NUM
};
enum
{
FSPIM_TRANS_MODE_RX_TX = 0x0,
FSPIM_TRANS_MODE_TX_ONLY = 0x1,
FSPIM_TRANS_MODE_RX_ONLY = 0x2,
FSPIM_TRANS_MODE_READ_EEPROM = 0x3,
FSPIM_TRANS_MODE_MAX
};
enum
{
FSPIM_CPOL_LOW = 0,
FSPIM_CPOL_HIGH
};
enum
{
FSPIM_CPHA_1_EDGE = 0,
FSPIM_CPHA_2_EDGE
};
const FSpimConfig *FSpimLookupConfig(u32 instance_id)
Note:
FSpimCfgInitialize
函数的入参使用Input:
Return:
FError FSpimCfgInitialize(FSpim *instance_p, const FSpimConfig *cofig_p);
Note:
Input:
FSpim *instance_p, FSPIM驱动控制数据
const FSpimConfig *input_config_p, FSPIM驱动配置数据
Return:
void FSpimDeInitialize(FSpim *instance_p)
Note:
Input:
Return:
无
FError FSpimTransferPollFifo(FSpim *instance_p, const void *tx_buf, void *rx_buf, fsize_t len);
Note:
Input:
FSpim *instance_p, FSPIM驱动控制数据
const void *tx_buf, 写缓冲区,可以为空,为空时表示只关注读数据,此时驱动会发送0xff读数据
void *rx_buf, 读缓冲区, 可以为空,为空时表示值关注写数据,此时SPI总线上返回的数据会被抛弃
fsize_t len, 进行传输的长度,如果tx_buf或者rx_buf不为空,则两个buf的长度必须为len
Return:
FError FSpimTransferByInterrupt(FSpim *instance_p, const void *tx_buf, void *rx_buf, fsize_t len);
Note:
Input:
FSpim *instance_p, FSPIM驱动控制数据
const void *tx_buf, 写缓冲区,可以为空,为空时表示只关注读数据,此时驱动会发送0xff读数据
void *rx_buf, 读缓冲区, 可以为空,为空时表示值关注写数据,此时SPI总线上返回的数据会被抛弃
fsize_t len, 进行传输的长度,如果tx_buf或者rx_buf不为空,则两个buf的长度必须为len
Return:
void FSpimInterruptHandler(s32 vector, void *param);
Note:
Input:
s32 vector, 中断向量号,此处不关心此参数
void *param, 中断输入参数, 指向FSPIM的驱动控制实例
Return:
无
void FSpimRegisterIntrruptHandler(FSpim *instance_p, u32 evt, FSpimEvtHandler handler, void *param)
Note:
Input:
FSpim *instance_p, FSPIM驱动控制数据
u32 evt, 中断事件号码,参考FSPIM_INTR_EVT_NUM
FSpimEvtHandler handler, 中断事件回调函数
void *param, 中断事件回调函数的入参,取决于中断事件回调函数的实现
Return:
无
const char *FSpimErrorToMessage(FError error);
Note:
无
Input:
Return:
const char *, FSPIM模块错误码对应的信息
void FSpimSetChipSelection(FSpim *instance_p, boolean on);
Note:
无
Input:
Return:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。