nrf51822 写flash 失败

资源和软件环境:

1. softdevice  7.1.0

2. SDK 6.0.0


一、 写flash

在启动SOFTDEVICE 后,使用uint32_t  sd_flash_write(uint32_t * const p_dst, uint32_t const * const p_src, uint32_t size) 进行flash的写操作,当然在该区域如果已经有数据存在,需要把该页的其他数据拷贝出来,然后使用uint32_t sd_flash_page_erase(uint32_t page_number)擦除该页,再进行写操作。

该例子,该页只有这个数据,所以写前没有拷贝其他数据出来。

void start_dfu_event_process(void)
{
uint32_t retval;
uint8_t flag[8] = “sdfustr”;
uint32_t sdfu_flag_addr_page = SDFU_FLAG_ADDR_PAGE;
uint32_t sdfu_flag_addr = SDFU_FLAG_ADDR_PAGE*FLASH_PAGE_SIZE;
uint8_t * p_data_addr   = (uint8_t *)flag;

retval = sd_flash_page_erase(sdfu_flag_addr_page);
if(retval == NRF_SUCCESS)
{
retval = sd_flash_write(((uint32_t *)sdfu_flag_addr),
(uint32_t *)p_data_addr,
CEIL_DIV(7,sizeof(uint32_t)));
}
}


二、读flash

读flash使用直接地址访问的方式读取。

uint32_t ble_ccs_data_load(curtain_control_t *ccs_data)
{
uint32_t ccs_data_addr;
uint8_t * p_data_addr  = (uint8_t*)ccs_data;

ccs_data_addr = FLASH_LAST_PAGE*FLASH_PAGE_SIZE;

memcpy((uint32_t *)p_data_addr,(uint32_t *)ccs_data_addr,
sizeof(curtain_control_t));

return NRF_SUCCESS;
}


还可以这样读取

uint8_t flag[4];
uint32_t sdfu_flag_addr = SDFU_FLAG_ADDR_PAGE*FLASH_PAGE_SIZE;

// Get the flag of sdfu from the flash
flag[0] = *(uint8_t *)(sdfu_flag_addr+0);

flag[1] = *(uint8_t *)(sdfu_flag_addr+1);

flag[2] = *(uint8_t *)(sdfu_flag_addr+2);

flag[3] = *(uint8_t *)(sdfu_flag_addr+3);


但是在刚连接的时候,如果写Flash,会出现失败。

通过测试发现,在系统收到BLE_GAP_EVT_CONNECTED(0x10)和BLE_GAP_EVT_CONN_PARAM_UPDATE(0x12)事件之间写Flash,就会出现失败(sd_flash_write 返回NRF_ERROR_INVALID_DATA(0x11)),具体原因不是很清楚,应该是在这个时间段里,Flash被写保护了。


缩短BLE_GAP_EVT_CONNECTED(0x10)和BLE_GAP_EVT_CONN_PARAM_UPDATE(0x12)事件之间时间,可以通过修改FIRST_CONN_PARAMS_UPDATE_DELAY 目前我修改到0.2 秒

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值