5 Replies Latest reply on Jul 16, 2019 6:55 PM by user_2847636

    S25FL064L WIP always busy

    user_2847636

      Hi There,

       

      I notice the WIP always busy non stop. May I know what happened?

       

       

       

      here is my code

       

       

      #define CMD_S25FLXX_WRITE_ENABLE      0x06  /* write Enable */

      #define CMD_S25FLXX_READ_STATUS_REG   0x05  /* read Status Register */

      #define CMD_S25FLXX_PAGE_PROGRAM      0x02  /* Page Program */

       

      #define ADDRESS_1 12304

       

      static uint8_t buf_data[34] = {0};

       

      int main()

      {

           uint8_t test_data[7] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07};

      S25FLXX_write_data(ADDRESS_1 ,test_data,7);

      S25FLXX_wait_ready();

      }

       

      /* CHECK CHIP READY*/

      void S25FLXX_wait_ready(void)

      {

      do

      {

              nrf_delay_ms(10);

      buf_cmd[0] = CMD_S25FLXX_READ_STATUS_REG;

       

       

      /* reset transfer done flag */

      spi_xfer_done = false;

       

       

      APP_ERROR_CHECK(nrf_drv_spi_transfer(&S25FLXX, buf_cmd, 1, buf_data, 2));

      S25FLXX_spi_wait_until_transfer_is_completed();

                      printf("buf_data:%d\r\n",buf_data[1]);

      }

      while ((buf_data[1] & S25FLXX_BUSY) == S25FLXX_BUSY);

      }

       

      /* WRITE FUNCTION */

      uint8_t S25FLXX_write_data(uint32_t address, uint8_t* buf, uint16_t length)

      {

       

      if (! S25FLXX_is_busy())

      {

      uint16_t i;

      uint16_t len;

       

       

      uint8_t offset;

       

       

      /* Write Enable */

      buf_cmd[0] = CMD_S25FLXX_WRITE_ENABLE;

       

       

      /* reset transfer done flag */

      spi_xfer_done = false;

       

       

      APP_ERROR_CHECK(nrf_drv_spi_transfer(&S25FLXX, buf_cmd, 1, buf_data, 1));

      S25FLXX_spi_wait_until_transfer_is_completed();

       

       

      /* Page Program */

      buf_cmd[0] = CMD_S25FLXX_PAGE_PROGRAM;

       

       

      buf_cmd[1] = (uint8_t)((address & 0x00FF0000) >> 16);

      buf_cmd[2] = (uint8_t)((address & 0x0000FF00) >> 8);

       

       

      offset = (uint8_t)(address & 0x000000FF);

      len = ((S25FLXX_PAGE_SIZE - offset) < length) ? (S25FLXX_PAGE_SIZE - offset) : length;

      // len = length;

       

       

      buf_cmd[3] = offset;

       

       

      len += 4;

       

       

      for (i = 4; (i < len); i++)

      {

      buf_cmd[i] = buf[i-4];

      }

       

       

      /* reset transfer done flag */

      spi_xfer_done = false;

       

       

      APP_ERROR_CHECK(nrf_drv_spi_transfer(&S25FLXX, buf_cmd, len, buf_data, 1));

      S25FLXX_spi_wait_until_transfer_is_completed();

       

       

      return S25FLXX_OK;

      }

      else

      {

      return S25FLXX_BUSY;

      }

      }

        • 1. Re: S25FL064L WIP always busy
          BacemD_61

          Hello,

           

          Here is how the program command sequence should look like:

           

          Please attach a Logic analyzer to the flash interface to capture the flash traces. We need to check that the flash is receiving the right commands at the right time. I'm not clear about the parameters of your function nrf_drv_spi_transfer(). Please check these as well.

           

          Additionally, the WIP can be stuck at 1 in case of a program or erase error. In that case the corresponding P_ERR or E_ERR bits in SR2V will be set accordingly. You need to check these bits as well and send a CLSR command to clear the Status Register WIP bit in case of error.

           

          You need to send an erase command to erase the sector before reprogramming it (Program: changing bits from 1 to 0; Erase: changing back the bits from 0 to 1).

           

          Best regards,

          Bacem

          • 2. Re: S25FL064L WIP always busy
            user_2847636

            Hi There,

             

            Thanks for the input. I read SR2V during the WIP hang issue. it seem that Erase suspend and program suspend flag is enable. May I know what condition this will happen? The P_ERR or E_ERR bits in SR2V is not set.

             

            • 3. Re: S25FL064L WIP always busy
              BacemD_61

              Hello,

               

              This happens when you send Erase/Program suspend command (75h) to the flash.

              This looks quite suspicious since both bits are set at the same time and the WIP bit is still set to 1. I would expect the WIP to be reset to 0 once the P/E operations gets suspended.

              Something suspicious is happening here. Only LA traces will help to solve it, as noted in my previous comment.

               

              Best regards,

              Bacem

              • 4. Re: S25FL064L WIP always busy
                BushraH_91

                Hello

                We are still waiting for the LA traces. Please send us so we can resolve the issue.

                 

                Thank you

                Regards,

                Bushra

                • 5. Re: S25FL064L WIP always busy
                  user_2847636

                  Hi,

                   

                  We have discover its caused by the device's interrupt issue. Therefore we would like to close this topics.