主题中讨论的其他器件:TMS570LS0432、 CC3100、 CC3100SDK
您好!
我仍在尝试为 TMS570LS0432移植 CC3100驱动程序。 我已经实现了必要的函数 SPI_Write、SPI_Read、CC3100_enable、CC3100_disable 等 对于我的主函数、我使用了"C:\ti\CC3100SDK_1.3.0\cC3100-SDK\examples\getting_started_with _WLAN_ap"中的示例代码、因为我要将 CC3100配置为接入点。 我的 SPI 总线工作正常、TMS750控制器和 CC3100模块之间的通信似乎正常(请参阅下面的终端输出)。 在我的 cc3100_main()函数中(见下文),程序到达第一个 LOOP_FOREVE(),因为 configureSimpleLinkToDefaultState()方法返回值-100 (sl_api_aborted)。 该错误在驱动程序的代码中被描述为"API has been aborted due to an error detected by host driver"。 我发现原因是 CC3100驱动程序的函数_SlNonOsSemGet ()。 它返回 Nonos_RET_ERR、因为其超时值已过期。 此函数中有一个 while (Timeout > 0)循环、该循环应由 break 语句保留、以便在此函数结束时返回 Nonos_RET_OK。 在 _SlNonOsSemGet ()函数中断开循环的条件为:
if (WaitValue ==*(volatile _u8 *) pSyncObj) { *pSyncObj = SetValue; 中断; }
这就是我能弄清楚的。 我建议 _SlNonOsSemGet ()函数等待中断,因为我不在控制器上使用多个线程或操作系统。 因此在正确处理 HOST_IRQ 引脚上的中断时可能会出现问题。 我已经在中断函数中设置了一个断点。 如果 HOST_IRQ 引脚上有上升沿、则会调用中断。 已注册的中断处理程序分别 调用_SlDrvRxIrqHandler()函数并可以处理中断。 现在、我不知道如何修复此行为并使 CC3100驱动程序在 TMS570上运行。 另一个建议是超时值太小、CC3100器件的应答速度不够快。 有人能告诉我我我的建议是否完全错误、或者我是否以正确的方式解决了我的问题? 如果对您有所帮助、您可以查看我上传的完整项目(见下文)。
感谢您的任何回答或提示。
此致
米歇尔
这是我的 main()函数(之前调用了一个单独的 setup()函数来初始化 SPI、中断、引脚等):
/* *应用程序的入口点 */ int cc3100_main(){ SlPingStartCommand_t PingParams ={0}; SlPingReport_t 报告={0}; _u8 SecType = 0; _i32模式= role_STA; _i32返回值=-1; RetVal =初始化 AppVariables(); ASSERT_ON_ERROR (RetVal); /*停止 WDT 并初始化 MCU 的系统时钟*/ //stopWDT(); //initClk(); /*配置命令行界面*/ //cli_Configure(); displayBanner(); CLR_STATUS_BIT (G_Status、STATUS_BIT_PING_DONE); G_PingPacketsRecv = 0; /* *以下函数通过清除将器件配置为默认状态 *存储在 NVMEM (即连接配置文件& *策略、电源策略等) * *如果开发人员确信,应用程序可能会选择跳过此步骤 *器件在应用程序开始时处于其默认状态 * *请注意,在上完成的所有配置文件和持久设置 *设备将丢失 * RetVal = configureSimpleLinkToDefaultState(); if (RetVal < 0){ if (device_no_in_station)= RetVal){ print("未能将设备配置为默认状态\n"); } loop_forever (); } 打印("设备配置为默认状态\n\r\n); /* *假设器件已配置为站点模式 且处于默认状态 * MODE = SL_Start (0、0、0); if (role_AP = mode){ /*如果器件处于 AP 模式、我们需要等待该事件后再执行任何操作*/ while (!is_ip_acquired (g_Status)){ _slNonOsMainLoopTask(); } } 否则{ /*将 CC3100配置为在 AP 模式下启动*/ RetVal = sl_WlanSetMode (Role_AP); if (RetVal < 0){ loop_forever (); } /*配置 CC3100的 SSID */ RetVal = SL_WlanSet (SL_WLAN_CFG_AP_ID、WLAN_AP_OPT_SSID、 PAL_strlen (SSID_AP_MODE)、(_u8 *) SSID_AP_MODE); if (RetVal < 0){ loop_forever (); } SecType = SEC_TYPE_AP_MODE; /*配置 AP 模式的安全参数*/ RetVal = SL_WlanSet (SL_WLAN_CFG_AP_ID、WLAN_AP_OPT_SECURITY_TYPE、1、 (_u8 *)&SecType); if (RetVal < 0){ loop_forever (); } RetVal = sl_WlanSet (sl_WLAN_CFG_AP_ID、WLAN_AP_OPT_PASSWORD、PAL_strlen (password_AP_MODE)、 (_u8 *) PASSWORD_AP_MODE); if (RetVal < 0){ loop_forever (); } RetVal = sl_Stop (sl_stop_timeout); if (RetVal < 0){ loop_forever (); } CLR_STATUS_BIT (G_Status、STATUS_BIT_IP_ACQUIRED); MODE = SL_Start (0、0、0); if (role_AP = mode){ /*如果器件处于 AP 模式、我们需要等待该事件后再执行任何操作*/ while (!is_ip_acquired (g_Status)){ _slNonOsMainLoopTask(); } } 否则{ 打印("设备无法在 AP 模式下配置\n\r\n); loop_forever (); } } 打印("设备作为接入点启动\n"); /*等待*/ 打印("正在等待客户端连接...!\n\n"); while ((!is_ip_leased (g_Status))||(!is_sta_connected (g_Status))){_SlNonOsMainLoopTask ();} 打印("连接到设备的客户端\n\r\n); 打印("正在 ping ...! \n\n"); /*设置 ping 参数*/ PingParams.PingIntervalTime = ping_interval; PingParams.PingSize = ping_size; PingParams.PingRequestTimeout = ping_request_timeout; PingParams.TotalNumberOfAttempts = ping_attempt; PingParams.Flags = 0; PingParams.ip = g_StationIP;//填充连接到 CC3100的站点 IP 地址*/ /* Ping 客户端已连接到 CC3100 */ RetVal = sl_NetAppPingStart (((SlPingStartCommand_t*)&PingParams、SL_AF_iNet、(SlPingReport_t*)&Report、SimpleLinkPingReport); if (RetVal < 0){ loop_forever (); } /*等待*/ while (!is_ping_done (g_Status)){ _slNonOsMainLoopTask(); } if (0 = g_PingPacketsRecv){ 打印("工作站无法连接到设备\n\r\n); ASSERT_ON_ERROR (LAN_CONNECT_FAILED); } 打印("设备和工作站已成功连接\n\r\n); 返回成功; }
这是终端输出:
WLAN 接入点应用程序入门-版本1.3.0 SPI 写入:87 65 78 56 SPI 读取:AB CD DC BC 00 08 00 08 SPI 读取:00 00 00 SPI 读取:11 11 11 SPI 写入:43 21 34 12 SPI 写入:84 66 00 08 SPI 写入: 00 00 00 01 00 0C 24 C0 SPI 写入:87 65 78 56 SPI 读取:AB CD DC BD 04 66 00 38 SPI 读取:38 00 00 00 SPI 读取:00 00 00 01 0C 00 2C SPI 读取:04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 02 01 00 03 17 00 00 02 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 01 33 A8 8B SPI 写入:43 21 34 12 SPI 写入:8C 86 00 04 SPI 写入:10 00 11 00 SPI 写入:87 65 78 56 SPI 读取:AB CD DC be 0C 86 00 08 SPI 读取:38 00 00 00 SPI 读取: 00 00 01 00 SPI 写入:43 21 34 12 SPI 写入:8C 85 00 04 SPI 写入:FF 00 27 10 [一般事件]
下面是我的完整项目代码:
e2e.ti.com/.../CC3100-driver-for-TMS570.zip
编辑:
我忘记指出,在达到 LOOP_FOREVENT()之前,驱动程序会生成一个“一般事件”(请参阅终端输出的末尾):