Запись файла в память qspi
Привет,
У меня есть файл .bin, и я хочу записать его в память qspi.
[edit]добавлен блок кода - OriginalGriff[/edit]
Что я уже пробовал:
Я сбрасываю файл во время отладки программы. но я не могу правильно записать файл в буфер. Здесь я пишу код..
#include "xparameters.h" /* SDK generated parameters */ #include "xqspips.h" /* QSPI device driver */ #include "xil_printf.h" #define QSPI_DEVICE_ID XPAR_XQSPIPS_0_DEVICE_ID #define WRITE_STATUS_CMD 0x01 #define WRITE_CMD 0x02 #define READ_CMD 0x03 #define WRITE_DISABLE_CMD 0x04 #define READ_STATUS_CMD 0x05 #define WRITE_ENABLE_CMD 0x06 #define FAST_READ_CMD 0x0B #define DUAL_READ_CMD 0x3B #define QUAD_READ_CMD 0x6B #define BULK_ERASE_CMD 0xC7 #define SEC_ERASE_CMD 0xD8 #define READ_ID 0x9F #define COMMAND_OFFSET 0 /* FLASH instruction */ #define ADDRESS_1_OFFSET 1 /* MSB byte of address to read or write */ #define ADDRESS_2_OFFSET 2 /* Middle byte of address to read or write */ #define ADDRESS_3_OFFSET 3 /* LSB byte of address to read or write */ #define DATA_OFFSET 4 /* Start of Data for Read/Write */ #define DUMMY_OFFSET 4 /* Dummy byte offset for fast, dual and quad reads */ #define DUMMY_SIZE 1 /* Number of dummy bytes for fast, dual and quad reads */ #define RD_ID_SIZE 4 /* Read ID command + 3 bytes ID response */ #define BULK_ERASE_SIZE 1 /* Bulk Erase command size */ #define SEC_ERASE_SIZE 4 /* Sector Erase command + Sector address */ #define OVERHEAD_SIZE 4 /* * The following constants specify the page size, sector size, and number of * pages and sectors for the FLASH. The page size specifies a max number of * bytes that can be written to the FLASH with a single transfer. */ #define SECTOR_SIZE 0x10000 #define NUM_SECTORS 0x100 #define NUM_PAGES 0x10000 #define PAGE_SIZE 256 /* * Number of flash pages to be written. */ #define PAGE_COUNT 1611 /* * Flash address to which data is ot be written. */ #define TEST_ADDRESS 0x00000000 #define UNIQUE_VALUE 0x05 /* * The following constants specify the max amount of data and the size of the * the buffer required to hold the data and overhead to transfer the data to * and from the FLASH. */ #define MAX_DATA PAGE_COUNT * PAGE_SIZE /**************************** Type Definitions *******************************/ /***************** Macros (Inline Functions) Definitions *********************/ /************************** Function Prototypes ******************************/ void FlashErase(XQspiPs *QspiPtr, u32 Address, u32 ByteCount); void FlashWrite(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command); void FlashRead(XQspiPs *QspiPtr, u32 Address, u32 ByteCount, u8 Command); int FlashReadID(void); int QspiFlashPolledExample(XQspiPs *QspiInstancePtr, u16 QspiDeviceId); /************************** Variable Definitions *****************************/ /* * The instances to support the device drivers are global such that they * are initialized to zero each time the program runs. They could be local * but should at least be static so they are zeroed. */ static XQspiPs QspiInstance; /* * The following variable allows a test value to be added to the values that * are written to the FLASH such that unique values can be generated to * guarantee the writes to the FLASH were successful */ int Test = 5; /* * The following variables are used to read and write to the flash and they * are global to avoid having large buffers on the stack */ u8 ReadBuffer[MAX_DATA + DATA_OFFSET + DUMMY_SIZE]; u8 WriteBuffer[PAGE_SIZE + DATA_OFFSET]; /*****************************************************************************/ /** * * Main function to call the QSPI Flash example. * * @param None * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note None * ******************************************************************************/ int main(void) { int Status; xil_printf("QSPI FLASH Polled Example Test \r\n"); /* * Run the Qspi Interrupt example. */ Status = QspiFlashPolledExample(&QspiInstance, QSPI_DEVICE_ID); if (Status != XST_SUCCESS) { xil_printf("QSPI FLASH Polled Example Test Failed\r\n"); return XST_FAILURE; } xil_printf("Successfully ran QSPI FLASH Polled Example Test\r\n"); return XST_SUCCESS; } /***************************************************************************** * * The purpose of this function is to illustrate how to use the XQspiPs * device driver in polled mode. This function writes and reads data * from a serial FLASH. * * @param None. * * @return XST_SUCCESS if successful, else XST_FAILURE. * * @note None. * *****************************************************************************/ int QspiFlashPolledExample(XQspiPs *QspiInstancePtr, u16 QspiDeviceId) { int Status; u8 *BufferPtr; u8 UniqueValue; int Count; int Page; XQspiPs_Config *QspiConfig; /* * Initialize the QSPI driver so that it's ready to use */ QspiConfig = XQspiPs_LookupConfig(QspiDeviceId); if (NULL == QspiConfig) { return XST_FAILURE; } Status = XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig, QspiConfig->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform a self-test to check hardware build */ Status = XQspiPs_SelfTest(QspiInstancePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Initialize the write buffer for a pattern to write to the FLASH * and 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 to guarantee */ for (UniqueValue = UNIQUE_VALUE, Count = 0; Count < PAGE_SIZE; Count++, UniqueValue++) { WriteBuffer[DATA_OFFSET + Count] = (u8)(UniqueValue + Test); } memset(ReadBuffer, 0x00, sizeof(ReadBuffer)); /* * Set Manual Start and Manual Chip select options and drive HOLD_B * pin high. */ XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_MANUAL_START_OPTION | XQSPIPS_FORCE_SSELECT_OPTION | XQSPIPS_HOLD_B_DRIVE_OPTION); /* * Set the prescaler for QSPI clock */ XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8); /* * Assert the FLASH chip select. */ XQspiPs_SetSlaveSelect(QspiInstancePtr); //FlashReadID(); /* * Erase the flash. */ //FlashErase(QspiInstancePtr, TEST_ADDRESS, MAX_DATA); /* * Write the data in the write buffer to the serial FLASH a page at a * time, starting from TEST_ADDRESS */ for (Page = 0; Page < PAGE_COUNT; Page++) { FlashWrite(QspiInstancePtr, (Page * PAGE_SIZE) + TEST_ADDRESS, PAGE_SIZE, WRITE_CMD); } return XST_SUCCESS; }
CPallini
- но я не могу правильно записать файл в буфер."
Это довольно расплывчато. Не могли бы вы дать нам больше информации?
Какое устройство вы программируете? Что такое QUAD SPI FLASH peripheral?