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.

[参考译文] CC3100MODBOOST:TMS570LS0432的 CC3100驱动程序移植

Guru**** 1810550 points
Other Parts Discussed in Thread: TMS570LS0432, CC3100, CC3100SDK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/705621/cc3100modboost-cc3100-driver-porting-for-tms570ls0432

器件型号:CC3100MODBOOST
主题中讨论的其他器件:TMS570LS0432CC3100CC3100SDK

您好!

我仍在尝试为 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()之前,驱动程序会生成一个“一般事件”(请参阅终端输出的末尾):

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

    您肯定在正确的道路上。 我相信您会看到超时值 Nonos_RET_ERR 过期、因为在 NWP 及时响应之前、Hercules MCU 会将超时递减至0。

    我会尝试增加超时的长度、或通过提供时间戳来使用另一个超时。

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

    尊敬的 Seong:

    非常感谢您的回复。 在经历了两天的"尝试与错误"之后、我找到了一个可行的解决方案。 实际上、驱动器时序有问题。 通过预处理速度更快的 CPU (在 user.h 文件中更改 CPU_FREQ_IN_MHz)来增加计算的超时值不起作用、因此我尝试提供时间戳。 我已经在我的项目(在 timer.c 文件中)中写入了一个 time 函数、该函数返回自控制器启动以来的时间(以毫秒为单位)。 它使用控制器的 RTI 模块进行时间测量。 我在 user.h 中为该驱动程序提供了 getTimestamp 函数:

    #define SL_GetTimestamp getTimeStamp
    #define SL_TIMESTAMP_TICKS_IN_10_milliseconds 10
    #define SL_TIMESTAMP_MAX_VALUE 0xFFFFFFFF 

    我实现了一种新的 getTimestamp()方法,返回 timer.c 中的32位数字,因为我的 getTimeMillis()函数返回64位值:

    uint32 getTimeStamp(){
    返回(UINT32) getTimeMillis();
    } 

    这就是解决计时问题的全部方法。 感谢你的帮助!

    此致
    米歇尔