hello:
My project is based on "esb_rx",NCS2.5.1,nRF52832.I need a Unique address for my product ,so I add flash read/write function for my projict, base on "soc_flash_nrf"
when I get addr for esb rx,I put them in flash.but the Program crashes and restarts.
some code:
void rx_event_handler(struct esb_evt const *event) { switch (event->evt_id) { case ESB_EVENT_TX_SUCCESS: LOG_DBG("TX SUCCESS EVENT"); connect_stat = 1; break; case ESB_EVENT_TX_FAILED: connect_stat = 0; break; case ESB_EVENT_RX_RECEIVED: if (esb_read_rx_payload(&rx_payload) == 0) { LOG_DBG("Packet received, len %d : " "0x%02x, 0x%02x, 0x%02x, 0x%02x, " "0x%02x, 0x%02x, 0x%02x, 0x%02x", rx_payload.length, rx_payload.data[0], rx_payload.data[1], rx_payload.data[2], rx_payload.data[3], rx_payload.data[4], rx_payload.data[5], rx_payload.data[6], rx_payload.data[7]); if(esb_in_pair_mode) { LOG_INF("get pair data 0"); esb_in_pair_mode = 0; memcpy(&get_pair_addr,rx_payload.data,sizeof(hal_nvm_t)); // need_save_addr = 1; // esb_disable(); hal_nvm_write(&get_pair_addr); // hal_esb_init(); } else { memcpy(tx.data,rx_payload.data,sizeof(tx.data)); void audio_fifo_put(struct audio_data_t *tx); tx.len = sizeof(tx.data); audio_fifo_put(&tx); } } else { LOG_ERR("Error while reading rx packet"); } break; } int hal_nvm_write(hal_nvm_t* data) { LOG_INF("Test 1: Flash erase page at 0x%x", USER_PARTITION_OFFSET); const struct device *flash_dev = USER_PARTITION_DEVICE; int ret; ret = flash_erase(flash_dev, USER_PARTITION_OFFSET, FLASH_PAGE_SIZE); if (ret != 0) { LOG_INF(" Flash erase failed! %d",ret); } else { LOG_INF(" Flash erase succeeded!"); } if (flash_write(flash_dev, USER_PARTITION_OFFSET, data,sizeof(hal_nvm_t)) != 0) { LOG_INF(" Flash write failed!"); return 0; } LOG_INF(" Flash write sucess %x!",data->addr_0[0]); return 1; }
and my dts:
flash_controller: flash-controller@4001e000 { compatible = "nordic,nrf52-flash-controller"; reg = < 0x4001e000 0x1000 >; #address-cells = < 0x1 >; #size-cells = < 0x1 >; flash0: flash@0 { compatible = "soc-nv-flash"; erase-block-size = < 0x1000 >; write-block-size = < 0x4 >; reg = < 0x0 0x80000 >; partitions { compatible = "fixed-partitions"; #address-cells = < 0x1 >; #size-cells = < 0x1 >; boot_partition: partition@0 { label = "mcuboot"; reg = < 0x0 0xc000 >; }; slot0_partition: partition@c000 { label = "image-0"; reg = < 0xc000 0x37000 >; }; slot1_partition: partition@43000 { label = "image-1"; reg = < 0x43000 0x37000 >; }; storage_partition: partition@7a000 { label = "storage"; reg = < 0x7a000 0x3000 >; }; userstorage_partition: partition@7d000 { label = "user_storage"; reg = < 0x7d000 0x3000 >; }; }; }; };
my prj,conf:
CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_ESB=y CONFIG_SPEAKER=y CONFIG_SPEAKER_ALLOW_PWM0=y CONFIG_SPEAKER_ALLOW_PWM1=n CONFIG_SPEAKER_ALLOW_PWM2=n CONFIG_PWM=n CONFIG_NRFX_SAADC=y CONFIG_NRFX_RTC2=y CONFIG_NRFX_RTC0=y # CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_UART_CONSOLE=n CONFIG_ESB_TX_RX_ENABLE=n CONFIG_ESB_MAX_PAYLOAD_LENGTH=80 CONFIG_DK_LIBRARY=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=y CONFIG_NRFX_TIMER0=y CONFIG_BOARD_ENABLE_DCDC=n CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y
And i try save my addr in timer handle ,it failed again.,But when I save my addr in button handle ,it worked,like:
extern hal_nvm_t get_pair_addr; static void button_changed(uint32_t button_state, uint32_t has_changed) { if (has_changed & USER_BUTTON) { uint32_t user_button_state = button_state & USER_BUTTON; if(user_button_state) { button_time_cnt = 5000/100 + 1; hal_nvm_write(&get_pair_addr); // save_addr_later(); } else { button_time_cnt = 0; } LOG_ERR("user_button_state = %d\r\n",user_button_state); // app_button_state = user_button_state ? true : false; } }
What did I do wrong?