SPI 添加设备返回 ESP_ERR_NO_MEM

fantasy
Posts: 7
Joined: Fri Apr 23, 2021 11:41 am

SPI 添加设备返回 ESP_ERR_NO_MEM

Postby fantasy » Fri Apr 23, 2021 11:48 am

  1. int luat_spi_setup(luat_spi_t *spi)
  2. {
  3.     // SPI2_HOST = 1
  4.     // SPI3_HOST = 2
  5.     if (spi->id == 1)
  6.     {
  7.         spi_bus_config_t spi_config = {
  8.             .miso_io_num = 12,
  9.             .mosi_io_num = 13,
  10.             .sclk_io_num = 14,
  11.             .quadwp_io_num = -1,
  12.             .quadhd_io_num = -1,
  13.             .max_transfer_sz = 0,
  14.             // .flags = SPICOMMON_BUSFLAG_MASTER
  15.         };
  16.         ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &spi_config, 0));
  17.     }
  18.     else if (spi->id == 2)
  19.     {
  20.         spi_bus_config_t spi_config = {
  21.             .miso_io_num = 19,
  22.             .mosi_io_num = 23,
  23.             .sclk_io_num = 18,
  24.             .quadwp_io_num = -1,
  25.             .quadhd_io_num = -1,
  26.             .max_transfer_sz = 0,
  27.             // .flags = SPICOMMON_BUSFLAG_MASTER
  28.         };
  29.         ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &spi_config, 0));
  30.     }
  31.     else
  32.     {
  33.         return -1;
  34.     }
  35.     spi_device_interface_config_t devcfg;
  36.  
  37.     if (spi->CPHA == 0)
  38.     {
  39.         if (spi->CPOL == 0)
  40.         {
  41.             devcfg.mode = 0;
  42.         }
  43.         else if (spi->CPOL == 1)
  44.         {
  45.             devcfg.mode = 1;
  46.         }
  47.     }
  48.     if (spi->CPHA)
  49.     {
  50.         if (spi->CPOL == 0)
  51.         {
  52.             devcfg.mode = 2;
  53.         }
  54.         else if (spi->CPOL == 1)
  55.         {
  56.             devcfg.mode = 3;
  57.         }
  58.     }
  59.  
  60.     if (spi->bit_dict == 2)
  61.     {
  62.         devcfg.flags = SPI_DEVICE_BIT_LSBFIRST;
  63.     }
  64.     devcfg.cs_ena_pretrans = 1;
  65.     devcfg.clock_speed_hz = spi->bandrate;
  66.     devcfg.spics_io_num = spi->id==1?15:5;
  67.     //获取芯片内部堆大小
  68.     printf("     esp_get_free_heap_size : %d  \n", esp_get_free_heap_size());
  69.     //获取芯片内部堆大小
  70.     printf("     esp_get_free_heap_size : %d  \n", esp_get_free_heap_size());
  71.     //获取最小可用堆
  72.     printf("     esp_get_free_internal_heap_size : %d  \n", esp_get_free_internal_heap_size());
  73.     ESP_ERROR_CHECK(spi_bus_add_device(spi->id, &devcfg, &spi_h));
  74.     return 0;
  75. }
%[7[MFRO7ZKRH62XY[}6RQU.png
监视器报错输出
%[7[MFRO7ZKRH62XY[}6RQU.png (30.49 KiB) Viewed 5985 times
堆内存还有很多,尝试将栈从8k加到64k依然不能解决该问题
IDF4.2 ESP32 NodeMcu开发板

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

Re: SPI 添加设备返回 ESP_ERR_NO_MEM

Postby ESP_Gargamel » Fri Apr 23, 2021 12:19 pm

这个你追下 spi_bus_add_device 代码,基本能发现问题。在 spi_bus_add_device 里找可能会返回 ESP_ERR_NO_MEM 的地方,其中 dev_config->queue_size 过大会导致这一错误。而 spi_device_interface_config_t devcfg; 是位于栈上,未初始话的话,里面的值是不确定的,这就导致 dev_config->queue_size 可能是一个巨大的值,导致内存分配失败。你可以在进入到 spi_bus_add_device 之前打印出来看下,是否是这样。最后,你定义这个变量的时候,需要对其进行初始化,可以是这样 spi_device_interface_config_t devcfg = {};。希望是这个问题导致。

fantasy
Posts: 7
Joined: Fri Apr 23, 2021 11:41 am

Re: SPI 添加设备返回 ESP_ERR_NO_MEM

Postby fantasy » Fri Apr 23, 2021 12:46 pm

ESP_Gargamel wrote:
Fri Apr 23, 2021 12:19 pm
这个你追下 spi_bus_add_device 代码,基本能发现问题。在 spi_bus_add_device 里找可能会返回 ESP_ERR_NO_MEM 的地方,其中 dev_config->queue_size 过大会导致这一错误。而 spi_device_interface_config_t devcfg; 是位于栈上,未初始话的话,里面的值是不确定的,这就导致 dev_config->queue_size 可能是一个巨大的值,导致内存分配失败。你可以在进入到 spi_bus_add_device 之前打印出来看下,是否是这样。最后,你定义这个变量的时候,需要对其进行初始化,可以是这样 spi_device_interface_config_t devcfg = {};。希望是这个问题导致。
感谢大佬,问题解决了,不会在爆内存了

fantasy
Posts: 7
Joined: Fri Apr 23, 2021 11:41 am

Re: SPI 添加设备返回 ESP_ERR_NO_MEM

Postby fantasy » Fri Apr 23, 2021 2:14 pm

SPI初始化成功了,但是在收发数据的时候遇到了未知异常,之前是spi_master.c下esp_err_t check_trans_valid中的//check working mode下,返回的错误参数,“incompatible iface params”,请问下这个该怎么解决,是需要配置特定模式才能使用吗
  1. //初始化配置SPI各项参数,并打开SPI,向SPI总线添加设备
  2. int luat_spi_setup(luat_spi_t *spi)
  3. {
  4.     // SPI2_HOST = 1
  5.     // SPI3_HOST = 2
  6.     if (spi->id == 1)
  7.     {
  8.         spi_bus_config_t spi_config = {
  9.             .miso_io_num = 12,
  10.             .mosi_io_num = 13,
  11.             .sclk_io_num = 14,
  12.             .quadwp_io_num = -1,
  13.             .quadhd_io_num = -1,
  14.             .max_transfer_sz = 0,
  15.             .flags = SPICOMMON_BUSFLAG_MASTER
  16.         };
  17.         ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &spi_config, 0));
  18.     }
  19.     else if (spi->id == 2)
  20.     {
  21.         spi_bus_config_t spi_config = {
  22.             .miso_io_num = 19,
  23.             .mosi_io_num = 23,
  24.             .sclk_io_num = 18,
  25.             .quadwp_io_num = -1,
  26.             .quadhd_io_num = -1,
  27.             .max_transfer_sz = 0,
  28.             .flags = SPICOMMON_BUSFLAG_MASTER
  29.         };
  30.         ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &spi_config, 0));
  31.     }
  32.     else
  33.     {
  34.         return -1;
  35.     }
  36.     spi_device_interface_config_t devcfg;
  37.  
  38.     if (spi->CPHA == 0)
  39.     {
  40.         if (spi->CPOL == 0)
  41.         {
  42.             devcfg.mode = 0;
  43.         }
  44.         else if (spi->CPOL == 1)
  45.         {
  46.             devcfg.mode = 1;
  47.         }
  48.     }
  49.     if (spi->CPHA == 1)
  50.     {
  51.         if (spi->CPOL == 0)
  52.         {
  53.             devcfg.mode = 2;
  54.         }
  55.         else if (spi->CPOL == 1)
  56.         {
  57.             devcfg.mode = 3;
  58.         }
  59.     }
  60.  
  61.     if (spi->bit_dict == 2)
  62.     {
  63.         devcfg.flags = SPI_DEVICE_BIT_LSBFIRST;
  64.     }
  65.     devcfg.cs_ena_pretrans = 1;
  66.     devcfg.clock_speed_hz = spi->bandrate;
  67.     devcfg.spics_io_num = spi->id==1?15:5;
  68.     devcfg.queue_size=7;
  69.     ESP_ERROR_CHECK(spi_bus_add_device(spi->id, &devcfg, &spi_h));
  70.     return 0;
  71. }
  72.  
  73. //关闭SPI,成功返回0
  74. int luat_spi_close(int spi_id)
  75. {
  76.     if (spi_id == 1 || spi_id == 2)
  77.     {
  78.         ESP_ERROR_CHECK(spi_bus_remove_device(spi_h));
  79.         ESP_ERROR_CHECK(spi_bus_free(spi_id));
  80.         return 0;
  81.     }
  82.     return -1;
  83. }
  1. //收发SPI数据,返回接收字节数
  2. int luat_spi_transfer(int spi_id, const char *send_buf, char *recv_buf, size_t length)
  3. {
  4.     if (spi_id == 1 || spi_id == 2)
  5.     {
  6.         spi_transaction_t send_spi = {
  7.             .length = length*2,
  8.             .tx_buffer = send_buf,
  9.             .rx_buffer = recv_buf,
  10.             .rxlength = length,
  11.         };
  12.         ESP_ERROR_CHECK(spi_device_transmit(spi_h, &send_spi));
  13.         return 0;
  14.     }
  15.     return -1;
  16. }
D5IB~2[13`0)Q}G)@7}@UX7.png
日志输出
D5IB~2[13`0)Q}G)@7}@UX7.png (49.3 KiB) Viewed 5960 times

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

Re: SPI 添加设备返回 ESP_ERR_NO_MEM

Postby ESP_Gargamel » Sat Apr 24, 2021 1:57 pm

再说一遍 spi_device_interface_config_t devcfg = {};,否则这个结构体下变量值位置,出什么问题都未知。

fantasy
Posts: 7
Joined: Fri Apr 23, 2021 11:41 am

Re: SPI 添加设备返回 ESP_ERR_NO_MEM

Postby fantasy » Tue Apr 27, 2021 4:36 am

谢谢,这样写之后问题解决了

Who is online

Users browsing this forum: No registered users and 57 guests