[已解决] 请教我该如何读取XIP的spi-flash的唯一ID?
-
- Posts: 18
- Joined: Thu May 13, 2021 1:48 pm
[已解决] 请教我该如何读取XIP的spi-flash的唯一ID?
以前在其它单片机系统,读取spi-flash的唯一ID是很轻松的事。但现在发现在idf+esp32上十分困难,idf没有提供这个功能函数;自己也很难不改动idf而实现。由于esp32在spi-flash里执行代码,所以操纵flash再也不是一件随心所欲的事了。
请教,我该怎么办?
请教,我该怎么办?
Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?
您好。
暂时没有可直接读取的接口,可参考 https://github.com/espressif/esp-idf/tr ... /spi_flash 改动代码实现。
暂时没有可直接读取的接口,可参考 https://github.com/espressif/esp-idf/tr ... /spi_flash 改动代码实现。
-
- Posts: 18
- Joined: Thu May 13, 2021 1:48 pm
Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?
谢谢!既然是要修改idf源码,那我就贴上我的修改吧。供大家使用【for idf-4.2.1】ESP_Eavo wrote: ↑Wed Jun 16, 2021 8:14 am您好。
暂时没有可直接读取的接口,可参考 https://github.com/espressif/esp-idf/tr ... /spi_flash 改动代码实现。
在<esp-idf\components\spi_flash\esp_flash_api.c>文件中加入这个函数,增加读取UniqueID功能!
Code: Select all
esp_err_t IRAM_ATTR esp_flash_read_uid(esp_flash_t* chip, uint32_t* out_id)
{
if (chip == NULL) {
chip = esp_flash_default_chip;
}
if (chip == NULL || !esp_flash_chip_driver_initialized(chip)) {
return ESP_ERR_FLASH_NOT_INITIALISED;
}
if (out_id == NULL) {
return ESP_ERR_INVALID_ARG;
}
esp_err_t err = spiflash_start(chip);
if (err != ESP_OK) {
return err;
}
spi_flash_trans_t t = {
.command = 0x4B,
.miso_len = 12,
.miso_data = (uint8_t*)out_id,
};
chip->host->common_command(chip->host, &t);
return spiflash_end(chip, err);
}
Code: Select all
uint32_t uid_temp[3] = {0};
esp_flash_read_uid(partition->flash_chip, uid_temp);
不过,最优方案还是等乐鑫官方idf自带此功能。
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?
你试一下这个接口:
Code: Select all
esp_err_t esp_flash_read_unique_chip_id(esp_flash_t *chip, uint64_t* out_uid);
-
- Posts: 18
- Joined: Thu May 13, 2021 1:48 pm
Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?
我用的是稳定版本idf-4.2.1,它没有这个函数的。ESP_Gargamel wrote: ↑Wed Jun 16, 2021 1:19 pm你试一下这个接口:Code: Select all
esp_err_t esp_flash_read_unique_chip_id(esp_flash_t *chip, uint64_t* out_uid);
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?
好,官方 IDF 将在 v4.4 增加该接口,当前该接口已包含在 master 分支,如需要,可参考进行 backport。
Re: [已解决] 请教我该如何读取XIP的spi-flash的唯一ID?
想请教一下如何获得正在使用的FLASH句柄(esp_flash_t *chip)呢?
我查看了一下idf的源码,自己参照写了如下代码,但是导致esp32异常了。
我查看了一下idf的源码,自己参照写了如下代码,但是导致esp32异常了。
Code: Select all
esp_flash_t *init_chip;
esp_flash_spi_device_config_t dev_cfg = {
.host_id = -1,
};
esp_err_t err = spi_bus_add_flash_device(&init_chip, &dev_cfg);
if (err != ESP_OK)
{
ESP_LOGE("aaa", "Failed to Add Flash: %s (0x%x)", esp_err_to_name(err), err);
return NULL;
}
Re: [已解决] 请教我该如何读取XIP的spi-flash的唯一ID?
最好的方法还是芯片自带UID,就不用去读SPI FLASH的UID了。
MCU中的UID很有用,产品序列号和加密都要用到。几乎所有的Cortex-M芯片都自带UID。
建议做成256位,其中32位线性增加用于序列号,其它的位完全随机,用于加密。
MCU中的UID很有用,产品序列号和加密都要用到。几乎所有的Cortex-M芯片都自带UID。
建议做成256位,其中32位线性增加用于序列号,其它的位完全随机,用于加密。
Re: [已解决] 请教我该如何读取XIP的spi-flash的唯一ID?
再问一下ESP8266如何实现读取SPI FLASH的UID?ESP8266_RTOS_SDK最新的master分支中的spi_flash组件和ESP-IDF的差异很大,而且没有读取SPI FLASH的操作。
看了下代码,似乎用spi_user_cmd函数可以实现,参考代码如下,初步测试工作正常,这个spi_user_cmd函数和spi_cmd_t结构体并没有在头文件中导出,建议导出作为一个公共的接口。
看了下代码,似乎用spi_user_cmd函数可以实现,参考代码如下,初步测试工作正常,这个spi_user_cmd函数和spi_cmd_t结构体并没有在头文件中导出,建议导出作为一个公共的接口。
Code: Select all
extern bool spi_user_cmd(spi_cmd_dir_t mode, spi_cmd_t *p_cmd);
esp_err_t esp_flash_read_uid(uint32_t *out_uid)
{
spi_cmd_t cmd =
{
.cmd = 0x4B,
.cmd_len = 1,
.addr = NULL,
.addr_len = 0,
.data = out_uid,
.data_len = 8,
.dummy_bits = 32
};
return spi_user_cmd(SPI_RX | SPI_RAW, &cmd) ? ESP_OK : ESP_FAIL;
}
Who is online
Users browsing this forum: No registered users and 32 guests