微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2541 flash 操作問題

CC2541 flash 操作問題

时间:10-02 整理:3721RD 点击:

我有在網上找到一些資訊,發現flash可以被osal_snv_read()與osal_snv_write()操作,我使用下列的程序可以正確讀寫page 0x80的一個byte

#define PG_ID                        0x80

static uint8 test=0;

osal_snv_read(PG_ID, sizeof(test), &test);

osal_snv_write(PG_ID, sizeof(test), &test);

請問這樣如何用smartRF programmer外部寫入同一個address呢??(這邊指的是對page 0x80操作)

函数的第一个变量不是page ID. 而是SNV ID.  所以你不是对page 0x80. 而是一个NV_ID为0x80的item进行操作的。

// Device NV Items - Range 0 - 0x1F
#define BLE_NVID_IRK 0x02 //!< The Device's IRK
#define BLE_NVID_CSRK 0x03 //!< The Device's CSRK
#define BLE_NVID_SIGNCOUNTER 0x04 //!< The Device's Sign Counter

// Bonding NV Items - Range 0x20 - 0x5F - This allows for 10 bondings
#define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs
#define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range

// GATT Configuration NV Items - Range 0x70 - 0x79 - This must match the number of Bonding entries
#define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs
#define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs

// Customer NV Items - Range 0x80 - 0x8F - This must match the number of Bonding entries
#define BLE_NVID_CUST_START 0x80 //!< Start of the Customer's NV IDs
#define BLE_NVID_CUST_END 0x8F //!< End of the Customer's NV IDs

目前的机制中,flash使用了125和126两页,你写的数据可能在这两页的任何位置。

謝謝TY回覆,再請教。

任何位置的意思是,我每次呼叫osal_snv_write(),被寫入的address都會改變嗎? 還是寫入絕對位置?

我查到資料表示page與address的關係,好像是 (page* 2048) / 4 = address,這個對嗎?

若假設今天我寫入的address為 (125*2048) /4 =64000 = 0xFA00 ,要如何使用SmartRF Flash Programmer這此address進行燒錄呢?

你应该参考和使用更底层的接口

HalFlashRead 或HalFlashWrite

他们可以对应你说的page和address.

用osal_snv接口则已经是封装过了。因为flash同一地址不能连续写,必须擦除再写。osal_nv用了一套时间换空间的做法。,你可仔细读下代码。

FlashProgrammer应该是做不了对指定地址操作的。当然,你熟悉hex格式,自己构造一个hex file,可能可以做到你要的功能。

謝謝TY回覆,依照您提到的【当然,你熟悉hex格式,自己构造一个hex file,可能可以做到你要的功能。】

這個意思是我先找一個絕對的flash物理address,然後用FlashProgrammer利用裏頭的read flash into hex-file功能讀出,後去對hex file做修改再燒錄這個修改過的hex file嗎? 會有此一問是因為我先前已有詢問過類似的問題,有高人回覆這個解答,如下

題外一問,所以osal_snv_write(),這個寫入的方式是找一個不固定的address寫入,若要讀取此address可以透過ID去對應找出嗎?那是否有可能每次寫入的address都不相同? 若如此萬一page 125, 126使用完畢的話,會造成問題嗎? 還是有可能寫入重複的address,只是讀寫都依靠ID去mapping罷了?

1. 不,我的意思是,你不一定需要读,你的hex文件就只要包含你需要修改的那几行就行。

2. 没有直接的接口,但你可以看看osal_snv_read的实现,offset和activepg就是。

uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf )
{
uint16 offset = findItem(activePg, pgOff, id);

if (offset != 0)
{
HalFlashRead(activePg, offset, pBuf, len);
return SUCCESS;
}
return NV_OPER_FAILED;
}

感謝TY回覆

1. 您的意思是把專案中的hex file直接打開,找到你用HalFlashWrite寫入的絕對位置並進行修改後,再燒入裝置嗎? 這樣是省去從flash中讀出的動作沒錯。

可我也不知道為何讀不出flash,如下圖

2. osal_snv_read與osal_snv_write看起來像是自己會記錄address,並offset,做為下一次read/write參考用,不知道我有沒有理解錯?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top