TI 诚邀您参与论坛问卷调查,帮助我们改善技术支持体验。几分钟便可完成,将随机抽取30名用户送出快充数据线,点击参与

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读取Mac地址失败

Other Parts Discussed in Thread: CC3135MOD, CC3135

Hi TI 团队,

我在使用CC3135MOD + STM32F107芯片,已经移植完simplelink_sdk_wifi_plugin_2_40_00_22。然后我的代码框架是裸机逻辑 (nonos)。现在我的设备能正常执行sl_Start(0,0,0)函数,并且返回的值是0 (0=ROLE_STA, 1=ROLE_AP, 2=ROLE_P2P, etc.) 

  _i16 Status=0x1222;
  Status = sl_Start(0, 0, 0);
  _u8 MAC_Address[6];
  MAC_Address[0] = 0x8;
  MAC_Address[1] = 0x0;
  MAC_Address[2] = 0x28;
  MAC_Address[3] = 0x22;
  MAC_Address[4] = 0x69;
  MAC_Address[5] = 0x31;
  Status = sl_NetCfgGet(SL_NETCFG_MAC_ADDRESS_GET,NULL,SL_MAC_ADDR_LEN,(_u8 *)MAC_Address);

然后当我使用以上代码,尝试读取Mac address时,出现异常,仿真调试代码时,会进入这个函数

SimpleLinkFatalErrorEventHandler  提示的事件ID是 4 = SL_DEVICE_EVENT_FATAL_NO_CMD_ACK

看起来CC3135模块没有响应,因为我监控串口时候,看到MCU有发出了20个字节(FF EE DD BB 21 43 34 12 33 84 08 00 00 00 02 00 00 00 00 08)的数据给CC3135,但是CC3135没有反应,接着就进入了SimpleLinkFatalErrorEventHandler  这个函数。

请问一下,这个是什么原因导致的呢?

  • 你具体移植的是哪部分程序,TCP套字还是其他的,串口有打印什么信息吗,复位后正常吗



    \brief SimpleLinkFatalErrorEventHandler This handler gets called whenever a socket event is reported by the NWP / Host driver. After this routine is called, the user's application must restart the device in order to recover. \param slFatalErrorEvent - pointer to fatal error event. \return void \note For more information, please refer to: user.h in the porting folder of the host driver and the CC31xx/CC32xx NWP programmer's guide (SWRU455). */ void SimpleLinkFatalErrorEventHandler(SlDeviceFatal_t *slFatalErrorEvent) { switch (slFatalErrorEvent->Id) { case SL_DEVICE_EVENT_FATAL_DEVICE_ABORT: { UART_PRINT("\n\r[ERROR] - FATAL ERROR: Abort NWP event detected: " "AbortType=%d, AbortData=0x%x\n\r", slFatalErrorEvent->Data.DeviceAssert.Code, slFatalErrorEvent->Data.DeviceAssert.Value); } break; case SL_DEVICE_EVENT_FATAL_DRIVER_ABORT: { UART_PRINT("\n\r[ERROR] - FATAL ERROR: Driver Abort detected. \n\r"); } break; case SL_DEVICE_EVENT_FATAL_NO_CMD_ACK: { UART_PRINT("\n\r[ERROR] - FATAL ERROR: No Cmd Ack detected " "[cmd opcode = 0x%x] \n\r", slFatalErrorEvent->Data.NoCmdAck.Code); } break; case SL_DEVICE_EVENT_FATAL_SYNC_LOSS: { UART_PRINT("\n\r[ERROR] - FATAL ERROR: Sync loss detected n\r"); } break; case SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT: { UART_PRINT("\n\r[ERROR] - FATAL ERROR: Async event timeout detected " "[event opcode =0x%x] \n\r", slFatalErrorEvent->Data.CmdTimeout.Code); } break; default: UART_PRINT("\n\r[ERROR] - FATAL ERROR:" " Unspecified error detected \n\r"); break; } }

  • Hi Kevin,

    感谢您的快速回复!

    1. 我移植的部分是C:\ti\simplelink_sdk_wifi_plugin_2_40_00_22\source\ti\drivers\net\wifi   这个目录下的源码。基本上是按照swru455j.pdf 也就是programmer guide这个文档关于移植到其他平台的指导来进行。应该不是TCP套字部分。关于您回复的一个问题,我这里有个好奇:C:\ti\simplelink_sdk_wifi_plugin_2_40_00_22\source\ti\net 这个目录下的内容是关于哪些的呢?暂时还没看到有文档解答我这个问题。

    2. 关于串口打印的内容,您引用的那个函数,我有实现了,但是没有额外的串口来负责打印信息,不过我在debug仿真程序的时候,能看到slFatalErrorEvent->Id的值是:SL_DEVICE_EVENT_FATAL_NO_CMD_ACK。

    3.关于您说的复位尝试,请问是需要调用哪个api函数,可以告诉我吗?

  • 出现SimpleLinkFatalErrorEventHandler就是socket部分的问题,如果你不使用socket部分,在你的工程删除sl_socket.c和sl_socket.h文件
    SDK插件的说明看下这里:dev.ti.com/.../node
    复位的目的就是重新上电看是否会回复正常
  • Hi Kevin,
    感谢您的回复!链接资料狠详细!
    复位的话,未能解决问题。
    现在我观察到的现象是这样的:调用sl_Start(0,0,0)函数时,CC3135MOD 会在 sl_DeviceEnable() 函数执行之后发出28个字节的十六进制数据:BA DC CD AB 08 00 14 00 24 00 04 06 00 00 00 00 11 11 11 11 00 00 10 31 00 00 00 00。接下来SDK会解析这些数据,最后我观察到应该是解析成功了,sl_Start函数会return 0,而0意味着设备角色为STA。
    再接下来,我会调用sl_NetCfgGet(SL_NETCFG_MAC_ADDRESS_GET,NULL,SL_MAC_ADDR_LEN,(_u8 *)MAC_Address);
    这个函数来读取WiFi的Mac地址,这时我debug仿真观察到MCU有发出20个字节的十六进制数据:FF EE DD BB 21 43 34 12 33 84 08 00 00 00 02 00 00 00 00 08。这应该是向CC3135查询Mac地址的指令。几秒之后,程序会运行到SimpleLinkFatalErrorEventHandler 这个函数,然后 event ID 是 4,意味着 SL_DEVICE_EVENT_FATAL_NO_CMD_ACK . 这看起来是CC3135没有响应。
    这可能是其他什么原因导致的呢?
  • 出现SL_DEVICE_EVENT_FATAL_NO_CMD_ACK是主机驱动程序没有接收设备的ACK命令,必须执行设备重启(调用sl_Stop,然后sl_Start)
    也可以看下这里:e2e.ti.com/.../3015476
  • Halo Kevin,
    感谢您的回复!
    今天我又排查了一下我们产品的硬件图,发现原来是RTS和CTS脚接错了。。。
    现在我接正确了:也就是我MCU的RTS脚接到CC3135MOD的CTS脚了,MCU的CTS脚接到CC3135MOD的RTS脚了。
    然后接着我发查询MAC地址的指令之后,CC3135MOD能正常回应一串数据。不过貌似SDK不知道有接收到数据,并且没有进入sl_IfRead这个函数去读取数据。照理说SDK发送了查询MAC地址指令之后,会去读取串口返回的数据吧?
  • 这个要看程序中有没有写读的函数,你看下你的程序中有没有这部分代码
  • Hi Kevin,
    您是指sl_IfRead 和 sl_IfWrite函数吗?我的代码里有实现了这两个函数为uart_Read和uart_Write函数了。
    在CC3135MOD模块上电的时候,其实我可以在仿真里看到,SDK有进入到uart_Read函数里读取CC3135MOD的Sync数据。
    但是现在我想读取MAC地址时,虽然我可以通过USB转串口硬件监视到CC3135MOD有返回一组数据,但是SDK并没有去调用uart_Read 这个函数。。。
    然后SimpleLinkFatalErrorEventHandler 提示的事件ID是 4 = SL_DEVICE_EVENT_FATAL_NO_CMD_ACK 。
  • 在SDK中的例程是通过sl_NetCfgGet来获得mac地址的:

    
    
    int32_t            ret = 0;
         uint8_t            macAddress[SL_MAC_ADDR_LEN];
         uint16_t           macAddressLen = SL_MAC_ADDR_LEN;
         uint16_t           ConfigSize = 0;
         uint8_t            ConfigOpt = SL_DEVICE_GENERAL_VERSION;
         SlDeviceVersion_t ver = {0};
    
         ConfigSize = sizeof(SlDeviceVersion_t);
    
        /* Print device version info. */
        ret =
            sl_DeviceGet(SL_DEVICE_GENERAL, &ConfigOpt, &ConfigSize,
                         (uint8_t*)(&ver));
        ASSERT_ON_ERROR(ret, DEVICE_ERROR);
    
        /* Print device Mac address */
        ret = sl_NetCfgGet(SL_NETCFG_MAC_ADDRESS_GET, 0, &macAddressLen,
                           &macAddress[0]);
        ASSERT_ON_ERROR(ret, WLAN_ERROR);
    UART_PRINT("\t MAC address: %02x:%02x:%02x:%02x:%02x:%02x",
                   macAddress[0],
                   macAddress[1],
                   macAddress[2],
                   macAddress[3],
                   macAddress[4],
                   macAddress[5]);
                      
                   return(ret);

  • Hi Kevin,
    感谢您找的例程,很有帮助!
    不过实验结果跟我之前的查询Mac地址的指令一样。SDK还是不去读取串口里的数据。
    下面是我监控串口读到的数据:

    CC3135MOD上电时发出的sync数据:BA DC CD AB 08 00 14 00 24 00 04 06 00 00 00 00 11 11 11 11 00 00 10 31 00 00 00 00

    MCU查询指令SL_DEVICE_GENERAL发出的数据 :FF EE DD BB 21 43 34 12 66 84 08 00 00 00 01 00 0C 00 00 20
    CC3135MOD的回应:BA DC CD AB 66 04 24 00 23 00 04 06 00 00 00 00 00 00 01 00 0C 00 14 00 00 00 10 31 03 01 00 05 03 01 00 11 04 02 00 03 22 22 BE BA

    对了,Kevin,请问这些数据协议是否有说明文档来解释每个字节的含义呢?
  • 具体是通过哪段代码发出的这些数据
  • 是通过您刚刚发给我的代码,监控到串口线的数据。
    int32_t ret = 0;
    uint8_t macAddress[SL_MAC_ADDR_LEN];
    uint16_t macAddressLen = SL_MAC_ADDR_LEN;
    uint16_t ConfigSize = 0;
    uint8_t ConfigOpt = SL_DEVICE_GENERAL_VERSION;
    SlDeviceVersion_t ver = {0};
    ConfigSize = sizeof(SlDeviceVersion_t);
    /* Print device version info. */
    ret =
    sl_DeviceGet(SL_DEVICE_GENERAL, &ConfigOpt, &ConfigSize,
    (uint8_t*)(&ver));
    ASSERT_ON_ERROR(ret, DEVICE_ERROR);
  • 上面这段获取的是设备的版本信息
  • 嗯,对的,没错。
    会不会是我移植的工作里,没把中断引脚的相关代码做好,导致中断没提示到simplelink代码呢?
  • 程序正常运行的话会将版本信息打印到串口上显示,可能是串口端没有配置好
  • Hi Kevin,
    我的板子上没有额外的串口来打印信息,所以我不打算实现SDK里串口打印的功能。
    您有中断配置的例程吗~
  • Hi Kevin,
    感谢您这段时间对我的帮助!
    我突然意识到,我拿到CC3135MOD这个模块之后,还没对它进行过固件升级。
    请问您了解怎么查询固件版本信息,然后请问最新的固件可以在哪里下载呢?
    谢谢!祝工作顺利
  • 可以通过xdsdfu来获取,也可以通过代码获取,通过xdsdfu获取请看附件XDS110SupportReadMe.pdf

    最新固件在SDK中有,C:\ti\simplelink_cc32xx_sdk_4_10_00_07\tools\cc32xx_tools\servicepack-cc3x20

  • 我电脑上,xdsdfu软件运行不起来,尴尬,不过还是谢谢Kevin~
    这个SDK包的固件service pack也适用于CC3135MOD对吗?
  • xdsdfu要用命令提示符打开,双击是打不开的,可以在xdsdfu所在目录下按住shift,单击右键,选择从此处打开命令符。

    RogerHuang said:
    这个SDK包的固件service pack也适用于CC3135MOD对吗?

    是的

  • 好的,感谢Kevin,我已经能正常升级了
  • 感谢大家以来的关注和帮助,后来我排查发现发帖时反馈的问题是因为我的MCU的流控线跟CC3135MOD接的不对,导致一开始读不到Mac地址。本帖子可以封帖了。不过现在发现CC3135MOD发出数据时,中断线异常,没有给上升沿的信号,导致有新问题。