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

QQ26750452
Posts: 17
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: 186
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: 17
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: 786
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: 17
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: 786
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。

lss1330
Posts: 1
Joined: Sun Sep 12, 2021 8:55 am

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

Postby lss1330 » Sun Sep 12, 2021 9:02 am

想请教一下如何获得正在使用的FLASH句柄(esp_flash_t *chip)呢?
我查看了一下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;
    }

spadger
Posts: 13
Joined: Mon May 06, 2019 3:56 pm

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

Postby spadger » Tue Sep 14, 2021 12:25 am

最好的方法还是芯片自带UID,就不用去读SPI FLASH的UID了。
MCU中的UID很有用,产品序列号和加密都要用到。几乎所有的Cortex-M芯片都自带UID。
建议做成256位,其中32位线性增加用于序列号,其它的位完全随机,用于加密。

spadger
Posts: 13
Joined: Mon May 06, 2019 3:56 pm

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

Postby spadger » Tue Sep 14, 2021 12:37 am

再问一下ESP8266如何实现读取SPI FLASH的UID?ESP8266_RTOS_SDK最新的master分支中的spi_flash组件和ESP-IDF的差异很大,而且没有读取SPI FLASH的操作。
看了下代码,似乎用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 65 guests