Spi transfer fail. Getting stuck

I am trying to write to external flash memory using NRF52840. The flash uses spi protcol. My code is getting stuck in spi_xfer function. Error code is not in scope for the particular function so cant determine that. Attached hereis the code that i am running. I have already changed interrupt priority to 7 so that it dose not clash with SAADC. But that dosent seem to help. The code is getting stuck at line 254 (image) of file nrf_spi.h

 

#include "nrf_drv_spi.h"
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "FlashExt.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

#define SPI_INSTANCE  1 /**< SPI instance index. */
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);  /**< SPI instance. */
static volatile bool spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */

#define TEST_STRING "Nordic"
static uint8_t       m_tx_buf[]= TEST_STRING;
static uint8_t       m_rx_buf[sizeof(TEST_STRING) + 1];    /**< RX buffer. */
static const uint8_t m_length = 1;        /**< Transfer length. */
extern uint32_t System_Clock_ms;
bool Flash_Busy_Flag=false,Write_Enabled_Flag=false;
uint8_t tx_buf_flash[2]={0},rx_buf_flash[2]={0},para1;
uint64_t prev_ms;


void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
                       void *                    p_context)
{
    spi_xfer_done = true;
    NRF_LOG_INFO("Transfer completed.");
    if (m_rx_buf[0] != 0)
    {
        NRF_LOG_INFO(" Received:");
        NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
    }
}


void SPI_Setup(void)
{
	
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin   = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin  = SPI_SCK_PIN;
	
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
}


uint8_t SPI_Transfer(uint8_t Data)
{
		m_tx_buf[0]= Data;
		memset(m_rx_buf, 0, m_length);
		spi_xfer_done = false;
		APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
		return *m_rx_buf;
}

uint8_t SPI_Transfer_Read(void)
{
		memset(m_tx_buf, 0, m_length);
		memset(m_rx_buf, 0, m_length);
		spi_xfer_done = false;
		APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
		return *m_rx_buf;
}

uint8_t Flash_Stat(void)
{ Pull_CS_Low();                          //check status register 
  SPI_Transfer(RDSR);
	Pull_CS_High();
  uint8_t s=SPI_Transfer_Read();
  //  printBits(s);
  return s;
}
// use between each communication to make sure S25FLxx is ready to go.


void Flash_Waitforit()
{
  uint8_t s=Flash_Stat();
  while ((s&0x01)==0x01)					 //check if WIP bit is 1
		{   
			if ((System_Clock_ms-prev_ms)>1000)
			{           
				prev_ms=System_Clock_ms;
				Flash_Busy_Flag=true;
			}
			Flash_Busy_Flag=false;
			s=Flash_Stat();
		}

}


void Flash_Write_Enable()
	{
  SPI_Transfer(WREN);
  Flash_Waitforit();
	Write_Enabled_Flag=true;
}
	

void Pull_CS_High(void)
{
	nrf_gpio_pin_write(SPI_SS_PIN,1);
}



void Pull_CS_Low(void)
{
	nrf_gpio_pin_write(SPI_SS_PIN,0);
}



void Flash_Read(unsigned long loc, uint8_t* array, unsigned long length)
{
  SPI_Transfer(FLASH_READ);        //control byte follow by location bytes
  SPI_Transfer(loc>>16);   // convert the location integer to 3 bytes
  SPI_Transfer(loc>>8);
  SPI_Transfer(loc & 0xff);

  for (int i=0; i<length+1;i++){
    array[i]=SPI_Transfer_Read();  //send the data
		para1=array[0];
  }
}


void Flash_Erase_4k(unsigned long loc)
{

  Flash_Waitforit(); 
  Flash_Write_Enable();

  SPI_Transfer(0x20);
  SPI_Transfer(loc>>16);
  SPI_Transfer(loc>>8);
  SPI_Transfer(loc & 0xFF);
  Flash_Waitforit(); 
}


void Flash_Erase_64k(unsigned long loc)
	{
  Flash_Waitforit(); 
  Flash_Write_Enable();

  SPI_Transfer(0x20);
  SPI_Transfer(loc>>16);
  SPI_Transfer(loc>>8);
  SPI_Transfer(loc & 0xFF);
  Flash_Waitforit(); 
}


 void Flash_Erase_All(void)
	 
{
	Flash_Waitforit(); 
  Flash_Write_Enable();
  SPI_Transfer(CE);
  Flash_Waitforit();

}
 


void Flash_Write_Reg(uint8_t w)
{
  SPI_Transfer(WRSR);
  SPI_Transfer(w);
}

void Flash_Write(unsigned long loc, uint8_t* array, unsigned long length)
{

	if (length>255)
	{
			unsigned long reps=length>>8;
			unsigned long length1;
			unsigned long array_count;
			unsigned long first_length;
			unsigned remainer0=length-(256*reps);
			unsigned long locb=loc;



			for (int i=0; i<(reps+2);i++)
				{

				if (i==0)
				{

					 length1=256-(locb & 0xff);
					 first_length=length1;
					 if (length1==0){i++;}
					 array_count=0;
				}
	
				if (i>0 && i<(reps+1))
				{
						locb= first_length+loc+(256*(i-1));;

						array_count=first_length+(256*(i-1));
						length1=255;

				}
				if (i==(reps+1))
				{
						locb+=(256);
						array_count+=256;
						length1=remainer0;
						if (remainer0==0){break;}

				}



				Flash_Write_Enable(); 
				Flash_Waitforit();
				SPI_Transfer(PP);
				SPI_Transfer(locb>>16);
				SPI_Transfer(locb>>8);
				SPI_Transfer(locb & 0xff);

				for (unsigned long i=array_count; i<(length1+array_count+1) ; i++)
				{
						SPI_Transfer(array[i]); 
				}

				Flash_Waitforit();
				 



			}		
	}

	if (length<=255)
	{
		if (((loc & 0xff)!=0) | ((loc & 0xff)<length))
		{
			uint8_t remainder = loc & 0xff;
			uint8_t length1 =256-remainder;
			uint8_t length2 = length-length1;
			unsigned long page1_loc = loc;
			unsigned long page2_loc = loc+length1;

				Flash_Write_Enable(); 
				Flash_Waitforit();
				SPI_Transfer(PP);
				SPI_Transfer(page1_loc>>16);
				SPI_Transfer(page1_loc>>8);
				SPI_Transfer(page1_loc & 0xff);

				for (int i=0; i<length1;i++)
				{
					SPI_Transfer(array[i]); 
				}

				Flash_Waitforit();
				Flash_Write_Enable(); 

				Flash_Waitforit();

				SPI_Transfer(PP);
				SPI_Transfer(page2_loc>>16);
				SPI_Transfer(page2_loc>>8);
				SPI_Transfer(page2_loc & 0xff);

				for (int i=length1; i<length+1;i++)
				{
					SPI_Transfer(array[i]); 
				}

				Flash_Waitforit();
	


	}



	else
		
			{
				Flash_Write_Enable(); // Must be done before writing can commence. Erase clears it. 
				Flash_Waitforit();
				SPI_Transfer(PP);
				SPI_Transfer(loc>>16);
				SPI_Transfer(loc>>8);
				SPI_Transfer(loc & 0xff);

				for (int i=0; i<length+1;i++){
					SPI_Transfer(array[i]); 
				}

				Flash_Waitforit();
			}
	}
}

void Flash_Store(uint8_t Parameter, uint32_t location)
{		
		Flash_Waitforit();
		Flash_Erase_4k(location);
		Flash_Waitforit();
		tx_buf_flash[0] = (Parameter)/256;
		tx_buf_flash[1] =(int)((Parameter)%256);
		Flash_Write(location,tx_buf_flash,2);	
}

Related