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.

[参考译文] RF430FRL152HEVM:ADC0值访问

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1402603/rf430frl152hevm-adc0-value-access

器件型号:RF430FRL152HEVM
主题中讨论的其他器件:RF430FRL152HMSP430G2553、、 TRF7970A

工具与软件:

你(们)好  

我在 RF430FRLHEVM 上成功构建了 RF430FRL152H 传感器集线器项目、但无法访问 ADC0值。 我还需要从通过 I2C 进行通信的数字传感器读取数据。 我使用 Digikey 的开源代码(链接见下方)成功检索 ADC0值、但现在我正在寻找一种方法、以实现数字传感器的相同目标。


Digikey 代码(forum.digikey.com/.../12928)

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

    https://forum.digikey.com/t/getting-started-with-the-ti-rf430frl152hevm/12928

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

    您好!

       为了运行传感器集线器演示、请按照 RF430FRL152HEVM 用户指南中的第5节了解跳线配置。  要运行演示、您需要:

     -按照用户指南中的说明更改 EVM 上的跳线设置。

     -更新 RF430FRL152H 的固件。 固件可以从 https://www.ti.com/tool/download/SLAC691/01.00.00.0F 下载。该 CCS 项目名为 RF430FRL152H_Sensor平高 Hub_Project。  

    -按照用户指南中的说明下载 PC 端的 GUI 应用程序。  

    -您还需要 TRF7970ABP + MSP430G2553、这是设置此演示的阅读器。

    -读卡器上运行的固件(TRF7970ABP + MSP430G2553)将检索传感器集线器测量值并通过 GUI 显示屏显示。 如果您没有  TRF7970ABP + MSP430G2553、而是使用了不同的 MCU、则可以参考固件并将其移植到 MCU 主机。 针对读取器的固件可从 MSP430G2 LaunchPad TRF7970A BoosterPack 主机控制二进制文件中下载

     此应用手册《 适用于 MSP430微控制器的 RF430FRL152H NFC 传感器标签应用示例 》也将非常有用。  

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

    您好、Charles  

    感谢您的答复。 现在我不再关注 NFC 通信。 我需要的是在 CCS 调试窗口中以表达式的形式查看数字传感器的读数。 作为参考、Digikey 的开源代码显示了如何将转换后的 ADC0值以 mV 为单位保存为表达式、我的目标是为数字传感器执行类似的操作。

    非常感谢您的帮助。

    void main()
    {
    	WDTCTL = WDTPW + WDTHOLD;                   // Stop watchdog
    
        // ROM RF13M module setup ** The following three lines are needed for proper RF stack operation
        DS = 1; 									// ROM variable needs to be initialized here
        asm ( " CALL #0x5CDA "); 					// Call ROM function ( Initialize function pointers)
        asm ( " CALL #0x5CAC "); 					// Call ROM function ( Check part configuration)
    
    
    	initISO15693(CLEAR_BLOCK_LOCKS);
    	DeviceInit();
    
    	SD14CTL0 = SD14EN + VIRTGND;
    	SD14CTL1 = SD14UNI + SD14INTDLY0;
    
    
    		while(1)
    		{
    
    			SD14CTL0 |= SD14SC;
    
    			__delay_cycles(100);
    
    			ADC_Value= SD14MEM0;
    
    
    		ADC_Volts = ((ADC_Value >>8) *900)/(16383 >> 8);
    
    			//Enter Low Power mode
    			//__bis_SR_register(LPM3_bits + GIE);
    		}
    }
    

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

    传感器集线器上的传感器只能通过 I2C 接口检索。 如果您已经下载了 https://www.ti.com/tool/download/SLAC691/01.00.00.0F、 您将找到  RF430FRL152H_SensC2 Hub_Project。 在项目中,请参考 DigitalSensorMeasurement ()函数。 例如、 要读取传感器集线器上的 SHT21温度传感器、 DigitalSensorMeasurement ()将调用 SHT_21_I2C_SHT_TEMP Master_Measurement (TEMP_MEASE_HOLD_MASTER、TEMP_DATA)来读取温度传感器。 若要读取湿度传感器、该函数将调用 SHT_21_I2C_湿度 传感器 Master_Measurement (HUMIDITY_HOLD_measurement、temp_data)。 在 SHT_21_I2C_I2C()函数内、它将发送 Master_Measurement 命令来检索相应的传感器测量值。 有关详细信息、请参阅源代码。  

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

    谢谢查尔斯。 我已尝试执行以下步骤、希望您可以帮助我解决此问题:

    1) 1) Sensor_HUB 项目无法进行调试、因为它缺少主函数(请参阅随附的第1个屏幕截图以供参考)。


    2)我尝试定义 counter1和 counter2来监控其值并验证代码是否连续读取传感器数据。 但是我无法检索这些值、因为暂停和恢复选项不可用(调试模式未激活。 )(请参阅 随附的第二个屏幕截图以供参考)。


    3) 3) 我找到一个 线程 (附加了链接)、建议将0x39写入内存地址0xF87D 以修复调试问题、但它无效(请参阅随附的第三个屏幕截图以供参考)。 虽然我现在可以使用暂停和恢复选项、但调试过程仍然存在缺陷。 这两个计数器保持不变(请参阅"Expressions"窗口)、这表明它们在初始化期间可能设置为恒定随机值。

    第一个屏幕截图

    第二个 屏幕截图

    第三个 屏幕截图

    主题

    https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/594614/ccs-rf430frl152h-debugging-152h-sensorhub-example-with-ccs-6-2-0-and-msp-fet 

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

    我认为您需要阅读 RF430FRL152H 固件用户指南。 第6.3节"读取外部数字传感器"。 RF430FRL152H 的固件已存储在 ROM 中。 但是、ROM 固件不会处理读取传感器集线器上的外部传感器。 您需要添加自定义代码来读取这些传感器。 这就是我向您推荐  https://www.ti.com/tool/download/SLAC691/01.00.00.0F 的原因、  RF430FRL152H_SensC2 Hub_Project。 您是否阅读了源代码中的注释? 请参阅以下注释、以及 SHT_21_I2C_EVM 等函数 Master_Measurement 以及相关的链接器命令文件。 ROM 固件将调用您的自定义函数(如 SHT_21_I2C_I2C)、以便从传感器集线器通过 Master_Measurement 接口读取温度传感器。 主函数位于 ROM 固件中。  

    */./....
    *码空间
    (二
    *请检查 lnk_rf430frl152h_Driver.cmd 用于自定义用于日志记录的代码空间大小("FRAM")的文件
    *或表示代码("driver_code")。
    *对于每个新函数,请在函数前使用以下行,将代码放在正确的部分:
    *#pragma CODE_SECTION (MyFunction、" .fram_driver_code ")//同时将 MyFunction 更改为函数名称
    (二 /

    #pragma CODE_SECTION (SHT_21_I2C_Master_Measurement, ".fram_driver_code") //see .cmd file for details - all new firmware must go into fram_driver_code memory section space
    void SHT_21_I2C_Master_Measurement(u08_t command, u08_t * rxData)
    {
    UCB0CTL1 |= UCSWRST; // Software reset enabled
    UCB0I2CSA = 0x0040; // I2C slave address of SHT21
    //UCBCTL1 &= ~UCSWRST; // exit eusci reset

    UCB0CTL1 &= ~UCSWRST; // put eUSCI out of reset mode
    UCB0CTLW1 = UCASTP_1;
    UCB0TBCNT = 0x0001;
    UCB0CTL1 |= UCTXSTT + UCTR; // start i2c write operation
    while(!(UCB0IFG & UCTXIFG0)); // wait until transmit is needed
    UCB0TXBUF = command; // send the command
    while(!(UCB0IFG & UCBCNTIFG)); // wait until the stop counter
    UCB0CTL1 &= ~UCTR; // read operation
    UCB0CTL1 |= UCTXSTT; // repeated start
    while(!(UCB0IFG & UCRXIFG0)); // wait until read data available
    rxData[0] = UCB0RXBUF; // read the MSB
    while(!(UCB0IFG & UCRXIFG0)); // wait until more data is available
    rxData[1] = UCB0RXBUF; // read the LSB
    UCB0CTLW0 |= UCTXSTP; // send stop after next byte
    while (!(UCB0IFG & UCRXIFG0)); // wait until more data is available
    //end of while loop

    {
    u08_t crc = UCB0RXBUF; // read the crc, currently not checked
    }
    while (!(UCB0IFG & UCSTPIFG)); // Ensure stop condition got sent
    UCB0CTL1 |= UCSWRST; // put I2C in reset mode

    return;
    }

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

    非常感谢您的答复。

    我使用从 https://www.ti.com/tool/download/SLAC691/01.00.00.0F 下载的 Sensor Hub 项目 (文件附在下面)、 然后创建一个自定义函数来将 ADC0值显示为 ADC_mV 以进行初始调试 、还相应地修改了 cmd 文件、从而成功构建且没有错误(我的目标是首先显示 ADC0值、正如我预期的大约为500mV、从而提供参考点来确定我显示的是正确值还是不正确值、如此处所示)。

    /**************************************************************************************************************************************************
    *   Code Space
    ***************************************************************************************************************************************************
    *  Please check the lnk_rf430frl152h_Driver.cmd file to customize how much code space is used for logging("FRAM")
    *  or for code ("DRIVER_CODE").
    *  Also for each new function, please use the following line before the function, to put the code in the correct section:
    *  #pragma CODE_SECTION (MyFunction, ".fram_driver_code") //also change MyFunction to the function name
    **************************************************************************************************************************************************/
    
    // Custom function to read ADC0 value using the SD14 ADC
    #pragma CODE_SECTION(Custom_ADC0_Read, ".fram_driver_code")
    void Custom_ADC0_Read(void)
    {
        // Initialize SD14 settings
        SD14CTL0 = SD14EN + VIRTGND;         // Enable SD14, use virtual ground
        SD14CTL1 = SD14UNI + SD14INTDLY0;    // Unipolar mode, no delay
    
        // Start conversion
        SD14CTL0 |= SD14SC;
        while (SD14CTL0 & SD14SC);  // Wait for conversion to complete
    
        // Convert the SD14 value to mV
        uint16_t raw_value = SD14MEM0; // Read the raw conversion result
        adc0_mV = ((float)raw_value * 1200) / 16383; // Assuming a reference voltage of 1.2V and 14-bit resolution
    }
    
    /**************************************************************************************************************************************************
    *   DigitalSensorInit
    ***************************************************************************************************************************************************
    

    然后在 DigitalSensorMeasurement 函数中调用该函数、如您所见。

    #pragma RETAIN (DigitalSensorMeasurement)
    #pragma CODE_SECTION (DigitalSensorMeasurement, ".fram_driver_code") //see .cmd file for details - all new firmware must go into fram_driver_code memory section space
    u08_t DigitalSensorMeasurement ()
    {
        u08_t temp_data[2];
        u08_t sensor_sampled = 0;
    
        if (SENSOR_TYPE_MAILBOX == DIGITAL_SENSOR1)
        {
            SHT_21_I2C_Master_Measurement(TEMP_MEASURE_HOLD_MASTER, temp_data);
            RESULT_MAILBOX = (u16_t)temp_data[1] + (((u16_t)(temp_data[0])) << 8);
            sensor_sampled = 1;
        }
        else if(SENSOR_TYPE_MAILBOX == DIGITAL_SENSOR2)
        {
            SHT_21_I2C_Master_Measurement(HUMIDITY_HOLD_MEASUREMENT, temp_data);
            temp_data[1] &= ~HUMIDITY_SENSOR_ID;
            RESULT_MAILBOX = (u16_t)temp_data[1] + (((u16_t)(temp_data[0])) << 8);
            sensor_sampled = 1;
        }
        else if(SENSOR_TYPE_MAILBOX == DIGITAL_SENSOR3)
        {
            temp_data[0] = BIT5;
            temp_data[1] = BIT1;
            ISL29023_I2C_Write(ISL29023_COMMAND_I_REGISTER, temp_data);
            __delay_cycles(220000);
            ISL29023_I2C_Read(ISL29023_DATA_LSB_REGISTER, temp_data);
            RESULT_MAILBOX = (u16_t)temp_data[0] + (((u16_t)(temp_data[1])) << 8);
            temp_data[0] = 0;
            temp_data[1] = 0;
            ISL29023_I2C_Write(ISL29023_COMMAND_I_REGISTER, temp_data);
            sensor_sampled = 1;
        }
    
        Custom_ADC0_Read(); // Call custom function to read ADC0 and store in adc0_mV
    
        return sensor_sampled;
    }
    
    /**************************************************************************************************************************************************
    *   SHT_21_I2C_Master_Measurement
    ***************************************************************************************************************************************************
    

    但在调试过程中、ADC_mV 值看上去不正确、似乎一直保持在31mV (请参见第一个屏幕截图)。 我实施了 Digikey 提供的代码、之前在此主题中共享、它通过用手覆盖传感器、准确反映光传感器的读数、正确显示了暴露在光下时约520mV、光降低时约85mV 的 ADC0值(请参阅 第2和第3屏幕截图)。 您能帮我弄清楚出了什么问题吗?


    附件:

    -传感器中枢项目(压缩文件)

    -传感器集线器修改(main.c)

    - 修改的传感器集线器(lnk_rf430frl152h_Driver.cmd)

    -第一个屏幕截图

    -2nd 截图

    -第3个截图

    谢谢你

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

    我的公司禁止我们访问外部共享网站。 您可以将图像/文件拖动到 e2e 中的编辑窗口中。  

    您从 Digikey 下载的代码禁用 ROM、并 使用您自己的 main()完全从 FRAM 运行您的自定义应用程序。 在该模式下(禁用 ROM)、转换结果保存到地址0x704。  

     由于您的项目基于示例项目  RF430FRL152H_SensC2、因此该项目会从 Hub_Project 中运行固件并跳转到存储在 FRAM 中的自定义函数。 从 ROM 运行时、ADC 结果以及器件的一般配置通过虚拟寄存器完成。  换言之、ADC0的配置通过虚拟寄存器完成。 请参阅固件用户指南。 这意味着 ADC 结果将保存到 FRAM 的块9中。 块0-8是各种虚拟寄存器的存储。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有适用于数字传感器的与 Digikey 示例类似的任何简单代码? [报价]

    传感器集线器的唯一示例是我在网上要求您下载的示例。 我们没有任何其他示例。 您可以使用 Digikey 示例,然后从  RF430FRL152H_Sensocr(RF430FRL152H_Sensoc)中添加数字传感器代码 Hub_Project。 你试过吗?

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

    下面是一些反馈。  

    首先、当您购买 RF430FRL152HEVM 时、它会使用 FRAM 中的代码进行预编程、以支持传感器集线器。 如之前所述、ROM 固件将跳转至 FRAM 中存储的传感器集线器代码。  

    其次、您可以使用从 Digikey 下载的其他示例覆盖 FRAM、这很好。 如果您 再次重新加载 RF430FRL152H_Sensor平高 Hub_Project、它会恢复为最初发运的相同固件。 当我尝试使用 TRF7970A 读取器和 GUI 来访问插入到 RF430FRL152HEVM 顶部的数字传感器 BoosterPack 时、这一点很明显。 请参阅下面的屏幕截图。 您可以看到、这三个数字传感器保存到了各自的位置。

    我还在 EVM 上启用 ADC0 以进行光传感器测量 、该值保存为0xF8B0。  

    要使用库存示例、您需要通过虚拟寄存器启用它们。  

    当然、您可以使用自己的 Digikey 示例实现相同的操作。 我只是不知道实际上它有什么问题。 由于您的示例完全禁用了 ROM、因此无需使用 pragma 指令通过.FRAME_DRIVER_CODE 强制将您的自定义函数指向特定的地址。 您应该能够使用原始的.cmd 文件。 您也不需要 RESULT_MAILBOX。 这是用于在 ROM 和 FRAM 之间交换数据的邮箱。  

    我强烈建议您一次添加一点。 例如、仅进行 ADC0测量。 接下来、修改您的代码、以进行 ADC0测量和一次数字传感器测量。 如果您想要什么、请添加另一个数字传感器。 不要将诸如 ADC0/1/2之类的每项测量结果与三个数字传感器同时放置在传感器集线器上。 您可以节省自己的时间来诊断问题、一次执行一个步骤。  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然而、代码却停留在"while (! (UCB0IFG 和 UCRXIFG0);//等待 RX 缓冲区准备就绪"[/QUOT]

    您能否使用逻辑分析仪或示波器来捕获 I2C 总线上的波形。 这将在调试中提供很大的帮助。 您需要了解是否在总线上提供了正确的命令。 如果您卡在 UCB0IFG 上、这意味着从器件没有回复任何数据。 我注意到的一件事是您使用的从器件地址是0x76。 您写入了 UCB0I2CSA = 0x76;//设置传感器的从地址。 SH21的地址等于0x40。 STOCK 示例也使用0x40作为从器件地址。  

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

    感谢 您的反馈。 我使用可用的示波器测量了波形、但似乎显示了噪声。 根据 MS5637数据表、从器件地址为1110110x。 我尝试将其更改为0x40、但代码卡在 while (! (UCB0IFG & UCRXIFG0);//等待 RX 缓冲区准备就绪。 0x76似乎是正确的从器件地址。 您能否帮助我解决为什么没有显示数据的问题?

    谢谢!



    带有调整探针的校准器信号

    SDA

    SCL

    I2C 地址

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

    我想您使用的是 传感器集线器 BoosterPack。 您似乎正在使用其他 I2C 器件。  

    是在命令写入还是数据读取期间显示 SCL 的第一个波形? 我不能告诉你。"

    我想您为连接器上的以下端子建立了器件和 EVM 之间的连接、对吧?

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

    是的、我的错。 我正在使用 MS5637数字压力传感器(附有数据表和 Arduino 代码)。 我假设所有 I2C 数字传感器都遵循相同的一般连接和编码原理、只是略有改动。 我使用了您提到的连接:3.3V、GND、SDA 和 SCL。

    示波器图像显示 调整后的探头(未连接到 SDA 或 SCL)的方波校准器波形。 然后、SDA 信号有两个并排的图像(右侧放大以显示波形)、然后是 SCL 信号。

    SCL 波形显示了读取数据、因为代码在切换到接收模式后卡住。 我的假设是否不正确? 如果是、您能否指导我如何从该传感器中正确检索压力值?

    所述的要求
    e2e.ti.com/.../ENG_5F00_DS_5F00_MS5637_2D00_02BA03_5F00_B5-_2800_3_2900_.pdf

    Arduino 代码
    e2e.ti.com/.../MS5637_5F00_Arduino_5F00_Library_2D00_master.zip

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

    只是跟进-请查看随附的示波器图像。

    1- RF430FRL152hevm +  MS5637 (I2C 连接)->黄色信号为 SCL、绿色信号为 SDA->代码一直处于"while (! (UCB0IFG & UCRXIFG0);//等待 RX 缓冲区准备就绪"。  


    2-Arduino Uno +MS5637 (I2C 连接)->黄色信号是 SCL、绿色信号是 SDA

      

    ...

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

    我不熟悉您的 MS5637器件。 您将调用 SHT_21_I2C_EVM Master_Measurement (TEMP_MEASE_HOLD_MASTER、TEMP_DATA)、其中  TEMP_MEASE_HOLD_MASTER 等于0xE3。 这是 SH21器件的命令。 您是否确定您的 MS5637也采用了相同的命令?  MS5637 读取其传感器的命令顺序是什么? 您需要按照 MS5637 数据表了解如何读取传感器?

    [报价 userid="617801" url="~/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1402603/rf430frl152hevm-adc0-value-access/5380747 #5380747"]

    2-Arduino Uno +MS5637 (I2C 连接)->黄色信号是 SCL、绿色信号是 SDA

    [报价]

    此 Arduino 波形也没有任何交易,除非你放大太多。 我不知道是什么。 它只是显示一些快捷方式。