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:RF430FRL152HEVM 通过 I2C 发送 ADC 数据

Guru**** 2393725 points
Other Parts Discussed in Thread: MSP-FET

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1470697/rf430frl152hevm-rf430frl152hevm-sending-adc-data-over-i2c

器件型号:RF430FRL152HEVM
Thread 中讨论的其他器件:MSP-FET

工具与软件:

您好、我正在尝试使用 I2C 通过另一个器件通过 ADC0采样的数据。 我修改了 ADC/NFC 代码并添加了 i2c 器件、但主器件无法从 RF430EVM 板获得任何响应。 我使用了 SV10 (6和7)作为 SDA 和 SCL 引脚。 下面是固件。 我还尝试添加上拉电阻器、尽管我认为 EVM 原理图具有适用于 i2c 的上拉电阻器。 问题可能是什么? 我没有删除某些 NFC 初始化部分、不确定它们是否会引起问题。 EVM 上的 S3-4-5-6引脚为 S-0-0-Supply。 rf430evm 与 USB 和 MSP-FET 相连、在运行时断开 USB 也会停止主器件的运行。

RF430代码:

#include <rf430frl152h.h>
#include <string.h>
#include "types.h"
#include "stdint.h"


void DeviceInit(void);
void initISO15693(u16_t parameters);
void I2CInit(void);


#define CLEAR_BLOCK_LOCKS BIT3
#define FRAM_LOCK_BLOCK_AREA_SIZE 38
#define FRAM_LOCK_BLOCKS 0xF840  // Address of ISO15693 lock blocks

#define ROM_EUSCI_SUPPORT_ENABLED BIT2
#define EROM_EUSCI_SUPPORT_DISABLED 0
#define ROM_SENSOR_SUPPORT_ENABLED BIT7
#define ROM_SENSOR_SUPPORT_DISABLED 0
#define NFC_BRIDGE_DISABLED BIT6
#define NFC_BRIDGE_ENABLED 0
#define EIGHT_BYTE_BLOCK BIT0
#define FOUR_BYTE_BLOCK 0
#define FIRST_ISO_PAGE BIT1
#define SECOND_ISO_PAGE 0

// ======================= RESTORED MEMORY DEFINITIONS =========================
#define FIRMWARE_CONTROL_ADDRESS 0xF867
#pragma RETAIN(Firmware_System_Control_Byte);
#pragma location = FIRMWARE_CONTROL_ADDRESS
const u08_t Firmware_System_Control_Byte = ROM_SENSOR_SUPPORT_DISABLED + EROM_EUSCI_SUPPORT_DISABLED + NFC_BRIDGE_DISABLED + FOUR_BYTE_BLOCK + FIRST_ISO_PAGE;

// ROM Variables (Required for Proper RF/NFC Stack Functionality)
#pragma RETAIN(DS)
#pragma location = 0x1C00
u08_t DS;
#pragma RETAIN(RF)
#pragma location = 0x1C6A
const u08_t RF;
#pragma RETAIN(NRX)
#pragma location = 0x1CA4 // RX Buffer
const u08_t NRX[34];
#pragma RETAIN(NTX)
#pragma location = 0x1CC6 // TX Buffer
const u08_t NTX[33];
#pragma RETAIN(EL)
#pragma location = 0x1CF2
const u08_t EL;
#pragma RETAIN(PF)
#pragma location = 0x1C0A
const u16_t PF[48];


#define ADC_ADDRESS 0xF88C // Block 9
#pragma RETAIN(ADC_Read);
#pragma location = ADC_ADDRESS;
u16_t ADC_Read[2];

// ====================== GLOBAL VARIABLES ======================
volatile uint16_t adc_result = 0;   // Store ADC result
volatile uint8_t i2c_tx_data[2];    // Buffer to send ADC result over I2C

void main()
{
    WDTCTL = WDTPW + WDTHOLD;  // Stop watchdog timer

    // ROM RF13M module setup ** The following 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)

    
    DeviceInit();  // Initialize device settings
    I2CInit(); // Initialize I2C

    // Setup ADC
    SD14CTL0 = SD14EN + VIRTGND + SD14IE; // ADC enabled, Virtual Ground enabled, Interrupt enabled.
    SD14CTL1 = SD14UNI + SD14INTDLY0;     // Unipolar mode, Interrupt triggered after first sample.

    while (1)
    {
        SD14CTL0 |= SD14SC; // Begin ADC conversion
        __bis_SR_register(LPM3_bits + GIE);  // Enter Low Power Mode 3 with interrupts
    }
}

void DeviceInit(void)
{
    P1SEL0 = 0xF0; // Keep JTAG
    P1SEL1 = 0xF0; // Keep JTAG
    P1DIR &= ~0xEF;
    P1REN = 0;

    CCSCTL0 = CCSKEY;  // Unlock CCS
    CCSCTL1 = 0;
    CCSCTL4 = SELA_1 + SELM_0 + SELS_0;
    CCSCTL5 = DIVA_2 + DIVM_1 + DIVS_1;
    CCSCTL6 = XTOFF;
    CCSCTL8 = ACLKREQEN + MCLKREQEN + SMCLKREQEN;
    CCSCTL0_H |= 0xFF;  // Lock CCS
}

// ==================== I2C SLAVE INITIALIZATION ====================
void I2CInit(void)
{
    UCB0CTLW0 = UCSWRST;                      // Hold eUSCI_B0 in reset
    UCB0CTLW0 |= UCMODE_3 | UCSYNC;           // Set I2C mode, synchronous mode
    UCB0I2COA0 = 0x40 | UCOAEN;               // Set own I2C address (0x40)
    UCB0CTLW1 = UCASTP_2;                     // Auto STOP mode
    UCB0TBCNT = 2;                            // Expecting 2 bytes from master
    UCB0CTLW0 &= ~UCSWRST;                    // Release from reset
    UCB0IE |= UCTXIE0 + UCSTPIE;              // Enable TX & STOP interrupts
}


#pragma vector=USCI_B0_VECTOR
__interrupt void I2C_ISR(void)
{
    switch (__even_in_range(UCB0IV, 0x1E))
    {
        case 0x16:  
            UCB0TXBUF = i2c_tx_data[0];  // Send High Byte first
            break;
        
        case 0x18: 
            UCB0TXBUF = i2c_tx_data[1];  // Send Low Byte
            break;

        case 0x12:  
            UCB0IFG &= ~UCSTPIFG;  // Clear STOP flag
            break;

        default:
            break;
    }
}


#pragma vector=SD_ADC_VECTOR
__interrupt void ADC_ISR(void)
{
    switch (__even_in_range(SD14IV, 4))
    {
        case SD14IV__NONE: // No interrupt pending
            break;

        case SD14IV__RES: // ADC Data Available
            SD14CTL0 &= ~SD14IFG;   // Clear the data available interrupt
            adc_result = SD14MEM0;  // Read the ADC value
            
            // Store ADC result in I2C transmission buffer
            i2c_tx_data[0] = (adc_result >> 8) & 0xFF; // High byte
            i2c_tx_data[1] = adc_result & 0xFF;        // Low byte

            __bic_SR_register_on_exit(LPM3_bits);  // Wake up CPU
            break;

        case SD14IV__OV: // Memory Overflow
            SD14CTL0 &= ~SD14OVIFG; // Clear the overflow bit
            break;
    }
}

主器件代码:

#include <Wire.h>

#define RF430_I2C_ADDRESS 0x40 

void setup() {
    Serial.begin(9600);
    Wire.begin();  
    Serial.println("Starting I2C communication");
}

void loop() {
    uint16_t adcValue = requestADC();
    float voltage = (adcValue / 16383.0) * 900; 

    Serial.print("ADC Value: ");
    Serial.print(adcValue);
    Serial.print(" | Voltage: ");
    Serial.print(voltage);
    Serial.println(" mV");

    delay(1000);  // Wait before next request
}

uint16_t requestADC() {
    Wire.requestFrom(RF430_I2C_ADDRESS, 2); 

    if (Wire.available() < 2) {
        Serial.println("Error: No response from RF430");
        return 0;  
    }

    uint8_t highByte = Wire.read();  
    uint8_t lowByte = Wire.read();   

    return (highByte << 8) | lowByte; 
}

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

    此外、是否有办法绕过 EVM 上的光传感器? EVM 上的 ADC0通道连接到光晶体管、即使我应用模拟传感器、光传感器的值也会在那里。 我查看了 EVM 文档、但没有看到任何拆卸光传感器的方法。 我是否应该将其从电路板上熔化以便绕过它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    。 我使用了 SV10 (6和7)作为 SDA 和 SCL 引脚。

    是的。  

    [quote userid="637084" url="~/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1470697/rf430frl152hevm-rf430frl152hevm-sending-adc-data-over-i2c 下面是固件。 [报价]

    请参考 TRM 中的示例代码并与您的代码进行比较。  

    [报价用户 id="637084" url="~/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1470697/rf430frl152hevm-rf430frl152hevm-sending-adc-data-over-i2c ]EVM 上的 S3-4-5-6引脚是 S-0-0-Supply。[/QUOT]

    是的。

    [报价用户 id="637084" url="~/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1470697/rf430frl152hevm-rf430frl152hevm-sending-adc-data-over-i2c "]但我的主器件无法从 RF430EVM 板获得任何响应。

    SCL 和 SDA 的 I2C 波形是什么? 您确定主器件正在向从器件发送时钟吗? 我建议您使用逻辑分析仪或示波器来观察波形。 您的主器件正在从 RF430请求数据。 这意味着 RF430是从发送器。 在从器件发送数据后、主器件应该确认接收到数据。 在这种情况下、从器件不执行 ACK。  

    请参阅 I2C 从发送器模式。