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.

[参考译文] CC1200:使用 BeagleBone Black 通过 SPI 传输数据、并通过 SmartRF 工具(数据包 RX)在另一个 cc12200上接收数据

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/748565/cc1200-using-beaglebone-black-to-transmit-data-via-spi-and-recieve-on-another-cc12200-with-smartrf-tool-packet-rx

器件型号:CC1200

您好!

我正在尝试将数据从一个 cc1200无线电传输到另一个。 一方面、我使用 BeagleBone Black 与 cc1200发送器通信、另一方面、我连接到笔记本电脑并在 SmartRF Studio 中运行数据包 Rx 功能。  

我在 Smart RF 工具上看不到任何价值。

我当前的流程是使用突发位和第一个地址校准发射无线电、后跟该地址的值、后跟每个连续地址的值。 我在数据包 TX 模式下使用 Smart RF 工具以所需的频率和功率导出这些值。 然后、我使用选通命令、然后发送数据。 状态字节表明、当我发送数据时、芯片处于传输模式(2F)、但是在 Smart RF 接收无线电上没有显示任何内容。

我的操作顺序是否不正确? 我是否遗漏了什么? 如果有任何帮助,我们将不胜感激。  

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在使用在线(github.com/.../spidev_test)中提供的 spidev_test.c 并更改数组中的十六进制值(我为每个步骤运行单独的程序)。 发送数据时、我的值以0x7F 开头(根据文档、应将无线电置于 FIFO 写入模式并突发以下十六进制值)、然后我发送后面的随机十六进制值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、SRB、

    您能否提供配置无线电并开始数据包传输的代码片段? 您能否提供与 CC1200通信的逻辑分析仪片段?

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

    感谢 Fredrik 的回复、

    我正在使用在线 spidev_test.c。 我将十六进制数组中的值替换为所需的值。

    我运行3个程序、每个程序在数组中具有不同的十六进制值。

    1.配置 cc1200

    2.选通脉冲命令0x35 - STX (启用 TX)

    3.发送数据:0x7f 后跟长度值(0x08)、后跟8个随机十六进制值。

    我不熟悉 BeagleBone、不知道如何自行对 SPI 驱动程序进行实际编程。 (我对需要执行的操作有一个大致的了解、但不知道任何命令或语法。

    (我在网上找到这些信息时遇到了困难、可能是因为我认为我应该寻找的不是我实际应该寻找的。)

    下面是代码、我不能专门指向代码中的传输位置、但它非常紧凑。 在代码附加我的 DLA 数据之前。 D0:CLK、D1:CS、D2:MOSI、D3 MISO。  

    配置:

    尝试发送数据:

    /*
    * SPI 测试实用程序(使用 spidev 驱动程序)
    *
    *版权所有(c) 2007 MontaVista Software、Inc.
    *版权所有(c) 2007 Anton Voronsov 
    *
    *本程序是免费软件;您可以根据
    
    * Free Software Foundation 发布的 GNU 通用公共许可证条款重新分发和/或修改*本许可证的第2版。
    *
    *使用交叉编译交叉编译-gcc -I/path/c/cross-kernel/include
    */
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define array_size (a)(sizeof (a)/sizeof ((a)[0]))
    
    static void pabort (const char *s)
    {
    perror;
    abort();
    }
    
    static const char *device ="/dev/spidev1.0;
    static uint8_t mode;
    static uint8_t bits = 8;
    static uint16
    
    
    
    
    int transfer = t static intt int t_t transfer;static uint16 int t int int void t transfer = t_t int int intrust t void t
    uint8_t TX[]={
    0xFF、0xFF、0xFF、0xFF、0xFF、 0xFF、
    0x40、0x00、0x00、0x00、 0x00、0x95、
    0xFF、0xFF、0xFF、0xFF、 0xFF、0xFF、0xFF、
    0xFF、0xFF、 0xFF、0xFF、0xFF、0xFF、
    0xFF、 0xFF、0xFF、0xFF、0xFF、0xFF、
    0xDE、0xAD、0xBE、0xEF、0xBA、 0xAD、
    0xF0、0x0D、
    };
    uint8_t rx[array_size (TX)]={0、};
    struct spi_oc_transfer tr ={
    .TX_Buf =(unsigned long) TX、
    .rx_Buf =(unsigned long) rx、
    .len = array_size (tx)、
    .delay_usecs =
    
    (unsigned long)、.speed_bits =.speed_bits =.speed、.speed_bits =.speed_bits =.h、
    };
    
    ret = ioctl (fd、SPI_IOC_MESSAGE (1)、&tr);
    if (ret < 1)
    pabort ("无法发送 SPI 消息");
    
    for (ret = 0;ret < array_size (tx);ret++){
    if (!(ret% 6))))
    ;
    printf
    
    
    
    
    
    
    ("%.2X";ret_props (")- dlt dx (";pit deg"(n")使用情况[!(void +)}pit +);pit +(pit +)
    要使用的设备设备(默认/dev/spidev1.1)\n"\}
    "-s --speed max speed (Hz)\n"
    "-d --delay delay (usec)\n"
    "-b --bpw 每字比特数\n"
    "-l --loop 回送\n"
    "-H -- cpha 时钟相位\n"
    "-O -- cpol 时钟极性\n"
    "-L -- lsb 最低有效位优先\n"
    "-C 高电平芯片选择高电平有效\n"
    "-3 --3Wire SI/SO 信号共享\n");
    EXIT (1);
    }
    
    静态空 pars_opts (int argc、char * argv[])
    {
    while (1){
    static const struct option lopts[]={
    "设备"、1、0、'D'}、
    {"speed"、 1、0、"S"}、
    {"延迟"、1、 0、'd'}、
    {"BPW"、 1、0、'b'}、
    {"loop"、0、 0、'l'}、
    {"cpha"、0、0、 'h'}、
    {"ctol"、0、0、'O'}、
    {"lsb"、 0、0、'L'}、
    {"cs-high"、0、 0、"C"}、
    {"3Wire"、0、0、 '3'}、
    {"no-cs"、0、0、'N'}、
    {"ready"、0、0、"R"}、
    {NULL、 0、0、0}、
    };
    int c;
    
    c = getopt_long (argc、argv、"D:s:d:b:lHOLC3NR"、lopts、NULL);
    
    if (c =-1)
    break;
    
    switch (c){
    case "D":
    device = optarg;
    break;
    case "S":
    speed = atoi (optarg);
    break;
    case 'd':
    delay = atoi (optarg);
    break;
    case 'b':
    bits = atoi (optarg);
    break;
    case 'l':case 'l':
    model = atoi (optarl);case =
    
    
    
    
    SPI =_h_break;case = SPI;case ='SPI:break';case =_h_op_model;case ='SPI:_break';case =_h'
    
    
    案例'L':
    MODE |= SPI_LSB_FIRST;
    break;
    case 'C':
    mode |= SPI_CS_HIGH;
    break;
    case '3':
    mode |= SPI_3Wire;
    break;
    case 'N':
    mode |= SPI_NO_CS;
    break;
    case 'R':
    mode |= SPI_READY;
    break;
    default:print_argc
    
    
    =
    
    
    
    
    argt;v = argt;argint argc =
    argt;v = argint argt;argc = argint argt;v = argint argc = gargt;v = argint argint argt;v = argint argt;argc = gargint argt
    
    
    
    
    FD =开路(器件、 o_RDWR);
    if (fd < 0)
    pabort ("无法打开设备");
    
    /*
    SPI 模式
    */
    ret = ioctl (fd、SPI_IOC_WR_MODE、&MODE);
    if (
    
    
    
    
    
    
    
    
    
    IoC =-1) pabort ("无法设置 SPI 模式");ret= ioctl (fp、SPI_Ioc_WR_MODE);* ioct2 = ioct/ ioct/ iot_bits = 1 (* ioct_bits =/e_bits =/fp);(* ioct_bits =/ioct_bits =/ioct_bits =/ioct_bits =/f2)
    if (ret =-1)
    pabort ("无法为每个字设置位");
    
    ret = ioctl (fd、SPI_IOC_RD_bits_per_word 和&bits);
    if (ret =-1)
    pret ("无法为每个字设置位");
    
    //
    *最大速度
    */
    
    
    abort = ioctl (fd、spi_bret =–1)
    
    、ioc_speed (最大速度= 1 Hz);ioc_rebax =最大速度=最大速度=最大速度(f_Hz);(ioc_re_re_wr =最大速度=最大速度=最大速度=最大速度= 1 Hz)
    if (ret =-1)
    pabort ("无法获取最大速度 Hz");
    
    printf ("SPI 模式:%d\n"、模式);
    printf ("每个字的位数:%d\n"、位);
    printf ("最大速度:%d Hz (%d KHz)\n"、速度、速度/1000);
    
    transfer (FD
    
    );close (FD);
    
    返回 ret;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请执行以下操作:
    -初始化前的 SRES
    -在您选择 TX 选通之前写入 TX FIFO

    您能否解释一下第二个图、因为它看起来像是您发送了某些数据、但该图不显示这些数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 ter、

    我在配置前尝试过 SRES、但仍然没有结果。

    在写入数据然后进行频带时、仍然没有结果。

    第二个图不包含我在代码中显示的数据、我不会将代码片段中显示的数据用于任何命令。
    第二个图中显示的数据是我要发送给 TX FIFO 的数据。

    我现在正在尝试确保它正确写入 TX FIFO、但不确定如何读取扩展寄存器。 我使用的命令是:
    0xAF、后跟0xD8 (扩展寄存器 FIFO_NUM_TXBYTES)、返回:00 (在尝试写入数据之后、在轮询之前)

    感谢您的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否澄清一下您在这里的意思:"我不会将代码片段中显示的数据用于任何命令"、这是否意味着您将数据作为命令的参数发送? 您是否只使用从不同代码的终端共享的代码中的调用? 在这两种情况下、都很难看到您在做什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我实际上运行了多个程序、每个程序都与我上面发布的代码相匹配、但有一个差异-"uint8_t TX[]"数组中的值。 话虽如此、我上面发布的代码段中该数组中的值是随机的、我不会在任何程序中使用这些值。

    因此、运行多个程序时、每个相应程序中包含的值为:

    SRES (0x30)
    2.配置(0x40、0x06、0x06、等等)
    3.发送数据(0x7F (对 FIFO 的猝发写入)、0x08 (数据包的字节长度)、8个随机值
    4. TX 选通(0x35)

    然后、对讲机会返回空闲状态、这将使我相信数据包已成功发送。

    我现在已经将另一个无线电(接收器)连接到 Beagle Bone Black 上的不同 SPI 端口。 当我执行 FIFO 读取命令时、返回十六进制值10。 (与 TX 选通前的读数不同)

    但我的长度字节十六进制后的第一个值是0x31。 实际上、值0x10甚至不在我的数据阵列中。


    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我配置无线电并写入 FIFO 后、我读取 num_txbytes、读数为9、正如它应该是的(我假设我不需要"数据包字节的长度")、在连续读取 TX 之后、我再次读取它并将其读取为0。 但是、读取接收器上的 num_rxbytes 会返回0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    -您是否打算在批量生产中使用 BeagleBone 或与 CC1200配合使用的处理器?
    -您是否了解过您使用的 VCO 校准设置? 检查 settings_CFG.FS_AUTOCAL 设置。 您可能需要发出 SCAL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不、我只是将 BeagleBone 用于测试目的。

    我将进行检查。 谢谢。

    我将写入209个寄存器。 我在 RFstudio 中为我的对讲机选择了适当的设置、然后将每个升序寄存器值写入代码中的数据数组中(在写入适当的猝发写入之后跟随第一个地址命令、在本例中为0x40)。 如前所述、这会写入209个寄存器。 但是、如果我在选择适当的设置后使用导出命令、它将为我提供远少得多的寄存器、如果我还记得正确的话、我需要配置大约42个寄存器。 问题是它们没有完全按升序排列。 我很容易不能使用 burst 命令、我唯一的困惑是写入扩展寄存器空间。

    写入扩展寄存器空间时、会提示写入命令0x2F、然后写入要写入的寄存器、最后写入该寄存器中的数据。 我的问题是、我是否需要不断写入0x2F 以写入另一个扩展寄存器、或者我是否可以简单地放置0x2F、然后再写入寄存器值寄存器值等?

    谢谢。

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

    如果您选择对所有寄存器执行猝发写入、则必须将猝发访问划分为两个。 一个用于寄存器空间、另一个用于扩展寄存器空间。 对于对扩展寄存器空间的猝发访问、只需发送0x2F 一次。 《用户指南》的表3对此进行了说明。

    Siri

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Siri、如果我不想使用突发访问、但仍然想继续访问扩展寄存器、该怎么办? 如所示、我想连续写入扩展寄存器、但它们不是增量顺序-我需要写入"0x2F、extaddress、data@extadress、0x2F、extaddress2、 数据@extaddress2"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以这么做。

    Siri