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 这个函数。
请问一下,这个是什么原因导致的呢?
Kevin Qiu1:
你具体移植的是哪部分程序,TCP套字还是其他的,串口有打印什么信息吗,复位后正常吗\briefSimpleLinkFatalErrorEventHandlerThis handler gets called whenever a socket event is reportedby the NWP / Host driver. After this routine is called, the user'sapplication must restart the device in order to recover.\paramslFatalErrorEvent-pointer to fatal error event.\returnvoid\noteFor more information, please refer to:user.h in the portingfolder of the host driver and theCC31xx/CC32xx NWP programmer'sguide (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;} }
RogerHuang:
回复 Kevin Qiu1:
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函数,可以告诉我吗?
Kevin Qiu1:
回复 RogerHuang:
出现SimpleLinkFatalErrorEventHandler就是socket部分的问题,如果你不使用socket部分,在你的工程删除sl_socket.c和sl_socket.h文件
SDK插件的说明看下这里:dev.ti.com/…/node
复位的目的就是重新上电看是否会回复正常
RogerHuang:
回复 Kevin Qiu1:
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没有响应。
这可能是其他什么原因导致的呢?
Kevin Qiu1:
回复 RogerHuang:
出现SL_DEVICE_EVENT_FATAL_NO_CMD_ACK是主机驱动程序没有接收设备的ACK命令,必须执行设备重启(调用sl_Stop,然后sl_Start)
也可以看下这里:e2e.ti.com/…/3015476