您好!
我正在开发基于 RF430152H 和 Sensirion SHTW2 I2C 温度和湿度传感器的原型。
系统由外部(电池或 USB)供电、每秒测量一次温度并将统计数据记录到 I2C NDEF 存储器中。
读取器是一款 Android 应用、在 NDEF 存储器的9个前块(每个4字节)上执行读取存储器命令。
我的代码基于 RF430固件用户指南中描述的仅 NFC 示例固件。
I2C 读取和数据记录器件在我尝试读取存储器之前工作良好。 因此、NFC 读取功能正常执行、会干扰 I2C 传输、最终导致 I2C 中断信号未发出、这取决于器件(开发套件组装或我们自己的 PCB)。
请注意、NFC 读取在块后完成、总共9个读取命令。
I2C 受到 NFC 读取的干扰是否正常,如何保护它?
到目前为止、我的解决方案大部分时间都是为了启用 RFPMMIEVH 中断并在发生中断时中止 I2C 传输。 请参阅下面的代码。 我知道活动等待并不是理想的、但假设这对于第一次演示来说已经足够了。 我未成功实现 I2C 中断处理。
ABortApp 标志由 RFPMMIEVH 中断处理程序置位。
下面的例程每1秒从由计时器控制的主循环调用一次。 当不使用传感器时、RF340被置于 LPM3模式。
谢谢、此致、
Damien
//从 Sensirion SHTW2读取温度
u08_t read_temperature ()
{
u08_t rxData[2];
ABortApp = 0;
//打开传感器电源
DBG_Trigger (3);
P1OUT |= BIT3;// P1.3高电平
//TA0CTL = TAIE | TASSEL_2 | MC_1 | ID_3;
//TA0CCR0 = 50;//大约300us
//LPM0;//确保传感器通电
DBG_Trigger (3);
//为 I2C 模式配置 P1.0和 P1.1引脚
//P1DIR &=~(SDA);
//P1OUT |=(SDA);
//P1REN |=(SCL);
//为 I2C 配置 eUSCI
PORT_I2C_SEL0 |=(SCL + SDA);
PORT_I2C_SEL1 &=~Ω(SCL + SDA);
UCB0CTL1 |= UCSWRST; //软件复位被启用
UCB0CTLW0 |= UCMODE_3 + UCMST + UCSYNC + UCTR; // I2C 模式、主控模式、同步
UCB0CTLW0 |= UCSSEL_2; //选择2MHz 的 SMCLK
UCB0BRW = 2; // 463kHz/2 = 230kHz
UCB0I2CSA = 0x70; // SHTW2的从器件地址
UCB0CTL1 &=~UCSWRST; //退出复位模式
DBG_Trigger (2);
_DELAY_CYCLES (3000);
DBG_Trigger (2);
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回7;
}
UCB0CTLW1 = UCASTP_1;
UCB0TBCNT = 0x0002;
UCB0CTL1 |= UCTXSTT + UCTR; //开始 i2c 写入操作
DBG_Trigger (2);
while (!(!(UCB0IFG & UCTXIFG0))&&(!abortApp)); //等待直到需要传输
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回1;
}
DBG_Trigger (2);
UCB0TXBUF = 0x7C; //发送命令
while (!(!(UCB0IFG & UCTXIFG0))&&(!abortApp)); //等待直到需要传输
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回2;
}
DBG_Trigger (2);
UCB0TXBUF = 0xA2; //发送命令
while (!(!(UCB0IFG & UCBCNTIFG))&&(!abortApp)); //等待停止计数器
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回3;
}
DBG_Trigger (2);
UCB0CTL1 &=~UCTR; //读取操作
UCB0CTL1 |= UCTXSTT; //重复启动
while (!(!(UCB0IFG & UCRXIFG0))&&(!abortApp)); //等待直至读数据可用
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回4;
}
DBG_Trigger (2);
rxData[0]= UCB0RXBUF; //读取 MSB
UCB0CTLW0 |= UCTXSTP; //在下一个字节后发送 STOP
while (!(!(UCB0IFG & UCRXIFG0))&&(!abortApp)); //等待更多数据可用
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回5;
}
DBG_Trigger (2);
rxData[1]= UCB0RXBUF; //读取 LSB
while (!(!(UCB0IFG & UCSTPIFG))&&(!abortApp); //确保发送了停止条件
if (abortApp){
UCB0CTL1 |= UCSWRST;
P1OUT &=~BIT3;
返回6;
}
UCB0CTL1 |= UCSWRST; //将 I2C 置于复位模式
//现在温度读数正确,因为我们向后填入 RX 缓冲区,然后
//首先给出温度 MSB
//最后关闭传感器
DBG_Trigger (3);
P1OUT &=~BIT3;
temater_read =(((U16_t) rxData[1])+(((U16_t) rxData[0])<< 8);
返回0;
}