Microblaze SPI中断官方例程
时间: 2024-01-15 07:04:24 浏览: 27
以下是Microblaze SPI中断官方例程的代码,其中包含了AXI Interrupt Controller的配置和中断处理函数的实现:
```c
#include "xparameters.h"
#include "xspi.h"
#include "xintc.h"
#include "xil_exception.h"
#include "stdio.h"
#define SPI_DEVICE_ID XPAR_SPI_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID
#define SPI_IRPT_INTR XPAR_INTC_0_SPI_0_VEC_ID
XSpi SpiInstance;
XIntc IntcInstance;
volatile int SpiIntrFlag;
void SpiIntrHandler(void *CallBackRef, u32 StatusEvent, u16 ByteCount)
{
SpiIntrFlag = 1;
}
int SpiSetupIntrSystem(XSpi *SpiPtr, u16 SpiIntrId)
{
int Status;
XIntc *IntcPtr = &IntcInstance;
Status = XIntc_Initialize(IntcPtr, INTC_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Status = XIntc_Connect(IntcPtr, SpiIntrId,
(XInterruptHandler)XSpi_InterruptHandler,
(void *)SpiPtr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XIntc_Enable(IntcPtr, SpiIntrId);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XIntc_InterruptHandler,
IntcPtr);
Xil_ExceptionEnable();
XSpi_SetStatusHandler(SpiPtr, (void *)&SpiInstance, (XSpi_StatusHandler)SpiIntrHandler);
return XST_SUCCESS;
}
int SpiSetupDevice(XSpi *SpiPtr)
{
int Status;
XSpi_Config *ConfigPtr;
ConfigPtr = XSpi_LookupConfig(SPI_DEVICE_ID);
if (ConfigPtr == NULL) {
return XST_DEVICE_NOT_FOUND;
}
Status = XSpi_CfgInitialize(SpiPtr, ConfigPtr, ConfigPtr->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Status = XSpi_SelfTest(SpiPtr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
if (SpiPtr->SpiMode != XSP_STANDARD_MODE) {
return XST_FAILURE;
}
XSpi_SetOptions(SpiPtr, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION);
XSpi_SetSlaveSelect(SpiPtr, 0x01);
return XST_SUCCESS;
}
int SpiSetup()
{
int Status;
Status = SpiSetupDevice(&SpiInstance);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Status = SpiSetupIntrSystem(&SpiInstance, SPI_IRPT_INTR);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XSpi_Start(&SpiInstance);
return XST_SUCCESS;
}
int SpiTransfer(u8 *SendBufPtr, u8 *RecvBufPtr, unsigned int ByteCount)
{
int Status;
SpiIntrFlag = 0;
Status = XSpi_Transfer(&SpiInstance, SendBufPtr, RecvBufPtr, ByteCount);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
while (!SpiIntrFlag);
return XST_SUCCESS;
}
int main()
{
int Status;
u8 SendBuf[4] = {0x01, 0x02, 0x03, 0x04};
u8 RecvBuf[4];
Status = SpiSetup();
if (Status != XST_SUCCESS) {
printf("SPI setup failed\n");
return XST_FAILURE;
}
Status = SpiTransfer(SendBuf, RecvBuf, 4);
if (Status != XST_SUCCESS) {
printf("SPI transfer failed\n");
return XST_FAILURE;
}
printf("Received data: %02x %02x %02x %02x\n", RecvBuf[0], RecvBuf[1], RecvBuf[2], RecvBuf[3]);
return XST_SUCCESS;
}
```