So I've been working with an nRF52832 on a custom board, and it has an external flash, mx25r1635f to be exact, and that is mounted with littleFS to use for data storage. It mounts, reads, writes all fine until I start working with bigger data, then it starts giving me error -5, which is I/O error, but I know my connections should be good and it happens on multiple PCBs. I started messing around with the firmware until I realized that the problem happened at a file size of exaclty 63, but would eventually like maybe 30 or 40 trys manage to write a couple of bytes again. This problem happens even in the sample code for file handling if I put it to append the pattern data to the file. After looking through the code trying to find something that could be related I saw that the cache-size attribute was 64, on a whim I changed to 128, and.. boom the file size could get to 127. So I'm thinking it's related to the cache filling up, but I could not for the life of me find a way to solve that, and not a single soul on the internet had the same problem as far as I can tell. The best solution I could find was to split my data into small chunks of 127bytes, but that's gonna be some confusing code for other people to read and will end up a lot more complex than it should be.
.overlay:
&pinctrl { spi1_default: spi1_default { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 14)>, <NRF_PSEL(SPIM_MOSI, 0, 13)>, <NRF_PSEL(SPIM_MISO, 0, 16)>; }; }; spi1_sleep: spi1_sleep { group1 { psels = <NRF_PSEL(SPIM_SCK, 0, 14)>, <NRF_PSEL(SPIM_MOSI, 0, 13)>, <NRF_PSEL(SPIM_MISO, 0, 16)>; low-power-enable; }; }; } &spi1 { compatible = "nordic,nrf-spi"; status = "okay"; cs-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; }; /delete-node/ &storage_partition; / { fstab { compatible = "zephyr,fstab"; lfs1: lfs1 { compatible = "zephyr,fstab,littlefs"; mount-point = "/lfs1"; partition = <&lfs1_part>; automount; read-size = <16>; prog-size = <16>; cache-size = <128>; lookahead-size = <32>; block-cycles = <512>; }; }; }; &mx25r16 { partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; lfs1_part: partition@0 { label = "storage"; reg = <0x00000000 0x1000000>; }; }; };
.dts file for the custom board:
&spi1 { compatible = "nordic,nrf-spi"; status = "okay"; pinctrl-0 = <&spi1_default>; pinctrl-1 = <&spi1_sleep>; pinctrl-names = "default", "sleep"; mx25r16: mx25r1635f@0 { compatible = "jedec,spi-nor"; reg = <0>; spi-max-frequency = <8000000>; jedec-id = [c2 28 15]; size = <DT_SIZE_M(16)>; }; }; &flash0 { partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; boot_partition: partition@0 { label = "mcuboot"; reg = <0x00000000 0xc000>; }; slot0_partition: partition@c000 { label = "image-0"; reg = <0x0000C000 0x32000>; }; slot1_partition: partition@3e000 { label = "image-1"; reg = <0x0003E000 0x32000>; }; scratch_partition: partition@70000 { label = "image-scratch"; reg = <0x00070000 0xa000>; }; storage_partition: partition@7a000 { label = "storage"; reg = <0x0007a000 0x00006000>; }; }; };
the file is first created and written a small part on startup with the following code:
bool sirros_writeFile(const char * file_name, char* file_content, size_t file_size, off_t file_pos) { char caminho_arquivo[MAX_FILE_PATH_LEN]; struct fs_file_t file; int ret; size_t written_size = 0; snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name); fs_file_t_init(&file); ret = fs_open(&file, caminho_arquivo, FS_O_CREATE | FS_O_WRITE); if(ret < 0) return false; if (file_pos != 0) fs_seek(&file, file_pos, FS_SEEK_SET); if(file_size == 0) file_size = strlen(file_content); written_size = fs_write(&file, file_content, file_size); ret = fs_close(&file); return written_size == file_size; }
.c code for writing the file
bool sirros_appendFile(const char * file_name, char* file_content, size_t file_size) { char caminho_arquivo[MAX_FILE_PATH_LEN]; struct fs_file_t file; int ret; size_t written_size = 0; snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name); fs_file_t_init(&file); ret = fs_open(&file, caminho_arquivo, FS_O_CREATE | FS_O_APPEND); if(ret < 0) return false; if(file_size == 0) file_size = strlen(file_content); ret = fs_sync(&file); if(ret < 0) return false; written_size = fs_write(&file, file_content, file_size); ret = fs_close(&file); return written_size == file_size; }
If anyone knows how to solve the problem, I'd be very grateful.