Zynq SPI

SPI的工作模式

	/*
	 * 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 
/* !< 控制器完成轮询设备状态 */

SPI传输数据

XSpiPs_Transfer
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 总线上传输数据。
********************************************************* ******************************/

XSpiPs_PolledTransfer 
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 总线上传输数据。
********************************************************* ******************************/

你可能感兴趣的:(ZYNQ裸机开发,FPGA学习,fpga开发)