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


