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; }