[已解决] 请教我该如何读取XIP的spi-flash的唯一ID?

QQ26750452
Posts: 13
Joined: Thu May 13, 2021 1:48 pm

[已解决] 请教我该如何读取XIP的spi-flash的唯一ID?

Postby QQ26750452 » Wed Jun 16, 2021 1:14 am

以前在其它单片机系统,读取spi-flash的唯一ID是很轻松的事。但现在发现在idf+esp32上十分困难,idf没有提供这个功能函数;自己也很难不改动idf而实现。由于esp32在spi-flash里执行代码,所以操纵flash再也不是一件随心所欲的事了。
请教,我该怎么办?

ESP_Eavo
Posts: 32
Joined: Tue Jun 08, 2021 6:23 am

Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?

Postby ESP_Eavo » Wed Jun 16, 2021 8:14 am

您好。
暂时没有可直接读取的接口,可参考 https://github.com/espressif/esp-idf/tr ... /spi_flash 改动代码实现。

QQ26750452
Posts: 13
Joined: Thu May 13, 2021 1:48 pm

Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?

Postby QQ26750452 » Wed Jun 16, 2021 11:23 am

ESP_Eavo wrote:
Wed Jun 16, 2021 8:14 am
您好。
暂时没有可直接读取的接口,可参考 https://github.com/espressif/esp-idf/tr ... /spi_flash 改动代码实现。
谢谢!既然是要修改idf源码,那我就贴上我的修改吧。供大家使用【for idf-4.2.1】
在<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);
然后,uid_temp[1]和uid_temp[2]里就是总共8字节的Unique ID数据。

不过,最优方案还是等乐鑫官方idf自带此功能。

ESP_Gargamel
Posts: 528
Joined: Wed Nov 14, 2018 8:45 am

Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?

Postby ESP_Gargamel » 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);

QQ26750452
Posts: 13
Joined: Thu May 13, 2021 1:48 pm

Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?

Postby QQ26750452 » Thu Jun 17, 2021 3:08 am

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);
我用的是稳定版本idf-4.2.1,它没有这个函数的。

ESP_Gargamel
Posts: 528
Joined: Wed Nov 14, 2018 8:45 am

Re: 【提问】请教我该如何读取XIP的spi-flash的唯一ID?

Postby ESP_Gargamel » Thu Jun 17, 2021 3:24 am

好,官方 IDF 将在 v4.4 增加该接口,当前该接口已包含在 master 分支,如需要,可参考进行 backport。

Who is online

Users browsing this forum: zengxy and 14 guests