I am using a BMD 349 module based on nRF52840.
I am interfacing with AT25SF041 flash memory.
I am using SDK 14.2.
I am writing a byte to a specific address in Flash.
But when I try to read the memory location, On the debug window I only see "00".
I don't see any error messages.
I can read the status registers and Device ID completely fine, so I know SPI read function is working.
Can someone help?
Thanks
Below is flash_mem.c
#include "flash_mem.h" #include "nrf_drv_spi.h" #include "nrf_gpio.h" static const nrf_drv_spi_t m_spi_at = NRF_DRV_SPI_INSTANCE(0); static uint32_t spi_config(void) { uint32_t err_code; nrf_drv_spi_config_t config = NRF_DRV_SPI_DEFAULT_CONFIG; config.frequency = NRF_DRV_SPI_FREQ_1M; config.mode = NRF_DRV_SPI_MODE_3; config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST; config.mosi_pin = AT_PIN_MOSI; config.miso_pin = AT_PIN_MISO; config.sck_pin = AT_PIN_SCK; config.ss_pin = AT_PIN_CS; err_code = nrf_drv_spi_init(&m_spi_at, &config, NULL, NULL); if (err_code != NRF_SUCCESS) { // Initialization failed. Take recovery action. } nrf_gpio_cfg_output(AT_PIN_CS); nrf_gpio_pin_set(AT_PIN_CS); return err_code; } uint32_t at_init(void) { return spi_config(); } void at_read_rems(uint8_t * manufacturer_id, uint8_t * device_id) { uint8_t spi_tx_cmd[] = {0x9F}; uint8_t spi_rx_response[3]; nrf_gpio_pin_clear(AT_PIN_CS); nrf_drv_spi_transfer(&m_spi_at, spi_tx_cmd, sizeof(spi_tx_cmd), spi_rx_response, sizeof(spi_rx_response)); nrf_gpio_pin_set(AT_PIN_CS); *manufacturer_id = spi_rx_response[1]; *device_id = spi_rx_response[2]; } void at_write_enable(void) { static uint8_t spi_tx_cmd[] = {CMD_WREN}; nrf_gpio_pin_clear(AT_PIN_CS); nrf_drv_spi_transfer(&m_spi_at, spi_tx_cmd, sizeof(spi_tx_cmd), 0, 0); nrf_gpio_pin_set(AT_PIN_CS); } void at_program(uint32_t address, uint8_t * data_ptr, uint32_t data_length) { uint8_t spi_tx_cmd[] = {CMD_PROGRAM, (address >> 16) & 0xFF, (address >> 8) & 0xFF, (address >> 0) & 0xFF}; nrf_gpio_pin_clear(AT_PIN_CS); nrf_drv_spi_transfer(&m_spi_at, spi_tx_cmd, sizeof(spi_tx_cmd),NULL, NULL); while(data_length > 255) { nrf_drv_spi_transfer(&m_spi_at, data_ptr, 255, NULL, NULL); data_ptr += 255; data_length -= 255; } nrf_drv_spi_transfer(&m_spi_at, data_ptr, data_length, NULL, NULL); nrf_gpio_pin_set(AT_PIN_CS); } void at_read(uint32_t address, uint8_t * data_ptr, uint32_t data_length) { uint8_t spi_tx_cmd[] = {CMD_READ, (address >> 16) & 0xFF, (address >> 8) & 0xFF, (address >> 0) & 0xFF}; nrf_gpio_pin_clear(AT_PIN_CS); nrf_drv_spi_transfer(&m_spi_at, spi_tx_cmd, sizeof(spi_tx_cmd), NULL, NULL); while(data_length > 255) { nrf_drv_spi_transfer(&m_spi_at, 0, 0, data_ptr, 255); data_ptr += 255; data_length -= 255; } nrf_drv_spi_transfer(&m_spi_at, NULL, NULL , data_ptr, data_length); nrf_gpio_pin_set(AT_PIN_CS); }
Below is part of main.c
int main(void) { uint8_t status_register, man_id, dev_id; uint8_t data_buf = 0x23; uint8_t read_buf; at_init(); at_write_enable(); uint32_t address = 0x01A8FF; //for(int i = 0; i < READ_WRITE_LENGTH; i++) data_buf[i] = i; at_program(address, &data_buf, 1); at_read(address, &read_buf, 1); NRF_LOG_INFO("Reading address %.8x: ", address); NRF_LOG_INFO("%.2X-" ,(int)read_buf); }