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?