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.

[参考译文] CC2530:我想向 TI 工程师论坛求助

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1347187/cc2530-i-want-to-ask-to-ti-engineer-not-forum

器件型号:CC2530
Thread 中讨论的其他器件: Z-stack、TIMAC、 SMARTRF06EBK

我想咨询 TI 工程师、而不是论坛。

 我如何向他们提出要求?

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

    尊敬的 Edan:

    我等 TI 工程师每天都会监控每个 E2E 论坛帖子。  在 E2E 论坛上、您唯一可以联系的是达司·陈、他是 E2E 社区的资深成员、也是 MCU 射频通信专家。  您在 E2E 论坛上创建的任何主题帖都会得到 TI 的适当关注。

    此致、
    Ryan

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

    我通过查看 CC2530示例实现了该功能。

    1) 1)使用终端器件 CC2530 (hal_adc.c)读取电压。

    2) 2)将读取的值发送到路由器 CC2530。 (Basicrf.c)

    都能正常工作。 但是、将上述两种方法混用是行不通的。 无错误发生。

    1) 1)是否有任何仅涉及 ADC 和射频通信的示例?
    ZStack 示例包含太多不必要的文件、并且交织在一起、因此如果我删除不必要的内容、它将无法正常工作。

    2) 2)我可以使用 basic_rf.c 作为终端设备和路由器运行吗? 有人说 basic_rf.c 仅用于1:1通信。

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

    1) 1)不、您需要自行开发。  请进一步说明"混用上述两种方法是不起作用的"以及有关具体不起作用的内容、调试工作等的详细信息

    2) 2)您无法 与 Z-Stack 或任何 Zigbee 协议固件互操作 basic_rf.c。  对于简单的无线电功能、基本射频实际上仅是一对一的通信。

    此致、
    Ryan

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

    好的、那么哪个示例源是终端设备和路由器的射频通信? 不是 BasicRF。

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

    Z-Stack 3.0.2\Projects\ZStack\HomeAutomation、任何项目选项。  在 IAR 中打开后、将构建配置更改为"终端设备"或"路由器"。

    此致、
    Ryan

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

    我选择"SampleTempratureSensor-EndDeviceEB"。 哪个文件关于射频通信?

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

    没有用于射频通信的单个文件。  您可以查看 Z-Stack 3.0.2\Documents\Z-Stack 3.0 Developer's Guide.pdf 以进一步了解 ZCL、APS、BDB、NWK 和 MAC 层。  通常、ZCL 命令将导致 AF_DataRequest、其最终调用 APSDE_DataReq 。  预先构建的 Zigbee 库中包含此函数、用户无法访问、但它将生成必要的无线电命令来控制 IEEE MAC/PHY。

    此致、
    Ryan

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

    我不明白 TI 的支持系统是怎么样的
    我只是想要几页的文档,但所有的答案都是'读一本书'。

    我使用 CC2530F256板。 面积为2厘米*2厘米。 大约需要10美元。
    我只使用了两个函数:ADC 和 RF。 我认为这是一个非常简单和小巧的功能。
    将值放入一些设置寄存器、并将值放入数据传输寄存器。 非常简单。
    但是、ZStack 3.0适用于具有 CC2538EM 的 SmartRF06EB 电路板。 不是 CC2530F256板。 它具有很多功能。
    我是否需要阅读94页 SmartRF06EB 板文档以获取 ADC 和射频源?

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

    您是否需要 Zigbee 协议或基本的射频通信?  确定您应参考的软件资源和文档。  任一器件都包含可用作基础的 ADC 功能。  Z-Stack 3.0包含 CC2530资源。  您无需研究  SmartRF06EB 板。

    此致、
    Ryan

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

    我正在尝试将 ADC 读取从几个 CC2530无线传输到一个 CC2530。

    我是否必须学习  Z-Stack 3.0 Developer's Guide.pdf?

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

    那么这将构成一个网络、因此基本射频可能不适用。  在 有可能引起进一步混淆的情况下、SimpliciTI 或 TIMAC 星形网络也是可能的。

    请注意、CC2530是一款具有较旧软件资源的旧器件。  为获得升级的用户体验、我推荐使用 SimpleLink CC13XX/CC26XX F2 SDK的 CC26XX 器件。

    此致、
    Ryan

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

    我选择 TIMAC 1.5.2.432999\Projects\Mac\Sample\CC2530\IAR Project\Mac_CC2530.eww

    Normal-FFD (协调器)、Normal-RFD (EndDevice)、

    关于 PAN ID 设置、数据传输、数据接收的文件有哪些?

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

    Application/msa.h 文件包含许多用户定义、例如 PAN ID、短地址、数据包长度等  然后 MSA.c 包含应用逻辑、使用 MSA_McpsDataREQ 进行数据传输以及通过 MAC_MCPS_DATA_IND 回调事件进行数据接收。

    此致、
    Ryan

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

    非常感谢。

    我将首先学习 msa.c

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

    我在 Timac 中找到了循环的来源。  osal.c.中的 OSAL_RUN_SYSTEM()

    我可以在那里添加源吗?

    我的来源如下。

    P1DIR |= 0x03;
    P1_0 = 0;
    P1_1 = 1;
    halSleepWait(500);
    P1_0 = 1;
    P1_1 = 0;
    halSleepWait(500);
    uint16 adcvalue=0;
    adcvalue=HalAdcRead (HAL_ADC_channel_0、HAL_ADC_Resolution_10);
    MSA_Data=adcvalue//必须转换以适应格式
    MSA_McpsDataReq (MSA_Data、MSA_ECHO_LENGTH、TRUE、MSA_CoordShortAddr);

    如果我错了、如何调用 MSA_ProcessEvent ()来传输 ADC 数据?

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

    正式方法是创建一个新的计时器和事件、从 MSA_ProcessEvent 内定期执行您的代码 。  以 MSA_POLL_EVENT 为例。

    此致、
    Ryan

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

    射频通信不是一个特殊情况的示例。 这是一种很常见的情况。
    为什么不提供 MSA_ProcessEvent ()中射频通信的示例代码?

    我已经阅读了 Timac 上的所有文档,但我找不到像你的答案这样的方法,所以我不知道还有什么可以做的。
    我并不是要求您编写我的代码。
    请提供一个在 TIMAC 上正确运行的典型、通用、标准 RF 的源代码示例。然后我就能了解 Timac 过程了。

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

    尊敬的 Edan:

    我已从您之前的 E2E 回复中删除了一些评论、根据 E2E 发布指南、这些评论既不友好、也不专业。  请不要在以后再作进一步的发言。

    很抱歉您很难掌握所提供的示例代码。  MSA 示例的完整文档(包括开箱即用用法和  用于 进一步应用扩展的 MSA_ProcessEvent 和 MSA_McpsDataReq 例程说明)在 TIMAC 1.5.2.432999\Documents\Mac 示例应用-软件 Design.pdf 中提供

     在  MSA_ProcessEvent 中已经存在直接使用 MSA_McpsDataReq 的实例、例如用于数据包接收回波的 MAC_MCPS_DATA_IND 情况。  我之前的消息的目的是共用一个方法来创建一个定期定时器、此定时器将定期执行您感兴趣的代码。  TI 提供了基线示例代码、开发人员可以在其中进一步实现自己的功能、E2E 是一种让经验丰富的工程师与社区互动、回答问题并帮助指导 开发过程的方式。

    此致、
    Ryan

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

    好的、对不起、我不知道发布指南。 我会阅读并遵循。
    我已经阅读了所有文档。 当然,我也阅读了 Mac 示例应用程序- Software Design.pdf。

    Mac 示例应用程序- Software Design.pdf 是对函数的描述、而不是将函数组合使用的示例
    我需要介绍一下基本功能 组合的示例。

    总结到目前为止的答案、似乎射频通信需要创建一个执行 MSA_SEND_EVENT 的计时器。

    我需要的是包含这些内容的单页 main.c 文件。
    在部分示例中包含大量不必要的源代码、但我找不到任何使用每个基本功能(ADC、RF、DIO 等)的示例。


    1)我正在尝试开发只有 CC2530 + aNNTENA 的电路板、而不使用 SMARTRF06EBK 等评估板。
       TIMAC 示例的 MSA_CC2530工程是否可以使 CC2530之间的射频通信不是评估板

    2)我把下面一行放在 osalInitTasks()的最后一行
      OSAL_start_timerEx (taskID、msa_send_event、msa_wait_period);
      这和您说的是一样吗?
      我在 MSA_ProcessEvent ()中的"if (events & MSA_SEND_EVENT )"上设置了断点。
      但断点设置被禁用、因此我无法检查我的编码是否正确。

    感谢您的继续回复。
    我对一般性的回答而不是直接的解决方案感到沮丧。
    我很抱歉。
    如果我在这项发展中取得成功,这将是因为你的帮助。

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

    1)外设修改由 hal_board_cfg.h 和 TIMAC 1.5.2.43299\Components\hal\target\CC2530EB 中包含的其他 HAL 文件(例如 hal_led.c 和 hal_key.c)控制。  无线电配置由  TIMAC 1.5.2.43299\Components\mac\low_level\srf04\single_chip 中的 mac_radio_defs.c/mac_rffrontend.c 确定。  您将需要根据定制硬件的需求更改这些文件。

    2) 此 API 应位于应用文件 msa.c 中、可能是在器件加入协调器 PAN 并准备好进行通信后发生的 MAC_MLME_ASSIGNED_CNF (适用于终端器件 RFD)。   在此上下文中可以使用 MSA_TaskId 而不是 taskID。  确保 IAR 调试器选项选择"TI XDS"而不是"Simulator"、并且确保在进入调试会话之前使用应用程序代码对器件进行编程。

    此致、
    Ryan

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

    1)我将下面的行添加到 osalInitTasks()和 MSA_ProcessEvent()的最后一行。
    OSAL_start_timerEx (MSA_TaskId、MSA_send_event、1000);
    因此、循环运行正常、但时间间隔不是1000ms。
    我尝试以各种方式更改时间数、但实际时间始终约为10ms。

    2)我确认数据正在通过 MSA_ProcessEvent ()的 MSA_McpsDataReq ()传输。
    但是、无法知道数据接收位置。
    即使您提到了 MAC_MCPS_DATA_IND、MSA_McpsDataReq ()也将被发送、而不是被接收。

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

    1) 1)您如何测量"实际"时间?  您的 IAR 版本是什么?  请注意、不应使用调试器来评估两个事件之间的时间、因为连接会极大地干扰时序。

    2)正确、MAC_MCPS_DATA_IND 用于接收传入的应用数据包。  可以使用 MAC_MCPS_DATA_CNF 确认上次传输已完成、 而 pData->dataCnf.hdr.status == MAC_SUCCESS 意味着从远程设备接收到 MAC ACK (因为状态不是 MAC_NO_ACK 或任何其他故障状态)。  如果希望远程器件发出应用确认、请参阅 MAC_MSPS_DATA_IND 内的"IF (!MSA_IsCoordinator)"语句、终端器件可以在接收到应用数据包时将回显消息发送回协调器。  此回波数据包将在本地协调器侧  MAC_MSPS_DATA_IND 中接收。

    此致、
    Ryan

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

    1) IAR EW8051 10.40.1
      我将一个 LED 连接到了 CC2530板上。
      在  MSA_PROCESSEVENT ()开始时 LED 亮起
       MSA_PROCESSEVENT ()结束时 LED 熄灭
     和计时器在 MSA_PROCESSEVENT ()结束时
     因此、第一个 LED 亮起~下一个 LED 亮起是计时器的间隔。

    2)下面是  MSA_PROCESSEVENT ()的 MAC_MCPS_DATA_IND
      哪个变量具有接收到的数据?

    案例 MAC_MCPS_DATA_IND:
    pData =(macCbackEvent_t*) pMsg;

    if (MSA_DataCheck (pData->dataInd.MSDU.p、pData->dataInd.MSDU.len))

    //HalLedSet (HAL_LED_3、HAL_LED_MODE_TOGGLE);

    /*只有在接收到的*/时才发回回声
    if (!MSA_IsCoordinator)

    如果(msa_echo_length >= 4)

    /*返回接收到的数据包的前4个字节和最后一个字节*/
    MSA_Data2[0]= pData->dataInd.MSDU.p[0];
    MSA_Data2[1]= pData->dataInd.MSDU.p[1];
    MSA_Data2[2]= pData->dataInd.MSDU.p[2];
    MSA_Data2[3]= pData->dataInd.MSDU.p[3];
    }

    MSA_McpsDataReq (MSA_Data2、
    msa_echo_length、
    正确、
    MSA_CoordShortAddr );
    }

    #if defined (NV_RESTORE)&& defined (FEATURE_MAC_SECURITY)
    /*传入数据包*/
    for (I = 0;I < MAX_DEVICE_TABLE_ENTRIES;I++)

    if (msa_deviceTable[i].shortAddress == pData->dataInd.Mac.srcAddr.addr.shortAddr)

    msa_deviceTable[i].frameCounter[0]++;
    }
    if (((msa_deviceTable[i].frameCounter[0]% 1000)=0)

    OSAL_NV_WRITE (MAC_NV_DEVICE_TABLE、0、sizeof (MSA_deviceTable)、&MSA_deviceTable);
    }
    }
    #endif
    }
    休息;
    }

    /*取消分配*/
    mac_msg_deallocate ((uint8**)&pMsg);

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

    1) 1)您不应 直接添加到 MSA_ProcessEvent、因为 此例程  会从各种事件源(SYS_EVENT_MSG、MSA_POLL_EVENT、MSA_SEND_EVENT)循环、因此会导致 LED 不断切换。  使用的示例是 MSA_POLL_EVENT、该事件会在 MAC_MLME_ASSIGNED_CNF 期间以及每次 为 MSA_POLL_EVENT 事件提供服务之后启动一次。

    2) pData->dataInd.MSDU.p (这是一个指针)

    E2E 论坛提示:插入->代码

    此致、
    Ryan

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

    通过从终端设备到协调器的计时器设置、RF 通信运行良好。
    感谢您的帮助。

    1)协调器接收从多个终端设备发送的数据。 如何区分发送了哪个终端设备?
    如何读取设备的 IEEE ID?
    2) 2)您之前的回复"E2E 论坛提示:插入->代码"是什么意思?

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

    1) 您可以使用 pData->dataInd.Mac.srcAddr.addr 来获取发送设备的唯一地址、该地址可以作为您的 ID 使用。   

    2)  

    此致、
    Ryan

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

    我按如下源发送了地址、但接收到的 数据重复发生变化。

            msa_Data1[12]=HI_UINT16(pData->dataInd.mac.srcAddr.addr.shortAddr);        
            msa_Data1[13]=LO_UINT16(pData->dataInd.mac.srcAddr.addr.shortAddr);

    但是、以下 源接收到的值与 SmartRF 闪存程序的 IEEE ID 相同。

            //00 12 4B 00 13 8C B0 0C
            msa_Data1[12]=msa_ExtAddr[7];//00
            msa_Data1[13]=msa_ExtAddr[6];//12
            msa_Data1[14]=msa_ExtAddr[5];//4B
            msa_Data1[15]=msa_ExtAddr[4];//00
            msa_Data1[16]=msa_ExtAddr[3];//13
            msa_Data1[17]=msa_ExtAddr[2];//8C
            msa_Data1[18]=msa_ExtAddr[1];//B0
            msa_Data1[19]=msa_ExtAddr[0];//0C


    我想使用 printf ()、因此将#include "DebugTrace.h"添加到 MSA.c 中
    我在 MSA_ProcessEvent ()的开头写了 printf ("test\n")。

    没有编译错误、但工具输出窗口中没有任何内容。

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

    短地址可能是由协调器在调试期间分配的、因此是动态的、但对于本地终端设备而言、扩展地址是静态的。  无论您需要什么、都可以。

    我不确定 printf 对 TIMAC 的支持、但 DebugTrace.h 位于 MT 文件夹内、该文件夹通过 UART 等串行连接获得支持。  需要对您的终端进行进一步调查。  我建议您考虑启用 hal_uart.c/h 并使用 HalUARTWrite。

    此致、
    Ryan

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

    我想问一下 ADC 返回值。

    uint16 adcvalue=0;
    adcvalue=HalAdcRead (HAL_ADC_channel_4、HAL_ADC_Resolution_12);

    对 P0.4 (ADC4)施加3.3V 电压。
    我希望获得0xFFF (12位)、但返回值是 0x7FF。

    hal_adc.c:从以下函数返回的所有变量都是 unit16。

    uint16 HalAdcRead (uint8 channel, uint8 resolution)
    {
      uint16  reading = 0;
    
    #if (HAL_ADC == TRUE)
      uint8   i, resbits;
      uint8  adcChannel = 1;
    
      /*
       * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.  The code
       * does NOT disable the pin at the end of this function.  I think it is better to leave the pin
       * enabled because the results will be more accurate.  Because of the inherent capacitance on the
       * pin, it takes time for the voltage on the pin to charge up to its steady-state level.  If
       * HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage
       * than actuality because the pin did not have time to fully charge.
       */
      if (channel < 8)
      {
        for (i=0; i < channel; i++)
        {
          adcChannel <<= 1;
        }
      }
    
      /* Enable channel */
      ADCCFG |= adcChannel;
    
      /* Convert resolution to decimation rate */
      switch (resolution)
      {
        case HAL_ADC_RESOLUTION_8:
          resbits = HAL_ADC_DEC_064;
          break;
        case HAL_ADC_RESOLUTION_10:
          resbits = HAL_ADC_DEC_128;
          break;
        case HAL_ADC_RESOLUTION_12:
          resbits = HAL_ADC_DEC_256;
          break;
        case HAL_ADC_RESOLUTION_14:
        default:
          resbits = HAL_ADC_DEC_512;
          break;
      }
    
      /* writing to this register starts the extra conversion */
      ADCCON3 = channel | resbits | adcRef;
    
      /* Wait for the conversion to be done */
      while (!(ADCCON1 & HAL_ADC_EOC));
    
      /* Disable channel after done conversion */
      ADCCFG &= (adcChannel ^ 0xFF);
    
      /* Read the result */
      reading = (uint16) (ADCL);
      reading |= (uint16) (ADCH << 8);
    
      /* Treat small negative as 0 */
      if (reading < 0)
        reading = 0;
    
      switch (resolution)
      {
        case HAL_ADC_RESOLUTION_8:
          reading >>= 8;
          break;
        case HAL_ADC_RESOLUTION_10:
          reading >>= 6;
          break;
        case HAL_ADC_RESOLUTION_12:
          reading >>= 4;
          break;
        case HAL_ADC_RESOLUTION_14:
        default:
          reading >>= 2;
        break;
      }
    #else
      // unused arguments
      (void) channel;
      (void) resolution;
    #endif
    
      return reading;
    }

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

    您好!

    你对 adcRef 有什么价值?

    谢谢!
    Toby

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

    我没有根据 TIMAC 更改它、它是 HAL_ADC_REF_AVDD .

    #define HAL_ADC_REF_AVDD          0x80    /* AVDD_SOC Pin Reference */
    #define HAL_ADC_REF_VOLT    HAL_ADC_REF_AVDD
    
    void HalAdcInit (void)
    {
    #if (HAL_ADC == TRUE)
      adcRef = HAL_ADC_REF_VOLT;
    #endif
    }

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

    尊敬的 Edan:

    此结果应确认您正在以12位分辨率的二进制补码形式读取 ADC。  从 CC253x/4x 用户指南的第12.2.5章

    数字转换结果以二进制补码形式表示。 对于单端配置、结果预计为正。 这是因为结果是输入信号与接地之间的差值、它始终具有正符号(Vconv = Vinp–Vinn、其中 Vinn = 0V)。 当输入信号等于所选电压基准 VREF 时、将达到最大值。 对于差分配置、会对两个引脚之间的差值进行转换、该差值可能会带负符号。 例如、当抽取率为512且仅使用数字转换结果寄存器的12个 MSB 时、当模拟输入(Vconv)等于 VREF 时、将达到2047的最大值、当模拟输入等于–VREF 时、将达到–2048的最小值。

    此致、
    Ryan

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

    感谢您的答复。

    根据您的答案、单端输入的值为0~4096、差分输入的值为-2048~2047。
    以下是 CC253x/4x 用户指南:

         单端输入 AIN0至 AIN7由通道编号0至7表示。
          通道编号8到11表示由 AIN0–AIN1、AIN2–AIN3、AIN4–AIN5和 AIN6–AIN7组成的差分输入。

    ADC 读数函数是 hal_adc.c 中的 uint16 HalAdcRead (uint8通道、uint8分辨率) 。
    我使用了 HAL_ADC_CHn_AIN4或 HAL_ADC_CHANNEL_4作为通道 参数
    这些是   hal_adc.h 中的单端通道、而不是 差分通道。
    差分通道为 HAL_ADC_CHn_A0A1、HAL_ADC_CHn_A1A2、等等。

    因此、我使用了单端通道、其最大值应为4095 (0xFFF)。
    如果你能让我知道我是什么误解,我会很感激。

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

    我会认为 ADC 转换结果是二进制补码、与单端或差分端配置无关。  在单端的情况下、可能的负值直接归零。  这里还有一些其他的资源 https://e2e.ti.com/f/1/t/899145 

    此致、
    Ryan

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

    那么、是否无法利用 CC2530的 ADC 接收0xFFF 值?

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

    我目前不知道有一个。

    此致、
    Ryan

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

    1) 1) 当接收到来自15.4网络中关联器件的传入无线 IEEE 数据包时、调用 MAC_MCPS_DATA_IND。
    2) 2)  MSA_HandleKeys 内部的 HAL_KEY_SW_1条件为协调器建立了必要的启动过程。  因此可以在密钥句柄的上下文之外使用此代码。

        /* Start the device as a direct message device and beacon disabled*/
        if (!msa_IsStarted)
        {
          /* Read IEEE Address from Info Page */
          MAC_READ_CHIP_IEEE_ADDR(msa_ExtAddr);
          
          /* Decide if direct or indirect messaging is used */
          msa_IsDirectMsg = MSA_DIRECT_MSG_ENABLED;
    
          if (msa_IsDirectMsg)
          {
            /* Start the device as an DIRECT messaging device */
            if (msa_BeaconOrder != 15)
              MSA_ScanReq(MAC_SCAN_PASSIVE, MSA_MAC_BEACON_ORDER + 1);
            else
              MSA_ScanReq(MAC_SCAN_ACTIVE, 3);
          }
          else
          {
             /* Start the device as an INDIRECT messaging device and beacon disabled */
             /* Beacon network doesn't work with polling */
             if (!msa_IsStarted)
             {
               msa_IsDirectMsg = FALSE;
               MSA_ScanReq(MAC_SCAN_ACTIVE, 3);
             }
          }
        }

    此致、
    Ryan

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

    非常感谢
    我将测试上述源、而不是 SW1按钮。

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

    感谢您的帮助、我的项目进展顺利。
    我使用设计手册 DN112的源代码创建了 UART0中断 RX 模式。
    通过以下来源接收数据。(字母字符串数据)
    我可以通过 MSA_ProcessEvent ()中的 MSA_SEND_EVENT 每秒检查接收到的数据

        if(uartRxBuffer[0]!=0x0){
          isRequest=TRUE;
          send_uart(uartRxBuffer[1]);//send to UART0
          send_uart(uartRxBuffer[2]);
          send_uart(uartRxBuffer[3]);
          send_uart(uartRxBuffer[4]);
          uartRxBuffer[0]=0x0;
        }


    但是、即使发送 一次 UART0并等待超过10秒、
    它在 Rx 缓冲区中经常丢失。 如果传输的数据少于5位、则尤其如此。
    您能帮助解决这个问题吗?

    #define SIZE_OF_UART_RX_BUFFER 10
    unsigned short __xdata uartRxBuffer[SIZE_OF_UART_RX_BUFFER];
    unsigned short __xdata uartRxIndex;
    _Pragma("vector=0x13") __near_func __interrupt void UART0_RX_ISR(void);
    _Pragma("vector=0x13") __near_func __interrupt void UART0_RX_ISR(void){
      URX0IF = 0; //UART0 RX Interrupt clear
      uartRxBuffer[uartRxIndex++] = U0DBUF;
      if (uartRxIndex >= SIZE_OF_UART_RX_BUFFER) {
        uartRxIndex = 0; 
        //IEN0 &= ~0x04;//uart0 interrupt disable
      }
    }

    void initUART(void) //sets all configurations in UART
    {
        CLKCONCMD = CLKCONSTA & 0xB8; //clock control
        while(CLKCONSTA & 0x40);
        
        PERCFG&=~0x03;//Alernative 1 selected for UART0 and UART1
        P0SEL |= 0x3C;//P0.2 and P0.3(UART0)/ P0.4 and P0.5 (UART1)
        
        U0UCR |= 0x00; //H/w flow control disabled
        U0CSR |= 0x80;//SPI:0,UART1
        U0CSR |= 0x40;//polling:0,interrupt:1
        IEN0 |= 0x84; //UART0 RX Interrupt EA=1; URX1IE=1
        
        URX0IF = 0; //UART0 RX Interrupt clear
        U0GCR |= 0x08;
        U0BAUD = 0x3b; //Baud rate set to 9600 bps
    
        U1CSR |= 0x80;
        U1UCR |= 0x00; //H/w flow control disabled
        U1GCR |= 0x08;
        U1BAUD = 0x3b; //Baud rate set to 9600 bps
    }

    和 hal_board_cfg.h

      #if HAL_UART
        /*#ifndef HAL_UART_DMA
          #if HAL_DMA
            #if (defined ZAPP_P2) || (defined ZTOOL_P2)
              #define HAL_UART_DMA  2
            #else
              #define HAL_UART_DMA  1
            #endif
          #else
            #define HAL_UART_DMA  0
          #endif
        #endif*/
    
        #ifndef HAL_UART_ISR
          #if HAL_UART_DMA           // Default preference for DMA over ISR.
            #define HAL_UART_ISR  0
          #elif (defined ZAPP_P2) || (defined ZTOOL_P2)
            #define HAL_UART_ISR  2
          #else
            #define HAL_UART_ISR  1
          #endif
        #endif
    
        #if (HAL_UART_DMA && (HAL_UART_DMA == HAL_UART_ISR))
          #error HAL_UART_DMA & HAL_UART_ISR must be different.
        #endif
    
        // Used to set P2 priority - USART0 over USART1 if both are defined.
        #if ((HAL_UART_DMA == 1) || (HAL_UART_ISR == 1))
          #define HAL_UART_PRIPO             0x00
        #else
          #define HAL_UART_PRIPO             0x40
        #endif
      #else
        #define HAL_UART_DMA  0
        #define HAL_UART_ISR  0
      #endif
      /* USB is not used for CC2530 configuration */
      #define HAL_UART_USB  0   
     
    #endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但是、即使发送到 UART0 一次且等待时间超过10秒、
    经常在 Rx 缓冲区中丢失该信息

    您是 RFD 还是 FFD 节点类型?  由于 RFD 可能会进入功率模式2 (睡眠)、因此在该模式下禁用 UART 接收。

    如果传输的数据少于5位、则尤其如此

    您可以尝试向此器件发送更长的填充数据、使其达到您确信将收到的长度、或者如果您不计划接收任何可解释的数据、而只是希望收到有关何时执行操作的通知、则可以将 UART RX 引脚配置为 GPIO 输入(在睡眠模式下启用)。

    此致、
    Ryan

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

    这是 FFD。
    如果出现特殊字符(如"\n")、我设置 URX0IF = 1 (RX 完成)
    但用处不大。
    如何设置 RX 完成标志?

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

    我需要说明一点、我不熟悉 DN112 解决方案。  我建议改用 hal_uart.c API、并在可能的情况下 根据您的设计需求修改 HalUARTPollIsr。

    此致、
    Ryan

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

    此论坛包含 CC2530的 ADC、UART、RF 技术、因此无需阅读其他论坛。
    现在问题是 CC2530的 i2c。

    我使用 RemoTI-CC253xDK-1.2.1中的 I2C 驱动程序

    <hal_i2c.h>
    //P1.6 for SDA and P1.7 for SCL.
    #ifndef OCM_CLK_PORT
      #define OCM_CLK_PORT  1
    #endif
    
    #ifndef OCM_DATA_PORT
      #define OCM_DATA_PORT   1
    #endif
    
    #ifndef OCM_CLK_PIN
      #define OCM_CLK_PIN   7
    #endif
    
    #ifndef OCM_DATA_PIN
      #define OCM_DATA_PIN    6
    #endif
    
    <ms_main.c>
    int main(void){
      HalI2CInit();
      uint8 senddata=0xFF;
      int8 status=HalI2CSend(0xA0, &senddata, 1);  
      uint8 readdata=0x99; // change after reading  
      if(status==0){
        status=HalI2CReceive(0xA0, &readdata, 1);  
        if(status==0)
          send_uart(readdata);
      }
    }

    hal_i2c.c 和 hal_i2c.h 中的其他编码未更改。
    我将 P1.6用于 SDA、将 P1.7用于 SCL。 (具有上拉电阻)。
    根据上面的源代码、返回状态值全为0、正常。
    但 
    读取的数据始终为00。 我需要0xFF。

    i2c 从器件是 EEPROM (AT24c64)板。
    我使用 Arduino 测试了相同的 EEPROM 板。
    EEPROM 板可以很好地进行读取和写入。

    您是否有在 CC2530上使用 i2c 的经验?

    e2e.ti.com/.../hal_5F00_i2c.zip

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

    我在 CC2530上使用 I2C 没有任何经验。  由于 CC2530上没有专用的 I2C 外设硬件、因此介绍的解决方案是位拆裂软件实现。  您应确认您的代码未在别处使用 P1.6和 P1.7、并 使用示波器或逻辑分析仪实际监控 SCL 和 SDA 线路、以确认它们是否按预期受到控制。  您还应该将这些读数与 Arduino 解决方案进行比较、以发现差异。  您应仔细检查硬件、确保正确连接各线并正确分配 EEPROM 地址。  为什么您希望在发送0xFF 后返回0xAB?  您是否应该使用 HALI2CMreceive 地址0xA1读取值?  

    此致、
    Ryan

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

    0xAB 表示出错、我期望是0xFF。

    当然、它在 HalI2CMreceive (地址、缓冲区、长度)中使用地址+ 1。

    A2、A1、A0全部为0。 并且 R=1、W=0

    因此、写入地址为0xA0、读取地址为0xA1

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

    由于 hali2cReceivive -> hali2cSendDeviceAddress 不会强制地址的最后一位为高电平、至少在附加的版本中是如此、因此您需要在代码中考虑这一点、并遵循我的其他建议。

    此致、
    Ryan

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

    我修改至   
    Status=HalI2CMreceive (0xA1、&ReadData、1);
    因此、它变为 hali2cReceivive (0xA1)-> hali2cSendDeviceAddress (0xA1)。
    但结果是相同的。

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

    由于您不熟悉正在使用的 I2C 库、因此这里重点说明了为什么您需要使用逻辑分析仪或示波器来实际监控引脚。

    此致、
    Ryan

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

    是的、您说得对。 谢谢你。
    这是接线错误。 因此、RemoTI-CC253xDK-1.2.1的 I2C 驱动器均运行良好。 我已经附加了 I2C 文件。
    尽管 CC2530没有 I2C 功能、但已证明 I2C 可以使用下面的文件。
    对其进行了细微修改、以适应 EEPROM (AT24c64) 协议。

      HalI2CInit();
      uint8 senddata[3]={0xAB,0x78,0x01};
      status=HalI2CSend(0xA0, senddata, 3);  
      uint8 readdata[3]={0}; // Buffer to store read data  
      status=HalI2CReceive(0xA0, readdata, 3);  

    e2e.ti.com/.../5556.hal_5F00_i2c.zip

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

    1)如果在终端设备已打开时协调员打开、

    终端设备无法从协调器接收射频数据。
    但是、协调器通常从终端设备接收射频数据。
    我看到协调器 使用数据包监听器将射频数据传输到终端设备。
    此时、关闭并开启终端设备、然后终端设备接收射频数据。
    如何通过软件重新启动终端设备?

    2)相反,协调器首先开启。 然后终端设备通电。

    在协调器发送射频数据0xff 时间后运行正常。
    因此终端设备接收数据太晚。
    对于下面的序列编号、测试结果始终相同。
    First 0~ff:不起作用
    下一个0:不起作用
    下一个1:它从 这里运行良好

    以上序列存在于 MSA_PROCESSOR_EVENT 中。

        if (msa_IsCoordinator)
        {
            if (MSA_PACKET_LENGTH >= MSA_HEADER_LENGTH)
            {          
              //Coordinator sending to devices. Use the associated list of device to send out msg 
              msa_Data1[0] = MSA_PACKET_LENGTH;
              msa_Data1[1] = HI_UINT16(msa_DeviceRecord[index].devShortAddr);
              msa_Data1[2] = LO_UINT16(msa_DeviceRecord[index].devShortAddr);
              msa_Data1[3] = sequence;
            }
    
            MSA_McpsDataReq((uint8*)msa_Data1,
                            MSA_PACKET_LENGTH,
                            msa_DeviceRecord[index].isDirectMsg,
                            msa_DeviceRecord[index].devShortAddr );
        }