A method for data error recovery in non-volatile memory, comprising: determining that binary data read from a specified range of sequential memory locations in a charge-based non-volatile memory array contains errors that were uncorrected by an error correcting code unit associated with the NV memory array, wherein the specified range of sequential memory locations is a page of memory; identifying which memory cells in the specified range produced data that is likely to be in error; changing the data for at least some of the memory cells whose data was determined to likely be in error; and verifying whether the changed data enables the ECC unit to correct the previously uncorrected errors in the specified range of sequential memory locations; characterised in that the identifying includes: incrementing a read reference voltage through a range of voltage values; and reading for each increment, binary data from within the specified range of sequential memory locations; and the method further includes: identifying which memory cells produce different binary data in a current increment than for a previous increment to determine analog charge values for the memory cells that produced different binary data, (640,650), wherein the analog charge value is a value that represents the voltage for the charge stored in a particular cell; restoring the incremented read reference voltage to their original read reference voltages; and comparing the restored incremented read reference voltage to the analog charge vlaues for the memory cells that produced different binary data to identify which memory cells in the specified range produced data that is likely to be in error (670,680). determining that binary data read from a specified range of sequential memory locations in a charge-based non-volatile memory array contains errors that were uncorrected by an error correcting code unit associated with the NV memory array, wherein the specified range of sequential memory locations is a page of memory; identifying which memory cells in the specified range produced data that is likely to be in error; changing the data for at least some of the memory cells whose data was determined to likely be in error; and verifying whether the changed data enables the ECC unit to correct the previously uncorrected errors in the specified range of sequential memory locations; incrementing a read reference voltage through a range of voltage values; and reading for each increment, binary data from within the specified range of sequential memory locations; and the method further includes: identifying which memory cells produce different binary data in a current increment than for a previous increment to determine analog charge values for the memory cells that produced different binary data, (640,650), wherein the analog charge value is a value that represents the voltage for the charge stored in a particular cell; identifying which memory cells produce different binary data in a current increment than for a previous increment to determine analog charge values for the memory cells that produced different binary data, (640,650), wherein the analog charge value is a value that represents the voltage for the charge stored in a particular cell; restoring the incremented read reference voltage to their original read reference voltages; and comparing the restored incremented read reference voltage to the analog charge vlaues for the memory cells that produced different binary data to identify which memory cells in the specified range produced data that is likely to be in error (670,680).