/*
* Set the Spi device as a master. External loopback is required.
*/
XSpiPs_SetOptions(SpiInstancePtr, XSPIPS_MASTER_OPTION |
XSPIPS_FORCE_SSELECT_OPTION);
XSpiPs_SetClkPrescaler(SpiInstancePtr, XSPIPS_CLK_PRESCALE_64);
#define XSPIPS_MASTER_OPTION 0x00000001U
/**< Master mode option */
#define XSPIPS_CLK_ACTIVE_LOW_OPTION 0x00000002U
/**< Active Low Clock option */
#define XSPIPS_CLK_PHASE_1_OPTION 0x00000004U
/**< Clock Phase one option */
#define XSPIPS_DECODE_SSELECT_OPTION 0x00000008U
/**< Select 16 slaves Option */
#define XSPIPS_FORCE_SSELECT_OPTION 0x00000010U
/**< Force Slave Select */
#define XSPIPS_MANUAL_START_OPTION 0x00000020U
/**< Manual Start mode option */
#define XSPIPS_MASTER_OPTION 0x00000001U
/**< 主模式选项 */
#define XSPIPS_CLK_ACTIVE_LOW_OPTION 0x00000002U
/**< 低电平有效时钟选项 */
#define XSPIPS_CLK_PHASE_1_OPTION 0x00000004U
/**< 时钟相位一选项 */
#define XSPIPS_DECODE_SSELECT_OPTION 0x 00000008U
/**< 选择16 个从机选项 */
#define XSPIPS_FORCE_SSELECT_OPTION 0x00000010U
/**< 强制从机选择 */
#define XSPIPS_MANUAL_START_OPTION 0x00000020U
/**< 手动启动模式选项 */
/*
* Setup the handler for the SPI that will be called from the
* interrupt context when an SPI status occurs, specify a pointer to
* the SPI driver instance as the callback reference so the handler is
* able to access the instance data
*/
XSpiPs_SetStatusHandler(SpiInstancePtr, SpiInstancePtr,
(XSpiPs_StatusHandler) SpiHandler);
/*********************** SPI statuses 1151 - 1175 ****************************/
#define XST_SPI_MODE_FAULT 1151 /*!< master was selected as slave */
#define XST_SPI_TRANSFER_DONE 1152 /*!< data transfer is complete */
#define XST_SPI_TRANSMIT_UNDERRUN 1153 /*!< slave underruns transmit register */
#define XST_SPI_RECEIVE_OVERRUN 1154 /*!< device overruns receive register */
#define XST_SPI_NO_SLAVE 1155 /*!< no slave has been selected yet */
#define XST_SPI_TOO_MANY_SLAVES 1156 /*!< more than one slave is being
* selected */
#define XST_SPI_NOT_MASTER 1157 /*!< operation is valid only as master */
#define XST_SPI_SLAVE_ONLY 1158 /*!< device is configured as slave-only
*/
#define XST_SPI_SLAVE_MODE_FAULT 1159 /*!< slave was selected while disabled */
#define XST_SPI_SLAVE_MODE 1160 /*!< device has been addressed as slave */
#define XST_SPI_RECEIVE_NOT_EMPTY 1161 /*!< device received data in slave mode */
#define XST_SPI_COMMAND_ERROR 1162 /*!< unrecognised command - qspi only */
#define XST_SPI_POLL_DONE 1163
/*!< controller completed polling the device for status */
/************************ SPI 状态 1151 - 1175 ********************* ******/
#define XST_SPI_MODE_FAULT 1151
/*!< 主设备被选为从设备 */
#define XST_SPI_TRANSFER_DONE 1152
/*!< 数据传输完成 */
#define XST_SPI_TRANSMIT_UNDERRUN 1153
/*!< 从设备欠载发送寄存器 * /
#define XST_SPI_RECEIVE_OVERRUN 1154
/*!< 设备溢出接收寄存器 */
#define XST_SPI_NO_SLAVE 1155
/*!< 尚未选择从机 */
#define XST_SPI_TOO_MANY_SLAVES 1156
/*!< 正在选择多个从机 */
# Define XST_SPI_NOT_MASTER 1157
/*!< 操作仅作为主设备有效 */
#define XST_SPI_SLAVE_ONLY 1158
/*!< 设备仅配置为从设备 */
#define XST_SPI_SLAVE_MODE_FAULT 1159
/*!< 在禁用时选择从设备 */
#define XST_SPI_SLAVE_MODE 1160
/*!< 设备已被寻址为从机 */
#define XST_SPI_RECEIVE_NOT_EMPTY 1161
/*!< 设备在从机模式下接收到数据 */
#define XST_SPI_COMMAND_ERROR 1162
/*!< 无法识别的命令 - 仅 qspi */
#define XST_SPI_POLL_DONE 1163
/* !< 控制器完成轮询设备状态 */
s32 XSpiPs_Transfer(XSpiPs *InstancePtr, u8 *SendBufPtr,
u8 *RecvBufPtr, u32 ByteCount)
/******************************************************** **************************/
/** * * 在 SPI 总线上传输指定数据。如果 SPI 设备被配置为
* 主设备,则此函数将启动总线通信并向选定的 SPI 从设备发送/接收
* 数据。如果 SPI 设备被配置为
* 从机,则该函数会在被主机选择时准备要发送/接收的缓冲区。对于发送的每个字节,都会收到一个字节。该函数应该用于执行基于中断的传输。
** 调用者可以选择为发送和接收提供两个不同的缓冲区,或者为发送和接收提供一个缓冲区,或者不为接收提供缓冲区。
* 接收缓冲区必须至少与发送缓冲区一样大,以防止* 不需要的内存写入。这意味着作为 * 参数传入的字节计数必须是两个缓冲区中较小的一个(如果它们大小不同)。
* 以下是一些示例用法: ** XSpiPs_Transfer(InstancePtr, SendBuf, RecvBuf, ByteCount) * 调用者希望发送和接收,并为发送和接收提供两个不同的 * 缓冲区。
** XSpiPs_Transfer(InstancePtr, SendBuf, NULL, ByteCount) * 调用者只想发送,并不关心接收到的 * 数据。在这种情况下,驱动程序会忽略接收到的数据。
** XSpiPs_Transfer(InstancePtr, SendBuf, SendBuf, ByteCount) * 调用者希望发送和接收,但提供相同的缓冲区 * 来执行这两种操作。驱动程序发送数据并在传输数据时用接收到的数据覆盖发送缓冲区。
** XSpiPs_Transfer(InstancePtr, RecvBuf, RecvBuf, ByteCount) * 调用者希望只接收而不关心发送
* 数据。在这种情况下,调用者仍然必须提供发送缓冲区,但是
* 如果调用者不关心它发送的内容,它可以与接收缓冲区相同。如果设备希望接收 N 字节的数据,则必须发送 N 字节的数据。
** 尽管此函数将整个缓冲区作为参数,但驱动程序一次只能传输有限数量的字节,这受到 FIFO 大小的限制。调用此函数仅启动传输,然后由中断服务例程执行后续的数据传输,直到整个缓冲区传输完毕。当整个缓冲区已发送/接收时,将调用状态回调函数。
** 该函数是非阻塞的。作为主设备,必须在此函数之前调用 SetSlaveSelect 函数。
** @param InstancePtr 是指向 XSpiPs 实例的指针。
* @param SendBufPtr 是指向用于发送的数据缓冲区的指针。
* 该缓冲区不能为 NULL。
* @param RecvBufPtr 是指向接收数据缓冲区的指针。
* 如果不关心接收,这个参数可以为NULL。
* @param ByteCount 包含要发送/接收的字节数。
* 接收的字节数始终等于发送的字节数。
** @return
* - 如果缓冲区成功移交给 * 设备进行传输,则 XST_SUCCESS。
* - XST_DEVICE_BUSY 表示数据传输已在进行中。这是由驾驶员决定的。
** @note
*
* 该函数不是线程安全的。高层软件必须确保
* 没有两个线程同时在 SPI 总线上传输数据。
********************************************************* ******************************/
s32 XSpiPs_PolledTransfer(XSpiPs *InstancePtr, u8 *SendBufPtr,
u8 *RecvBufPtr, u32 ByteCount)
/******************************************************** **************************/
/**
* 以轮询模式在 SPI 总线上传输指定数据。
** 调用者可以选择为发送和接收提供两个不同的缓冲区,或者为发送和接收提供一个缓冲区,或者不为接收提供缓冲区。
* 接收缓冲区必须至少与发送缓冲区一样大,以防止* 不需要的内存写入。这意味着作为
* 参数传入的字节计数必须是两个缓冲区中较小的一个(如果它们大小不同)。
* 以下是一些示例用法:*
** XSpiPs_PolledTransfer(InstancePtr, SendBuf, RecvBuf, ByteCount)
* 调用者希望发送和接收,并为发送和接收提供两个不同的
* 缓冲区。
** XSpiPs_PolledTransfer(InstancePtr, SendBuf, NULL, ByteCount)
* 调用者只想发送,并不关心接收到的 * 数据。在这种情况下,驱动程序会忽略接收到的数据。
* * XSpiPs_PolledTransfer(InstancePtr, SendBuf, SendBuf, ByteCount)* 调用者希望发送和接收,但提供相同的缓冲区 * 来执行这两种操作。驱动程序发送数据并在传输数据时用接收到的数据覆盖发送缓冲区。
** XSpiPs_PolledTransfer(InstancePtr, RecvBuf, RecvBuf, ByteCount)
* 调用者希望只接收而不关心发送
* 数据。在这种情况下,调用者仍然必须提供发送缓冲区,但是
* 如果调用者不关心它发送的内容,它可以与接收缓冲区相同。如果设备希望接收 N 字节的数据,则必须发送 N 字节的数据。
* ** @param InstancePtr 是指向 XSpiPs 实例的指针。
* @param SendBufPtr 是指向用于发送的数据缓冲区的指针。
* 该缓冲区不能为 NULL。
* @param RecvBufPtr 是指向接收数据缓冲区的指针。
* 如果不关心接收,这个参数可以为NULL。
* @param ByteCount 包含要发送/接收的字节数。
* 接收的字节数始终等于发送的字节数。
* @return* - XST_SUCCESS 如果缓冲区成功移交给 * 设备进行传输。
* - XST_DEVICE_BUSY 表示数据传输已在进行中。这是由驾驶员决定的。
** @note * * 该函数不是线程安全的。高层软件必须确保 * 没有两个线程同时在 SPI 总线上传输数据。
********************************************************* ******************************/