This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3135:"未检测到 Cmd Ack;关闭套接字时出错

Guru**** 2393725 points
Other Parts Discussed in Thread: CC3135

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/979368/cc3135-no-cmd-ack-detected-error-when-closing-socket

器件型号:CC3135
我使用以下代码评估 STM32L4控制器上的 CC3135。 


自动结果= sl_Start (nulptr、nulptr、nullptr);
INT CTR = 0;
while (true){
printf ("%d\r\n"、CTR++);

const auto sockid = sl_Socket (sl_AF_iNet、sl_sock_stream、0);

constexpr SlTimever_t timeVal{20、0};

Auto sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_RCVTIMEO、&timeVal、sizeof (timeVal));
if (sockOptSetResult!= 0){
printf ("设置超时失败\r\n);
sl_close (sockid);
sl_Stop (0xFFFF);
sl_Start (nulptr、nulptr、nullptr);
ThisThread:SLEEP_for (1000);
继续;
}
constexpr SlSockNonblocking_t enableOption{1};

sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_NONBLOCKING、(_u8 *)&enableOption、sizeof (enableOption));
if (sockOptSetResult!= 0){
printf ("未能设置非阻塞\r\n);
ThisThread:SLEEP_for (1000);
NVIC_SystemReset();
}

SlSockAddrIn_t addr;
Addr.Sin_Family = SL_AF_iNet;
Addr.Sin_port = sl_Htons (8888);

addr.sin addr.s_addr = sl_Htonl (sl_IPv4_VAL (192、168、42、130));

结果= SLNETERR_BSD_EALREADY;

constexpr auto POLL_interval = 10;
constexpr auto MAX_POLL = 1000;

对于(int i = 0;i < MAX_POLL && RESULT = SLNETERR_BSD_EALREADY;i++){
结果= sl_Connect (sockid、reinterpret_cast (addr)、sizeof (SlSockAddrIn_t));
thisThread::yield ();
如果(结果< 0){
该主题::SLEEP_for (POLL_INTERVAL);
}
}

如果(结果< 0){
printf ("连接%d\n"失败、结果);
sl_close (sockid);
继续;
}

constexpr auto buffer_size = 1460;
静态 char buffer[buffer_size];
std:::transform (std:开始(buffer)、std:结束(buffer)、std:开始(buffer)、
[](char)-> char{return static_cast (标准:rand();});

对于(int i = 0;i < 1000;i++){
结果= SLNETERR_BSD_EAGAIN;
对于(int k = 0;k < MAX_POLL && RESULT = SLNETERR_BSD_EAGAIN;k++){

结果= sl_Send (sockid、buffer、sizeof (buffer)、0);
thisThread::yield ();
if (result!= sizeof (buffer)){
该主题::SLEEP_for (POLL_INTERVAL);
}
}

如果(结果< 0){
printf ("发送%d\n"失败、结果);
NVIC_SystemReset();
}
}

结果= sl_close (sockid);
if (结果!= 0){
printf ("关闭失败%d\r\n"、结果);
}
printf ("done \r\n");
} 

它通常运行几次迭代、然后抛出"致命错误:未检测到 Cmd Ack [cmd 操作码= 0x9401]"并停止工作。 sl_SetSockOpt ()将在下一个迭代中失败、该迭代将通过调用 sl_Stop 和 sl_Start 来重新启动模块。 根据文档、这应该可以解决该问题、但不能解决。 在下一个迭代中、它将连接到 AP 并通过 DHCP 获取 IP、但再次失败、并出现相同的错误。 在大多数情况下、sl_close 确实返回0、但在极少数情况下、它返回-2005。 当我尝试关闭套接字时、我只会遇到此错误、如果我 要持续发送数据、它就可以正常工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您使用的是哪种主机驱动程序版本(或 SDK 插件)? 您是否已将最新的服务攻击刷写到 CC3135?

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    芯片:0x31100000
    MAC: 3.1.0.5
    PHY: 3.1.0.26
    NWP: 4.7.0.3
    ROM: 8738
    主机:3.0.1.65

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不需要连接或传输任何数据、只需像下面的函数那样创建和关闭套接字就足够了。

    int createAndClose ()
    {
    const auto sockid = sl_Socket (sl_AF_iNet、sl_sock_stream、0);
    如果(sockid < 0){
    printf ("sock create fail:%d\r\n",sockid);
    }
    常量自动结果= sl_close (sockid);
    如果(结果< 0){
    printf ("sock Close fail:%d\r\n",结果);
    }
    
    返回0;
    } 

    在上述情况下、它恰好在16个调用后抛出错误。 仅套接字 API 会受到影响、我可以调用以下函数、该函数从闪存读取文件数千次、而不会出现任何问题。

    int ReadFile()
    {
    
    long unsigned token{};
    自动 Fh = sl_FsOpen (reinterpret_cast ("cacert.pem)、sl_FS_read、&token);
    如果(Fh < 0){
    printf ("打开失败:%ld、\r\n、FH);
    返回-1;
    }
    静态无符号字符缓冲区[1024];
    INT RESULT = 0;
    
    结果= sl_FsRead (Fh、0、缓冲器、1024);
    如果(结果< 0){
    printf ("读取失败:%d"、结果);
    }
    constexpr 字符测试[]="-" 开始证书-- ";
    if (strncmp (reinterpret_cast) (buffer)、test、sizeof (test)- 1)!= 0){
    printf ("读取失败\r\n");
    }
    结果= sl_FsClose (Fh、nulltr、nulltr、0);
    如果(结果< 0){
    printf ("无法关闭:%d"、结果);
    }
    
    返回0;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我在事务结束时未调用 close、我将获得"未检测到 Cmd Ack [cmd 操作码= 0x9401]"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >我可以调用下面的函数,从闪存读取文件的次数不会有任何问题。

    请划去。 这也会在某个时候引发错误。

    >在上述情况下,它恰好在16次调用后抛出错误

    这似乎与呼叫数量无关、而是在一段时间后发生。 如果我在 没有任何睡眠的情况下重复调用 createAndClose ()函数,我可以在它失败之前进行数千次调用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    调用 createAndClose()函数时,sl_close()返回什么错误值?

    在移植层中、您是否使用了 RTOS? 您是否实施了时间戳机制?

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >调用 createAndClose()函数时,sl_close()返回什么错误值?

    正如我所说的那样,大部分是零,但在少数罕见的情况下为-2005年

    >在移植层中,是否使用 RTOS? 您是否实施了时间戳机制?

    是的、我从单调计时器返回值(以 ms 为单位)。

    至少还有另外两个人面临同样的问题、在 CC3235上也是如此。

    https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/881434?BOOSTXL-CC3135-No-Cmd-Ack-detected-when-using-WLAN-NORMAL-POLICY

    https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/865143

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已将其移植到 Linux (PI3)。 在高 SPI 时钟(20MHz)时、它会失败并出现同步损耗。 我认为这是因为我的时间戳函数不正确。 我将使用以下时间戳、SL_TIMESTAMP_TICKS_IN_10_milliseconds 硬编码为10

    unsigned long TimerGetCurrentTimestamp()
    {
    struct timespec ts ={0};
    int 结果= clock_gettime (clock_monotonic、&ts);
    exitOnError (结果、"定时器失败");
    
    返回 ts.tv_sec * 1000 +(ts.tv_nsec /(1000 * 1000));
    } 

    在低时钟时、它发送几个 KiB 的数据、然后停止。 将逻辑分析仪连接到 SPI 引脚、可以看到3135一直在发送模式7D、B9、9B、57

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我首先运行了 clang 静态分析器和 cpcheck、两者都发现了一些错误。 然后、我在 Valgrind 下运行了该驱动程序、memcheck 和 helgrind 都报告了大量错误(可能有一些错误肯定、因此熟悉该驱动程序的人需要仔细查看) 但是、我们无法将产品部署到字段中存在"条件跳转或移动取决于未初始化的值"错误的字段。 TI 是否在代码上运行静态分析仪? 我要附加所有必要的文件。 如果您需要设置这些工具中的任何一个的帮助、您可能会向我发送消息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../3583.cc_5F00_pal.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    该错误通常表示主机驱动程序中存在计时错误。 在版本 3.0.1.65中,slcb_GetTimestamp()应返回节拍值, sl_TIMESTAMP_TICKS_IN_10_millisms 必须定义为10毫秒内的节拍数。 这必须由开发人员在 user.h 中完成 您能验证一下吗?

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    发布我的最后一个回复后、看起来您编辑过的回复和之前的新回复被捕获在审核队列中、刚刚出现。 请验证移植层 API 中的时序是否正确、然后再继续。

    此致、

    Sarah