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:配置寄存器写入和读取操作

Guru**** 2393725 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/594806/cc1200-configuration-registers-write-and-read-operations

器件型号:CC1200
主题中讨论的其他器件: SimpliciTI

从该图中可以看到、 联系 SPI 访问类型中的单寄存  器访问、我们认为如果我们向 SI 引脚发送0x80、这意味着我们要执行的操作是从 CC1200读取寄存器的值、SO 引脚将返回0x00 (地址)的值。
如果 CC1200在我们读取寄存器之前通电、则该值为复位值(默认值) 0x06。
因此、当我们向 SI 引脚发送0x80时、SO 引脚应返回一个8位芯片状态字节和一个8位数据字节(0x06)。
SI:0x80
因此:0x0F 0x06

 我的理解是否正确?

当我们写入寄存器时、SO 引脚首先返回8位芯片状态字节、为什么 S6为零?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的。 在 MOSI 上发送0x80意味着您要对寄存器0x00 (IOCFG3)进行一次读取。 该寄存器默认设置为0x06。 当0x80 8s 在 MOSI 上计时时、您将在 MISO 上获得返回的状态。 这是0x0F、这意味着 CHIP_RDYn 为0且状态为空闲(000)。 最后4个位(0xF)被保留。 下一个字节(0x06)是寄存器0x00的内容。 在 SPI 实现中、您应该在 CHIP_RDYn (状态字节的 MSB)上进行轮询、并在开始计时之前确保它为0、因为在晶体不稳定的情况下、您不应该访问芯片。

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

    我们通过 SPI 接口使用 tiny4412 (使用 Samsung Exynos4412作为主处理器)来控制 cc1200。

    由此:e2e.ti.com/.../279412,We 确定了连接、如图所示

    当我们向 SI 引脚发送命令选通 STX (0x35)时、SO 引脚应返回 芯片状态字节 (0x2F)、这已由我们验证、

    SI:STX (0x35)

    SO: 芯片状态字节 (0x2F)

    当我们向 SI 引脚发送0x80时、SO 引脚应返回一个8位芯片状态字节和一个8位数据字节(0x06)。
    SI:0x80
    因此:0x0F 0x06

    但我无法得到0x06、为什么是?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MCU 是主器件、因此主器件必须提供时钟(SCLK)才能从 CC1200读取数据。 用户指南中的图3显示了这一点。 这意味着、在时钟输出0x80后、必须发送虚拟字节才能读取0x06。

    BR

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

    感谢您的帮助。我们获得了正确的结果。

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

    芯片复位后、我们能够通过 SPI 接口配置/重新配置无线电。

    但我们 无法使 CC1200正确地发送和接收数据包。我们的连接是否正确?

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

    我们需要有关您正在做什么以及您看到什么的更多信息来帮助您进一步。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们使用 ARM 控制 CC1200作为接收器、MSP430控制 CC1200作为发送器。 代码根据 swrc274a 的 cc120x_ease_link 进行修改。 现在的问题是、我们丢失了大量数据包、在 packetCounter 中接收到的数据包不连续:

    接收器:packetCounter = 1
    数据包:packetCounter = 0x00 0x0C
    接收器:packetCounter = 2
    数据包:packetCounter = 0x00 0x14
    接收器:packetCounter = 3
    数据包:packetCounter = 0x00 0x1B

    void runRX(){

    uint8 rxBuffer[128]={0};
    uint8 rxBytes;
    uint8 marcState;

    printf("******** 设置 CC1200模式为 RX ************* \n");
    TrxSpiCmdStrobe (CC120X_SRX);
    睡眠(2);

    while (1){
    printf ("--read number rxbytes from CC120X_NUM_RXBYTES--\n");
    rxBytes = cc120xSpiReadReg (CC120X_NUM_RXBYTES);
    printf ("-------------------- rxBytes =0x%2hhhx ---------- \n",rxBytes);

    if (rxBytes!= 0){
    printf ("--read Marc state to check for RX FIFO error \n");
    marcState = cc120xSpiReadReg (CC120X_MARCSTATE);
    printf ("---------------- marcstate =0x%2hhhhx----- ",marcState";

    if ((marcState & 0x1F)= RX_FIFO_ERROR){
    printf("--if RX FIFO 错误,CC1200清空 RX FIFO 缓冲区\n");
    TrxSpiCmdStrobe (CC120X_SFRX);

    否则{
    printf ("从 RX FIFO 读取 rxBuffer\n");
    cc120xSpiReadRxFifo (rxBuffer、rxBytes);

    if (rxBuffer[rxBytes - 1]和0x80){
    PacketCounter++;
    printf("****** 电池组计数器=%d ******** \n",packetCounter);



    TrxSpiCmdStrobe (CC120X_SRX);
    睡眠(2);

    printf ("****** 接收过多 \n");

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您为什么要连续轮询 FIFO 中的字节数量而不是使用基于中断的系统?

    if (rxBuffer[rxBytes - 1]& 0x80):如果为真、您是否有一个结束字节、因为您累加了计数器?