int init_spi(XSpi *SpiInstancePtr){ int Status; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ ConfigPtr = XSpi_LookupConfig(SPI_DEVICE_ID); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = XSpi_SelfTest(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) { return XST_SUCCESS; } Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } XSpi_Start(SpiInstancePtr); XSpi_IntrGlobalDisable(SpiInstancePtr); return XST_SUCCESS; }
/****************************************************************************** * This function initializes the SPI and GPIO drivers needed to control the * OLED display. * * @param psSpi is the pointer to the SPI driver structure. * @param psGpio is the pointer to the GPIO driver structure. * * @return XST_SUCCESS - Everything went well * XST_DEVICE_NOT_FOUND - Device not found * XST_FAILURE - Failure *****************************************************************************/ XStatus fnOledDriverInit(XSpi *psSpi, XGpio *psGpio) { XStatus Status; XSpi_Config *SpiConfigPtr; XGpio_Config *GpioConfigPtr; // Initialize the SPI driver so that it is ready to use. SpiConfigPtr = XSpi_LookupConfig(OLED_SPI_DEVICE_ID); if(SpiConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(psSpi, SpiConfigPtr, SpiConfigPtr->BaseAddress); if(Status != XST_SUCCESS) { return XST_FAILURE; } // Initialize the GPIO driver GpioConfigPtr = XGpio_LookupConfig(OLED_GPIO_DEVICE_ID); if(GpioConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XGpio_CfgInitialize(psGpio, GpioConfigPtr, GpioConfigPtr->BaseAddress); if(Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; }
/** * * This function does a selftest and loopback test on the SPI device and * XSpi driver as an example. The purpose of this function is to illustrate * how to use the XSpi component. * * * @param DeviceId is the XPAR_<SPI_instance>_DEVICE_ID value from * xparameters.h * * @return XST_SUCCESS if successful, XST_FAILURE if unsuccessful * * @note None * ****************************************************************************/ int SpiSelfTestExample(u16 DeviceId) { int Status; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(DeviceId); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(&Spi, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to ensure that the hardware was built correctly */ Status = XSpi_SelfTest(&Spi); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; }
/***** * PmodCtlSys_init() - initialize the PmodCtlsys * * This function initializes the PmodCtlSys ADC (an MSP3202). Sine * the MSP3202 is a SPI device the primary purpose of the function * is to configure and start the Xilinx SPI peripheral. It checks * basic functionality of the SPI peripheral by running the self-test. * It also writes the correct data to the global send buffer PmodCtlSys_SndBuf[] * because its contents never change. This code is based on the Xilinx SPI * driver "spi_polled_example.c" example included in the EDK. *****/ XStatus PmodCtlSys_init(XSpi *SpiInstancePtr, u16 SpiDeviceID) { XStatus Status; // return status from SPI driver functions XSpi_Config *ConfigPtr; // Pointer to Configuration data // Initialize the SPI driver so that it is ready to use. ConfigPtr = XSpi_LookupConfig(SpiDeviceID); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } // Perform a self-test to ensure that the hardware was built correctly Status = XSpi_SelfTest(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } // Set the Spi device as a master, // SS goes low for entire transaction (does not toggle every 8 bits) // All other bits are OK as defaults Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } // Start the SPI driver so that the device is enabled // and then disable the Global interrupt because we // are using the peripheral in polled mode XSpi_Start(SpiInstancePtr); XSpi_IntrGlobalDisable(SpiInstancePtr); // initialize the SPI send buffer. Since the PmodCtlSys only // uses the channel 0 ADC in the MPS3202 the send buffer // contents will always be the same. // Command Byte 1 - Start bit is in the LSB, others are don't care // Command Byte 2 - single-ended input, Select Channel 0, send data most-significant bit first // Command Byte 2 - needed to have ADC return all the counts bits. All bits are don't care PmodCtlSys_SndBuf[0] = MSP3202_START_MSK; PmodCtlSys_SndBuf[1] = (MSP3202_SGL_MSK << 7) | (MSP3202_SEL_CHNL0_MSK << 6) | (MSP3202_SEL_MSBF_MSK << 5); PmodCtlSys_SndBuf[2] = 0x55; return XST_SUCCESS; }
/***************************************************************************//** * @brief spi_init *******************************************************************************/ int32_t spi_init(uint32_t device_id, uint8_t clk_pha, uint8_t clk_pol) { uint32_t base_addr = 0; uint32_t spi_options = 0; #ifdef _XPARAMETERS_PS_H_ spi_config = XSpiPs_LookupConfig(device_id); base_addr = spi_config->BaseAddress; XSpiPs_CfgInitialize(&spi_instance, spi_config, base_addr); spi_options = XSPIPS_MASTER_OPTION | (clk_pol ? XSPIPS_CLK_ACTIVE_LOW_OPTION : 0) | (clk_pha ? XSPIPS_CLK_PHASE_1_OPTION : 0) | (spi_decoded_cs ? XSPIPS_DECODE_SSELECT_OPTION : 0) | XSPIPS_FORCE_SSELECT_OPTION; XSpiPs_SetOptions(&spi_instance, spi_options); XSpiPs_SetClkPrescaler(&spi_instance, XSPIPS_CLK_PRESCALE_32); /* FIXME: Temporary 15.2 Fix */ XSpiPs_CfgInitialize(&spi_instance, spi_config, base_addr); XSpiPs_SetOptions(&spi_instance, spi_options); XSpiPs_SetClkPrescaler(&spi_instance, XSPIPS_CLK_PRESCALE_32); #else XSpi_Initialize(&spi_instance, device_id); XSpi_Stop(&spi_instance); spi_config = XSpi_LookupConfig(device_id); base_addr = spi_config->BaseAddress; XSpi_CfgInitialize(&spi_instance, spi_config, base_addr); spi_options = XSP_MASTER_OPTION | (clk_pol ? XSP_CLK_ACTIVE_LOW_OPTION : 0) | (clk_pha ? XSP_CLK_PHASE_1_OPTION : 0) | XSP_MANUAL_SSELECT_OPTION; XSpi_SetOptions(&spi_instance, spi_options); XSpi_Start(&spi_instance); XSpi_IntrGlobalDisable(&spi_instance); #endif return 0; }
/***************************************************************************//** * @brief spi_init *******************************************************************************/ int32_t spi_init(uint32_t device_id, uint8_t clk_pha, uint8_t clk_pol) { uint32_t base_addr = 0; uint32_t control_val = 0; #ifdef _XPARAMETERS_PS_H_ uint8_t byte = 0; spi_config = XSpiPs_LookupConfig(device_id); base_addr = spi_config->BaseAddress; XSpiPs_CfgInitialize(&spi_instance, spi_config, base_addr); control_val = XSPIPS_CR_SSFORCE_MASK | XSPIPS_CR_SSCTRL_MASK | 4 << XSPIPS_CR_PRESC_SHIFT | (clk_pha ? XSPIPS_CR_CPHA_MASK : 0) | (clk_pol ? XSPIPS_CR_CPOL_MASK : 0) | XSPIPS_CR_MSTREN_MASK; XSpiPs_WriteReg(base_addr, XSPIPS_CR_OFFSET, control_val); for(byte = 0; byte < 128; byte++) { XSpiPs_ReadReg(base_addr, XSPIPS_RXD_OFFSET); } #else XSpi_Initialize(&spi_instance, device_id); XSpi_Stop(&spi_instance); spi_config = XSpi_LookupConfig(device_id); base_addr = spi_config->BaseAddress; XSpi_CfgInitialize(&spi_instance, spi_config, base_addr); control_val = XSP_MASTER_OPTION | XSP_CLK_PHASE_1_OPTION | XSP_MANUAL_SSELECT_OPTION; XSpi_SetOptions(&spi_instance, control_val); XSpi_Start(&spi_instance); XSpi_IntrGlobalDisable(&spi_instance); XSpi_SetSlaveSelect(&spi_instance, 1); #endif return SUCCESS; }
/** * * Initializes a specific XSpi instance such that the driver is ready to use. * * The state of the device after initialization is: * - Device is disabled * - Slave mode * - Active high clock polarity * - Clock phase 0 * * @param InstancePtr is a pointer to the XSpi instance to be worked on. * @param DeviceId is the unique id of the device controlled by this XSpi * instance. Passing in a device id associates the generic XSpi * instance to a specific device, as chosen by the caller or * application developer. * * @return * * - XST_SUCCESS if successful. * - XST_DEVICE_IS_STARTED if the device is started. It must be * stopped to re-initialize. * - XST_DEVICE_NOT_FOUND if the device was not found in the * configuration such that initialization could not be * accomplished. * * @note None. * ******************************************************************************/ int XSpi_Initialize(XSpi *InstancePtr, u16 DeviceId) { XSpi_Config *ConfigPtr; /* Pointer to Configuration ROM data */ Xil_AssertNonvoid(InstancePtr != NULL); /* * Lookup the device configuration in the temporary CROM table. Use this * configuration info down below when initializing this component. */ ConfigPtr = XSpi_LookupConfig(DeviceId); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } return XSpi_CfgInitialize(InstancePtr, ConfigPtr, ConfigPtr->BaseAddress); }
/** * * This function does a minimal test on the Spi device and driver as a * design example. The purpose of this function is to illustrate how to use * the XSpi component using the polled mode. * * This function sends data and expects to receive the same data. * * * @param SpiInstancePtr is a pointer to the instance of Spi component. * @param SpiDeviceId is the Device ID of the Spi Device and is the * XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note * * This function contains an infinite loop such that if the Spi device is not * working it may never return. * ******************************************************************************/ int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId) { int Status; u32 Count; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(SpiDeviceId); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to ensure that the hardware was built correctly. */ Status = XSpi_SelfTest(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Run loopback test only in case of standard SPI mode. */ if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) { return XST_SUCCESS; } /* * Set the Spi device as a master and in loopback mode. */ Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(SpiInstancePtr); /* * Disable Global interrupt to use polled mode operation */ XSpi_IntrGlobalDisable(SpiInstancePtr); /* * Initialize the write buffer with pattern to write, initialize the * read buffer to zero so it can be verified after the read, the * Test value that is added to the unique value allows the value to be * changed in a debug environment. */ /* * Transmit the data. */ /*Init ADCL*/ SpiInstancePtr->SlaveSelectReg = 0x00000000; ADXL362_Init(SpiInstancePtr); DelayMs(1); while(1) { int x = 0, y=0, z=0, temp; x= ADXL362_ReadX(SpiInstancePtr); y= ADXL362_ReadY(SpiInstancePtr); z= ADXL362_ReadZ(SpiInstancePtr); temp = ADXL362_ReadTemp(SpiInstancePtr); DelayMs(5); xil_printf("X: %d\r\n", x); xil_printf("Y: %d\r\n", y); xil_printf("Z: %d\r\n", z); xil_printf("temperature: %d\r\n", temp); } SpiInstancePtr->SlaveSelectReg = 0x0000001; return XST_SUCCESS; }
/** * * This function does a minimal test on the Spi device and driver as a * design example. The purpose of this function is to illustrate how to use * the XSpi component using the polled mode. * * This function sends data and expects to receive the same data. * * * @param SpiInstancePtr is a pointer to the instance of Spi component. * @param SpiDeviceId is the Device ID of the Spi Device and is the * XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note * * This function contains an infinite loop such that if the Spi device is not * working it may never return. * ******************************************************************************/ int SpiPolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId) { int Status; u32 Count; u8 Test; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(SpiDeviceId); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to ensure that the hardware was built correctly. */ Status = XSpi_SelfTest(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Run loopback test only in case of standard SPI mode. */ if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) { return XST_SUCCESS; } /* * Set the Spi device as a master and in loopback mode. */ Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION | XSP_LOOPBACK_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(SpiInstancePtr); /* * Disable Global interrupt to use polled mode operation */ XSpi_IntrGlobalDisable(SpiInstancePtr); /* * Initialize the write buffer with pattern to write, initialize the * read buffer to zero so it can be verified after the read, the * Test value that is added to the unique value allows the value to be * changed in a debug environment. */ Test = 0x10; for (Count = 0; Count < BUFFER_SIZE; Count++) { WriteBuffer[Count] = (u8)(Count + Test); ReadBuffer[Count] = 0; } /* * Transmit the data. */ XSpi_Transfer(SpiInstancePtr, WriteBuffer, ReadBuffer, BUFFER_SIZE); /* * Compare the data received with the data that was transmitted. */ for (Count = 0; Count < BUFFER_SIZE; Count++) { if (WriteBuffer[Count] != ReadBuffer[Count]) { return XST_FAILURE; } } return XST_SUCCESS; }
/** * * This function does a minimal test on the Spi device and driver as a design * example. The purpose of this function is to illustrate the device slave * functionality in polled mode. This function receives data from a master and * prints the received data. * * @param SpiInstancePtr is a pointer to the instance of Spi component. * * @param SpiDeviceId is the Device ID of the Spi Device and is the * XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note This function contains an infinite loop such that if the Spi * device doesn't receive any data, it may never return. * ******************************************************************************/ int SpiSlavePolledExample(XSpi *SpiInstancePtr, u16 SpiDeviceId) { XSpi_Config *ConfigPtr; int Status; u32 Count; xil_printf("\r\nEntering the Spi Slave Polled Example.\r\n"); xil_printf("Waiting for data from SPI master\r\n"); /* * Initialize the SPI driver so that it's ready to use, specify the * device ID that is generated in xparameters.h. */ ConfigPtr = XSpi_LookupConfig(SpiDeviceId); if (ConfigPtr == NULL) { return XST_FAILURE; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * The SPI device is a slave by default and the clock phase and polarity * have to be set according to its master. In this example, CPOL is set * to active low and CPHA is set to 1. */ Status = XSpi_SetOptions(SpiInstancePtr, XSP_CLK_PHASE_1_OPTION | XSP_CLK_ACTIVE_LOW_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(SpiInstancePtr); /* * Disable Global interrupt to use polled mode operation. */ XSpi_IntrGlobalDisable(SpiInstancePtr); /* * Initialize the write buffer with pattern to write, initialize the * read buffer to zero so that it can be verified after the read. */ Test = 0xF0; for (Count = 0; Count < BUFFER_SIZE; Count++) { WriteBuffer[Count] = (u8)(Count + Test); ReadBuffer[Count] = 0; } /* * Prepare the data buffers for transmission and to send/receive data * when the SPI device is selected by a master. */ XSpi_Transfer(SpiInstancePtr, WriteBuffer, ReadBuffer, BUFFER_SIZE); /* * Print all the data received from the master so that it can be * compared with the data sent by the master. */ xil_printf("\r\nReceived data is:\r\n"); for (Count = 0; Count < BUFFER_SIZE; Count++) { xil_printf("0x%x \r\n", ReadBuffer[Count]); } xil_printf("\r\nExiting the Spi Slave Polled Example.\r\n"); return XST_SUCCESS; }
int main() { xil_printf("Master SPI oRSC echo test\n"); // initialize stdout. init_platform(); tx_buffer = cbuffer_new(); rx_buffer = cbuffer_new(); spi_stream = spi_stream_init( tx_buffer, rx_buffer, DoSpiTransfer, // callback which triggers a SPI transfer 0); int Status; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(SPI_DEVICE_ID); if (ConfigPtr == NULL) { xil_printf ("Error: could not lookup SPI configuration\n"); return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(&SpiInstance, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { xil_printf("Error: could not initialize the SPI device\n"); return XST_FAILURE; } Status = XSpi_SelfTest(&SpiInstance); if (Status != XST_SUCCESS) { xil_printf("Error: The SPI self test failed.\n"); return XST_FAILURE; } /* * Connect the Spi device to the interrupt subsystem such that * interrupts can occur. This function is application specific. */ Status = SpiSetupIntrSystem(&IntcInstance, &SpiInstance, SPI_IRPT_INTR); if (Status != XST_SUCCESS) { xil_printf("Error: Could not setup interrupt system.\n"); return XST_FAILURE; } /* * Set the Spi device as a master. */ Status = XSpi_SetOptions(&SpiInstance, XSP_MASTER_OPTION); if (Status != XST_SUCCESS) { xil_printf("Error: Could not set as master\n"); return XST_FAILURE; } // Go! XSpi_Start(&SpiInstance); // Note: to disable interrupt, do: XIntc_Disconnect(&IntcInstance, // SPI_IRPT_INTR); u32 expected_rx = 0; u32 current_tx = 0; while (1) { // fill up the transmit buffer while (cbuffer_freespace(tx_buffer)) { cbuffer_push_back(tx_buffer, current_tx++); } // check to make sure the received buffer is what we expect while (cbuffer_size(rx_buffer)) { u32 front = cbuffer_value_at(rx_buffer, 0); if (front != expected_rx) { //xil_printf("Error: expected %lx, got %lx!\n", expected_rx, front); xil_printf("Error: data value\n"); } expected_rx++; cbuffer_deletefront(rx_buffer, 1); } } return 0; }
void LEDPIN_Init(void) { int Status; Status = XGpio_Initialize(&dc, XPAR_AXI_GPIO_0_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = XGpio_Initialize(&reset, XPAR_AXI_GPIO_1_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = XGpio_Initialize(&led1, XPAR_AXI_GPIO_2_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = XGpio_Initialize(&led2, XPAR_AXI_GPIO_3_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } XGpio_SetDataDirection(&dc, DC_CHANNEL, 0x0); XGpio_DiscreteWrite(&dc, DC_CHANNEL, 0x0); XGpio_SetDataDirection(&reset, reset_CHANNEL, 0x0); XGpio_DiscreteWrite(&reset, reset_CHANNEL, 0x0); XGpio_SetDataDirection(&led1, reset_CHANNEL, 0x0); XGpio_DiscreteWrite(&led1, reset_CHANNEL, 0x0); XGpio_SetDataDirection(&led2, reset_CHANNEL, 0x0); XGpio_DiscreteWrite(&led2, reset_CHANNEL, 0x0); XGpio_DiscreteWrite(&led2, reset_CHANNEL, 0x1); XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(SPI_DEVICE_ID); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(&Spi, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to ensure that the hardware was built correctly */ Status = XSpi_SelfTest(&Spi); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = XSpi_SetOptions(&Spi, XSP_MASTER_OPTION | XSP_CLK_ACTIVE_LOW_OPTION );//| XSP_CR_CLK_POLARITY_MASK | XSP_CR_CLK_PHASE_MASK); if (Status != XST_SUCCESS) { return XST_FAILURE; XGpio_DiscreteWrite(&led2, reset_CHANNEL, 0x0); } // | XSP_CR_CPOL_MASK|XSP_CR_CPHA_MASK); //XSpiPs_SetClkPrescaler(&Spi, XSPIPS_CLK_PRESCALE_256); XSpi_SetSlaveSelect(&Spi, 0x1); //XSpi_Start(&Spi); Status = XSpi_Start(&Spi); if (Status != XST_SUCCESS) { return XST_FAILURE; } XSpi_IntrGlobalDisable(&Spi); /*Status = XSpi_SetSlaveSelect(&Spi, 0x1); if (Status != XST_SUCCESS) { return XST_FAILURE; }*/ }
/** * * This function does a minimal test on the Spi device and driver as a design * example. The purpose of this function is to illustrate the device slave * functionality in interrupt mode. This function receives data from a master and * prints the received data. * * @param SpiInstancePtr is a pointer to the instance of Spi component. * @param SpiDeviceId is the Device ID of the Spi Device and is the * XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note This function contains an infinite loop such that if the Spi * device doesn't receive any data or if the interrupts are not * working, it may never return. * ******************************************************************************/ static int SpiSlaveIntrExample(XSpi *SpiInstancePtr, u16 SpiDeviceId) { XSpi_Config *ConfigPtr; int Status; u32 Count; xil_printf("\r\nEntering the Spi Slave Interrupt Example.\r\n"); xil_printf("Waiting for data from SPI master\r\n"); /* * Initialize the SPI driver so that it's ready to use, specify the * device ID that is generated in xparameters.h. */ ConfigPtr = XSpi_LookupConfig(SpiDeviceId); if (ConfigPtr == NULL) { return XST_FAILURE; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Connect the SPI driver to the interrupt subsystem such that * interrupts can occur. This function is application specific. */ Status = SetupInterruptSystem(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * 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. */ XSpi_SetStatusHandler(SpiInstancePtr,SpiInstancePtr,(XSpi_StatusHandler) SpiHandler); /* * The SPI device is a slave by default and the clock phase and polarity * have to be set according to its master. In this example, CPOL is set * to active low and CPHA is set to 1. */ Status = XSpi_SetOptions(SpiInstancePtr, XSP_CLK_PHASE_1_OPTION | XSP_CLK_ACTIVE_LOW_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(SpiInstancePtr); /* * Enable the DTR half-empty interrupt while transfering more than * FIFO_DEPTH number of bytes in slave mode, so that the Tx FIFO * is never empty during a transfer. If the Tx FIFO is empty during * a transfer, it results in master receiving invalid data. */ XSpi_IntrEnable(SpiInstancePtr, XSP_INTR_TX_HALF_EMPTY_MASK); /* * Initialize the write buffer with pattern to write, initialize the * read buffer to zero so it can be verified after the read. */ Test = 0x50; for (Count = 0; Count < BUFFER_SIZE; Count++) { WriteBuffer[Count] = (u8)(Count + Test); ReadBuffer[Count] = 0; } /* * Transmit data as a slave, when the master starts sending data. */ TransferInProgress = TRUE; Status = XSpi_Transfer(SpiInstancePtr, WriteBuffer, ReadBuffer, BUFFER_SIZE); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Wait till the transfer is complete. */ while (TransferInProgress == TRUE); /* * Print all the data received from the master. */ xil_printf("\r\nReceived data is:\r\n"); for (Count = 0; Count < BUFFER_SIZE; Count++) { xil_printf("0x%x \r\n", ReadBuffer[Count]); } xil_printf("\r\nExiting the Spi Slave Interrupt Example.\r\n"); return XST_SUCCESS; }
/** * * This function does a minimal test on the Spi device and driver as a * design example. The purpose of this function is to illustrate how to use * the XSpi component using the interrupt mode. * * This function sends data and expects to receive the same data. * * * @param IntcInstancePtr is a pointer to the instance of the INTC * component. * @param SpiInstancePtr is a pointer to the instance of Spi component. * @param SpiDeviceId is the Device ID of the Spi Device and is the * XPAR_<SPI_instance>_DEVICE_ID value from xparameters.h. * @param SpiIntrId is the interrupt Id and is typically * XPAR_<INTC_instance>_<SPI_instance>_VEC_ID value from * xparameters.h . * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note * * This function contains an infinite loop such that if interrupts are not * working it may never return. * ******************************************************************************/ int SpiIntrExample(XIntc *IntcInstancePtr, XSpi *SpiInstancePtr, u16 SpiDeviceId, u16 SpiIntrId) { int Status; u32 Count; u8 Test; XSpi_Config *ConfigPtr; /* Pointer to Configuration data */ /* * Initialize the SPI driver so that it is ready to use. */ ConfigPtr = XSpi_LookupConfig(SpiDeviceId); if (ConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } Status = XSpi_CfgInitialize(SpiInstancePtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to ensure that the hardware was built correctly. */ Status = XSpi_SelfTest(SpiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Run loopback test only in case of standard SPI mode. */ if (SpiInstancePtr->SpiMode != XSP_STANDARD_MODE) { return XST_SUCCESS; } /* * Connect the Spi device to the interrupt subsystem such that * interrupts can occur. This function is application specific. */ Status = SpiSetupIntrSystem(IntcInstancePtr, SpiInstancePtr, SpiIntrId); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * 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. */ XSpi_SetStatusHandler(SpiInstancePtr, SpiInstancePtr, (XSpi_StatusHandler) SpiIntrHandler); /* * Set the Spi device as a master and in loopback mode. */ Status = XSpi_SetOptions(SpiInstancePtr, XSP_MASTER_OPTION | XSP_LOOPBACK_OPTION); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that interrupts and the device are enabled. */ XSpi_Start(SpiInstancePtr); /* * Initialize the write buffer with pattern to write, initialize the * read buffer to zero so it can be verified after the read, the * Test value that is added to the unique value allows the value to be * changed in a debug environment. */ Test = 0x10; for (Count = 0; Count < BUFFER_SIZE; Count++) { WriteBuffer[Count] = (u8)(Count + Test); ReadBuffer[Count] = 0; } /* * Transmit the data. */ TransferInProgress = TRUE; XSpi_Transfer(SpiInstancePtr, WriteBuffer, ReadBuffer, BUFFER_SIZE); /* * Wait for the transmission to be complete. */ while (TransferInProgress); /* * Disable the Spi interrupt. */ SpiDisableIntrSystem(IntcInstancePtr, SpiIntrId); /* * Compare the data received with the data that was transmitted. */ for (Count = 0; Count < BUFFER_SIZE; Count++) { if (WriteBuffer[Count] != ReadBuffer[Count]) { return XST_FAILURE; } } return XST_SUCCESS; }
int Mrf24j::initDrivers(void) { // TODO: check pin direction /*pinMode(_pin_reset, OUTPUT); pinMode(_pin_cs, OUTPUT); pinMode(_pin_int, INPUT);*/ XSpi_Config *SPIConfigPtr; XGpio_Config *GPIOConfigPtr; int status; /* * Initialize the SPI driver so that it is ready to use. */ SPIConfigPtr = XSpi_LookupConfig(XPAR_SPI_0_DEVICE_ID); if (SPIConfigPtr == NULL) { return XST_DEVICE_NOT_FOUND; } status = XSpi_CfgInitialize(&MSpiInstance, SPIConfigPtr, SPIConfigPtr->BaseAddress); if (status != XST_SUCCESS) { return XST_FAILURE; } /* * Set the Spi device as a master. */ status = XSpi_SetOptions( &MSpiInstance, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION ); //TO DO, add msb first config if (status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(&MSpiInstance); /* * Disable Global interrupt to use polled mode operation */ XSpi_IntrGlobalDisable(&MSpiInstance); //GPIO config GPIOConfigPtr = XGpio_LookupConfig(XPAR_GPIO_1_DEVICE_ID); status = XGpio_CfgInitialize(&gpioInstance, GPIOConfigPtr, GPIOConfigPtr->BaseAddress); if (status != XST_SUCCESS) { return XST_FAILURE; } XGpio_SetDataDirection(&gpioInstance, 1, 0x1); //check data direction XGpio_DiscreteWrite(&gpioInstance, 1, 0x6); //check register, check wake pin if it is ok high //for(int i = 0; i < 20; i++) //{ //u32 intr = XGpio_InterruptGetEnabled(&gpioInstance); //u32 sts = XGpio_InterruptGetStatus(&gpioInstance); //XGpio_InterruptClear(&gpioInstance, XGPIO_IR_CH1_MASK); ///sts = XGpio_InterruptGetStatus(&gpioInstance); //u32 usts = sts; //} /*SPI.setBitOrder(MSBFIRST) ; SPI.setDataMode(SPI_MODE0); SPI.begin();*/ return XST_SUCCESS; }
void OledHostInit() { XSpi_Config *SPIConfigPtr; XGpio_Config *GPIOConfigPtr; int status; /* * Initialize the SPI driver so that it is ready to use. */ SPIConfigPtr = XSpi_LookupConfig(XPAR_SPI_1_DEVICE_ID); if (SPIConfigPtr == NULL) { printf("OledHostInit: ERROR: SPI device not found"); } status = XSpi_CfgInitialize(&SpiInstance, SPIConfigPtr, SPIConfigPtr->BaseAddress); if (status != XST_SUCCESS) { printf("OledHostInit: ERROR: cannot init SPI"); } /* * Set the Spi device as a master. */ status = XSpi_SetOptions( &SpiInstance, XSP_MASTER_OPTION | XSP_MANUAL_SSELECT_OPTION | XSP_CLK_ACTIVE_LOW_OPTION | XSP_CLK_PHASE_1_OPTION); if (status != XST_SUCCESS) { printf("OledHostInit: ERROR: set SPI options"); } /* * Start the SPI driver so that the device is enabled. */ XSpi_Start(&SpiInstance); /* * Disable Global interrupt to use polled mode operation */ XSpi_IntrGlobalDisable(&SpiInstance); u32 slaveReg = XSpi_GetSlaveSelectReg(&SpiInstance); XSpi_SetSlaveSelectReg(&SpiInstance, 0x00); slaveReg = XSpi_GetSlaveSelectReg(&SpiInstance); //GPIO config GPIOConfigPtr = XGpio_LookupConfig(XPAR_GPIO_0_DEVICE_ID); if (GPIOConfigPtr == NULL) { printf("OledHostInit: ERROR: GPIO device not found"); } status = XGpio_CfgInitialize(&gpioInstance, GPIOConfigPtr, GPIOConfigPtr->BaseAddress); if (status != XST_SUCCESS) { printf("OledHostInit: ERROR: cannot init GPIO"); } XGpio_SetDataDirection(&gpioInstance, 1, 0xf0); XGpio_DiscreteWrite(&gpioInstance, 1, 0x0F); }