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.

[参考译文] RF430FRL152H:NFC 读取会干扰 RF430152H 上的 I2C 通信

Guru**** 2563960 points


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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/921272/rf430frl152h-nfc-reading-disturbs-i2c-communication-on-the-rf430152h

器件型号:RF430FRL152H

您好!

我正在开发基于 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;


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

    您好 Damien、

    根据我的理解、这与 EVM 用户指南(第5.1章)中所述的演示相同。

    温度和湿度测量以及测量数据的读取。  

    我只需检查一下、让演示运行一段时间、而不会出现任何问题。

    请说明您的应用与该演示有何区别?

    此致、

    Helfried