Any idea why I need to send write enable twice, without reading the status in between, to get the write latch set?
#define EXTFLASH_CMD_WRITE_ENABLE 0x06
#define EXTFLASH_CMD_WRITE_DISABLE 0x04
#define EXTFLASH_CMD_READ_STATUS 0x05
#define EXTFLASH_CMD_READ_FSTATUS 0x70
uint8_t extflash_cmd_read_status[] = {EXTFLASH_CMD_READ_STATUS};
uint8_t extflash_cmd_read_fstatus[] = {EXTFLASH_CMD_READ_FSTATUS};
uint8_t extflash_cmd_write_enable[] = {EXTFLASH_CMD_WRITE_ENABLE};
static nrf_spi_mngr_transfer_t const extflash_read_status_xfer[] = {
NRF_SPI_MNGR_TRANSFER(extflash_cmd_read_status, sizeof(extflash_cmd_read_status), &(extflash_stat_buff[0]), 2),
NRF_SPI_MNGR_TRANSFER(extflash_cmd_read_fstatus, sizeof(extflash_cmd_read_fstatus), &(extflash_stat_buff[2]), 2)
};
static nrf_spi_mngr_transfer_t const extflash_cmd_write_enable_xfer[] = {
NRF_SPI_MNGR_TRANSFER(extflash_cmd_write_enable, sizeof(extflash_cmd_write_enable), &(extflash_stat_buff[4]), 1),
};
static nrf_spi_mngr_transaction_t extflash_trans_status =
{
.begin_callback = NULL,
.end_callback = extflash_conf_callback,
.p_user_data = (void *)EXTFLASH_TRANSACT_STATUS,
.p_transfers = extflash_read_status_xfer,
.number_of_transfers = 2,
.p_required_spi_cfg = &spi_extflash_config
};
static nrf_spi_mngr_transaction_t extflash_trans_write_enable =
{
.begin_callback = NULL,
.end_callback = extflash_conf_callback,
.p_user_data = (void *)EXTFLASH_TRANSACT_WRITE_ENABLE,
.p_transfers = extflash_cmd_write_enable_xfer,
.number_of_transfers = 1,
.p_required_spi_cfg = &spi_extflash_config
};
void extflash_conf_callback(ret_code_t result, void *p_user_data)
{
extflash_transact_done = (uint8_t)(uint32_t)p_user_data;
if (extflash_transact_done == HYP_EXTFLASH_TRANSACT_STATUS)
{
extflash_last_status = extflash_stat_buff[1];
extflash_last_fstatus = extflash_stat_buff[3];
}
}
static void extflash_read_status_blocking(void)
{
uint32_t err_code;
extflash_transact_done = HYP_EXTFLASH_TRANSACT_NONE;
err_code = nrf_spi_mngr_schedule(&extflash_trans_status);
APP_ERROR_CHECK(err_code);
while (extflash_transact_done != HYP_EXTFLASH_TRANSACT_STATUS);
}
int main()
{
...
err = nrf_spi_mngr_schedule(&extflash_trans_write_enable);
#if 0
while (extflash_transact_done != EXTFLASH_TRANSACT_WRITE_ENABLE); /* wait */
// read_status_blocking();
err = nrf_spi_mngr_schedule(&extflash_trans_write_enable);
#endif
while (extflash_transact_done != EXTFLASH_TRANSACT_WRITE_ENABLE); /* wait */
extflash_read_status_blocking();
extflash_read_status_blocking();
...
}
It doesn't work this way, but if I change "#if 0" to "#if 1", it works.
And if I uncomment the "// read_status_blocking();", it stops working.