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.

[参考译文] CCS/MSP430F5255:在MSP430中使用BG库时出现问题

Guru**** 2595770 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/630881/ccs-msp430f5255-problem-in-using-bg-lib-with-msp430

部件号:MSP430F5255

工具/软件:Code Composer Studio

大家好,

我正在使用BG Lib将SiLabs的BLE121LR集成到MSP430。 到目前为止,我使用BG脚本处理BLE121LR,但为了实现编程灵活性,我们转而使用BG Lib。 为此,我们在MSP代码中包括了BG Lib,但由于BG Lib仅支持GCC编译器,我们从本机TI MSP430编译器转向MSP430 GCC编译器。  

包含库后,我们能够执行扫描并从BLE模块获得响应。 但当我们尝试使用地址进行连接时,通过将其传递到相关功能,我们获得的地址与我们传递的地址不同。 我们获得的地址为All FF FF FF FF FF FF FF FF FF不正确。 我们就此联系了Si Labs,他们表示他们的图书馆是完美的。  

所以我也要附上我的代码,请给我一个解决方案。  

e2e.ti.com/.../BLE-MSP-GCC-trials.rar

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

    我不熟悉BG Lib,因此我将在帮助您的过程中学习。 我下载了您的代码,我注意到的第一件事是很难遵循。 没有太多的评论,而且有大量的注释代码会使事情变得混乱。 您是否可以将代码重新设计为仅包含重现该问题的最低要求的简化版本,而不是尝试调试整个代码集?

    此外,您能否将我引导至代码中问题可能源于的部分?

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

    您好,Caleb Overbay,

    非常感谢您的回复。 通过此帖子,我将附加2个文件。 一个是我的代码 BLE MSP GCC Trials 2 (目前正在开发中),另一个是scan_example (使用SiLabs (Bluegiga)提供的BG Lib的示例代码)。  

    关于我的代码,我需要将MSP开发为BLE模块的主机控制器。 这里我的应用是开发BLE Master。 为此,我需要遵循以下流程

    1.查找BLE从属设备。  

    这是通过 ble_cmd_gap_discover(cap_discover_generic);完成的;


    2.收集BLE扫描响应。

    此处将根据BLE从属设备广告数据包生成扫描响应。 在这里,我们需要找出需要连接的特定设备(通过存储和比较已知MAC地址。)

    我在 commands.h文件中的ble evt_gap_scan_response (const struct ble msg_gap_scan_response _evt_t *msg)中获得了此信息。 当我获得所需的从属设备的响应时,  

    3.连接到从属设备。

    这可以 使用 ble_cmd_gap_connect_direct(&connect_addr, gap_address_type_public, 32,4.81万, 0);  命令。 使用API和库,我能够正确发送所有其他命令,但对于此命令,我在此命令中传递的地址未反映在输出数据或发送到BLE模块的数据中。 我通过将MSP UART连接到我的PC串行控制台来验证这一点。  

    由于BLE模块和MSP之间仅连接了Rx,Tx引脚,因此我使用数据包模式(长度字节后跟数据)与BLE通信。  

    请浏览完这两个代码后,我删除了所有不必要的代码,并给出了很好的评价,以便让您清楚地了解我的代码。 我希望您理解我的问题。 我的代码 仅在使用需要传递BLE模块MAC地址的特定命令时才公平。 此命令最后调用 cmd_def.c文件中的ble_send_message()。 此函数根据 在cmd_def.h.中定义的参数msgid生成或构建相关的API  

    e2e.ti.com/.../BLE-MSP-GCC-trials-2.rare2e.ti.com/.../HTMcollector.rar

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

    你好,Santhosh,

    感谢您对我进行清洁和指导。

    使用API和库,我可以正确发送所有其他命令,但对于此命令,我在此命令中传递的地址不会反映在输出数据或发送到BLE模块的数据中。 我通过将MSP UART连接到我的PC串行控制台来验证这一点。  [/引述]

    您能否提供有关您希望从MSP430发送哪些数据以及您实际观察到哪些数据的详细信息?

    此致,  

    Caleb Overbay

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

    您好,Caleb Overbay,

    很抱歉回复太晚了...

    预期数据为  

    13 00 0F 06 03 DD 16 44 D8 65 AB 48 B3 00 04 00 00 DA

    但我收到的数据是

    13 00 0F 06 03 FF FF FF FF FF FF FF FF 48 B3 00 00 04 00 00 DA。

    BLE设备的MAC地址未反映。 第一个字节是长度字节。 接下来的4个是命令的标头。 接下来的6个字节是BLE地址。 请查找所附图像,了解我正在使用的命令的详细信息。   

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

    你好,Santhosh,  

    我只是想确认您在上一篇文章中显示的数据是从MSP430发送的,而不 是接收的?

    浏览完代码后,我没有看到您发送给我的第一个项目有太多更改。 它仍然很难遵循,未注释,并且有大量注释掉的代码。 我的最佳猜测是您将 connect_addr参数 错误地传递给 了ble_cmd_gap_connect_direct命令。 但我无法确定这一点,因为此命令没有解释其参数, 而ble发送_message 命令也没有解释。

    总的来说,代码过于混乱,无法按逻辑顺序执行。 在.h文件中实现了一些函数,而将命令定义为其他命令。 很难消化。 我建议您清理此代码,您很可能会解决此问题。  

    此致,  
    Caleb Overbay

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

    你好,Santhosh,

    我非常确定协议PDU的其余部分也是格式错误/无效的。 一个示例:

    PDU的字节10包含addr_type。 根据您的代码,您正在使用公共蓝牙地址。 从规格来看,这意味着字节10的值应该是0x00,但您的预期值是0x48?!

    我最猜测的是bglib是使用错误的硬件设置编译的。

    此致

    Christoph

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

    是的,我也注意到了这一点。 但此问题仅在使用ble_cmd_gap_connect_direct ()此命令时出现。 REST其他命令正在工作。 我的意思是选中了ble_cmd_system_hello(),ble_cmd_gap_discover(cap_discover_generic)。 这两个都工作正常,但这两个没有更多的参数,如ble_cmd_gap_connect_direct()。

    我遇到的主要问题是参数仅通过。 我没有传递connect_addr,而是尝试传递直接字符数组缓冲区temp_Add1。 但我还是遇到了问题。

    在Si Labs的BG Lib中,他们在cmd_def.h中定义如下

    #define ble_cmd_gap_connect_direct(connect_addr,addr_type,conn_interval_min,conn_interval_max,timeout,latite) ble_send_message (ble_cmd_gap_conn_direct_idx,connect_addr,addr_type,conn_interval_min,conn_interval_max,timeout, timeout, latite)

    在cmd_def.c中定义了ble_send_message (),如下所示:

    void ble ble send_message (uint8 msgid,...)

    UINT32 I;
    uINT32 u32;
    UINT16 U16;
    UINT8 u8;

    结构ble_cmd_packet数据包;
    UINT8 * b=(uint8 *)&packet.payload;

    UINT8 *硬件;
    UINT8 *DATA_PTR=0;
    UINT16 DATA_LEN=0;
    va_list va;
    va_start (va,msgid);

    i=API[msgid].params;
    packet.header=apies[msgid].hdr;
    同时(i)


    开关(I&0xF)


    判例7:/*Int32*/
    判例6:/*UINT32*/
    u32=va_arg(va,UINT32);
    *b++=u32&0xff;u32>=8;
    *b++=u32&0xff;u32>=8;
    *b++=u32&0xff;u32>=8;
    *b++=u32&0xff;
    中断;
    判例5:/*Int16*/
    判例4:/*uint16*/
    u16=va_arg(va,unsigned);
    *b++=U16&0xff;U16>=8;
    *b++=U16&0xff;
    中断;
    判例3:/*INT8*/
    案例2:/*uint8*/
    u8=va_arg(va,int);
    *b++=u8&0xff;
    中断;

    案例9:/*string*/
    案例8:/*uint8阵列*/
    data_len=va_arg(va,int);
    *b++=data_len;

    u16=data_len+packet.header.lolen;
    packet.header.lolen=U16&0xff;
    packet.header.type_hilen|=U16>>8;

    DATA_PTR=va_arg(va,uint8*);
    中断;
    判例10:/*hwaddr*/
    hw=va_arg(va,uint8*);

    *b++=*HW++;
    *b++=*HW++;
    *b++=*HW++;
    *b++=*HW++;
    *b++=*HW++;
    *b++=*HW++;

    中断;
    判例11:/*uint16阵列*/
    data_len=va_arg(va,int);
    *b++=data_len&0xff;
    *b++=data_len>>8;

    u16=data_len+packet.header.lolen;
    packet.header.lolen=U16&0xff;
    packet.header.type_hilen|=U16>>8;

    DATA_PTR=va_arg(va,uint8*);
    中断;
    }
    I=i>>4;
    }
    va_end (va);
    if(bglib_output)bglib_output(sizeof(struct ble_header)+apies[msgid].hdr.lolen,(uint8*)&packet,data_len,(uint8*)data_ptR);
    }


    我联系了Si Labs,询问他们是否提供了合适的库,但他们说这些库是正常工作的库。 这些都是针对桌面应用程序进行的测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Christoph:

    我们找到了问题所在。 实际上,我们正面临 着数据类型造成的问题。  

    在Si Labs的给定库中,数据类型定义如下

    typedef无符号char uint8;
    typedef无符号短uint16;
    typedef签署的Short Int16;
    typedef未签名的long UINT32;
    typedef签署的char INT8;

    请确保这些数据类型对于使用MSP430-GCC编译器的MSP430是否正确。  

    谢谢...

    此致

    Santhosh

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

    你好 ,Santhosh,

    [报价用户="SANTHOSH Kumar NALLAMALLA"]

    在Si Labs的给定库中,数据类型定义如下

    typedef无符号char uint8;
    typedef无符号短uint16;
    typedef签署的Short Int16;
    typedef未签名的long UINT32;
    typedef签署的char INT8;

    [/引述]

    这些typedefs看起来与gcc/libc typedefs在其标准头stdint.h中的内容非常相似

    sourceforge.net/.../stdint.h

    此致

    Christoph