M95P32 EEPROM using QSPI interface on Nucleo-L496ZGP
Board added to title; STM32L4 Label added.
I started Working With M95P32 EEPROM which Supports QSPI . This is my code which is not working I don't understand why there is no error in transmit and receive code. But same EEPROM working with SPI.
void QSPI_WriteEnable(void) {
QSPI_CommandTypeDef sCommand;
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.Instruction = WRITE_ENABLE_CMD;
sCommand.AddressMode = QSPI_ADDRESS_NONE;
sCommand.DataMode = QSPI_DATA_NONE;
sCommand.DummyCycles = 0;
sCommand.NbData = 0;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
}
void QSPI_ChipErase(void) {
QSPI_CommandTypeDef sCommand;
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.Instruction = CHIP_ERASE_CMD;
sCommand.AddressMode = QSPI_ADDRESS_NONE;
sCommand.DataMode = QSPI_DATA_NONE;
sCommand.DummyCycles = 0;
sCommand.NbData = 0;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
}
void QSPI_Write(uint32_t address, uint8_t *data, uint32_t size) {
QSPI_CommandTypeDef sCommand;
QSPI_WriteEnable(); // Enable write
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.Instruction = PAGE_PROGRAM_CMD;
sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
sCommand.Address = address;
sCommand.DataMode = QSPI_DATA_4_LINES;
sCommand.NbData = 1;
sCommand.DummyCycles = 0;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
for(int i=0; i<size;i++)
{
HAL_QSPI_Transmit(&hqspi, &data[i], HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
printf("sentdata:%0x",data[i]);
}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
printf("\n");
}
void QSPI_Read(uint32_t address, uint8_t *data, uint32_t size) {
QSPI_CommandTypeDef sCommand;
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.Instruction = READ_CMD;
sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
sCommand.Address = address;
sCommand.DataMode = QSPI_DATA_4_LINES;
sCommand.NbData = 1;
sCommand.DummyCycles = 0;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
for(int i=0; i<size; i++)
{
HAL_QSPI_Receive(&hqspi, &data[i], HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
printf("%0x",data[i]);
}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
printf("\n");
}
int main(void)
{
uint8_t dataToWrite[4] = {0x25,0x26,0x27,0x28};
// Write data to EEPROM
QSPI_Write(0x3, dataToWrite, sizeof(dataToWrite));
HAL_Delay(1000);
QSPI_Read(0x3, dataToRead, 4);
}
static void MX_QUADSPI_Init(void)
{
/* USER CODE BEGIN QUADSPI_Init 0 */
/* USER CODE END QUADSPI_Init 0 */
/* USER CODE BEGIN QUADSPI_Init 1 */
/* USER CODE END QUADSPI_Init 1 */
/* QUADSPI parameter configuration*/
hqspi.Instance = QUADSPI;
hqspi.Init.ClockPrescaler = 2;
hqspi.Init.FifoThreshold = 4;
hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
hqspi.Init.FlashSize = 11;
hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
hqspi.Init.FlashID = QSPI_FLASH_ID_1;
hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
if (HAL_QSPI_Init(&hqspi) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN QUADSPI_Init 2 */
/* USER CODE END QUADSPI_Init 2 */
}
