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.

[参考译文] TDC7200:通过 Arduino 读取和写入 TDC7200

Guru**** 2035740 points
Other Parts Discussed in Thread: TDC7200, TDC1000, TDC7200EVM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/946588/tdc7200-reading-and-writing-to-tdc7200-with-arduino

器件型号:TDC7200
主题中讨论的其他器件: TDC1000

您好!

我目前在使用 Arduino Uno 读取/写入 TDC7200时遇到一些问题。 我已经在下面尝试过使用和不使用上拉电阻器的电路、并包含了我在下面使用的代码。 对于这两个电路、我可以读取/写入 TDC1000、但由于某种原因、我无法对 TDC7200执行相同的操作。 这两个 IC 之间的 SPI 约定是否不同?

请告诉我、我是否可以提供可提供更多见解的信息。 感谢您的观看和关注。


此致、

插孔

连接:

#include
#include

int dt = 200;
float CLK_FREQ = 8*pow (10、6);//时钟频率(缺省值8MHz)
浮点 CLK_PERIOD = 1/CLK_FREQ;
uint32_t SPIfrequency = 20000000;

//********* TDC7200寄存器地址列表*********

字节 CONFIG1 = 0x00;
字节 CONFIG2 = 0x01;
字节 INT_STATUS = 0x02;
字节 INT_MASK = 0x03;
字节粗糙_CNTR_OVF = 0x04;
字节粗糙_CNTR_OVF = 0x05;
字节 CLOCK _CNTR_OVF = 0x06;
字节 CLOCK _CNTR_OVF = 0x07;
字节 CLOCK _CNTR_STOP_MASK_H = 0x08;
字节 CLOCK _CNTR_STOP_MASK_L = 0x09;

字节时间1 = 0x10;
字节 CLOCK _COUNT1 = 0x11;
字节时间2 = 0x12;
字节 CALIBRATION1 = 0x1B;
字节 CALIBRATION2 = 0x1C;
//********* TDC7200寄存器地址列表结束*********

int selectTDC1000 = 5;
int selectTDC7200 = 6;
int enableTDC1000 = 7;
int enableTDC7200 = 8;
int dataReadyPin = 4;
内部通道选择= 3;
INT INTBTDC7200 = 2;
INT TDC7200clock = 9;


void setup(){
  Serial.begin(9600);
 serial.println ("---------------------- 程序启动-------------------------------------------------------- ");
 SPI.begin();
 引脚模式(TDC7200clock、输出);
 PinMode (selectTDC1000、输出);
 PinMode (selectTDC7200、输出);
 PinMode (enableTDC1000、输出);
 PinMode (enableTDC7200、输出);
 PinMode (dataReadyPin、输入);//循环中未使用
 引脚模式(通道选择、输出);//在环路中未使用
 analogWrite (TDC7200clock、128);
 digitalWrite (selectTDC1000、HIGH);
 digitalWrite (selectTDC7200、HIGH);//Select 为低电平有效、设置为高电平@初始化
 digitalWrite (enableTDC1000、low);
 digitalWrite (enableTDC7200、low);//使能为高电平有效,设置为低电平@初始化
 digitalWrite (enableTDC1000、高电平);
 digitalWrite (enableTDC7200、高电平);
 延迟(dt);


TDC7200Write (CONFIG1、0x02);
TDC7200Write (CONFIG2、0x80);
TDC7200Write (INT_STATUS、0x06);
TDC7200Write (INT_MASK、0x89);

uint16_t readCONFIG1 = TDC7200Read (config1);
uint16_t readCONFIG2 = TDC7200Read (CONFIG2);
uint16_t readint_status = TDC7200Read (INT_STATUS);
uint16_t readint_mask = TDC7200Read (INT_mask);

 serial.print ("config1=");
 serial.println (readCONFIG1、bin);
 serial.print ("\n");
 serial.print ("CONFIG2=");
 serial.println (readCONFIG2、bin);
 serial.print ("\n");
 serial.print ("INT_STATUS=");
 serial.println (readint_status、bin);
 serial.print ("\n");
 serial.print ("INT_MASK=");
 serial.println (readint_mask、bin);
 serial.print ("\n");


void loop(){
 //将主代码放在此处,重复运行:
 SPI.beginTransaction(SPISettings(SPIfrequency,MSBFIRST,SPI_MODE3));
 延迟(1000);


空 TDC7200Write (字节地址、字节数据){
 SPI.beginTransaction(SPISettings(SPIfrequency,MSBFIRST,SPI_MODE3));
 digitalWrite (selectTDC7200、low);//在 selectTDC1000或 selectTDC7200之间
 delayMicroseconds (100);
 地址|= 0x40;
 spi.transfer (address);
 spi.transfer (data);
 digitalWrite (selectTDC7200、HIGH);
 spi.endTransaction();
 };


字节 TDC7200Read (字节地址){
 SPI.beginTransaction(SPISettings(SPIfrequency,MSBFIRST,SPI_MODE3));
 digitalWrite (selectTDC7200、low);
 delayMicroseconds (100);
 //spi.transfer (address);
 spi.transfer (address);
 字节 inByte = SPI.transfer (0x00);
 digitalWrite (selectTDC7200、HIGH);
 spi.endTransaction();
 返回 inByte;
 };

示例输出:

当 R/W 连接到 TDC7200时:

------------ 程序启动--------------------------------------------------------

CONFIG1= 11111111

CONFIG2= 11111111


INT_STATUS= 11111111

INT_MASK= 11111111

当 R/W 连接到 TDC1000时:

------------ 程序启动--------------------------------------------------------

CONFIG_0= 10

CONFIG_1= 10000000


CONFIG_2= 110

CONFIG_3= 1001

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

    尊敬的 Jack:

    在执行任何写入操作之前、您是否能够读取默认 TDC7200寄存器值(复位值)?

    如果您有示波器、请查看运行期间的4条 SPI 线路、并确保 TDC1000 CS 为低电平。  

    硬件注意事项:

    -这里不需要上拉电阻器

    -使 SPI 线路尽可能短

    此致、

    Gabriel

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

    您好 Gabriel、

    感谢您的建议、并花时间。

    我无法从 TDC7200读取默认值(读取的值始终显示为"0")。 我尝试将使能引脚拉至低电平、然后再拉回到高电平、以复位器件。

    我有示波器、但目前仅有3个探针。 我对 TDC7200和 TDC1000执行了测试、并有一些截屏可供分享:

    测试两个 IC 的 CS 引脚。 对于4个写入和4个读取命令、两个 CS 引脚单独被拉至低电平。

    蓝色= TDC1000 CS                       红色= TDC7200 CS

    TDC1000:写入程序值。 读取/写入上述4个寄存器的值符合预期。

    蓝色= DOUT                     红色= DIN                绿色= CS 1000

    我还尝试将0xFF 写入 TDC1000的寄存器。 所有4个寄存器读为'1111 111111'

    蓝色= DOUT                     红色= DIN                绿色= CS 1000

    这是 TDC7200的 R/W。 也就是说、我在八个 CS 脉冲的末尾看不到相同的尖峰。

    蓝色= DOUT                     红色= DIN                绿色= CS7200

    希望这能提供一些资料,说明我为何会面对这个问题。 再次感谢您的观看。

    此致、

    插孔

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

    尊敬的 Jack:

    您能不能在第二个图中说明 UNO 正在发送什么数据?  

    如果您可以使用以下格式调整垂直刻度和绘图、则更容易看到正在发生什么情况:

    尝试在单独的图中捕获命令字段(发送地址)和数据字段的 CS、SCK 和 SDI/SDO 线路。  

    我觉得您的 CS 在 R/W 运行期间会受到脉冲的影响吗? 它应该与上面的示例类似。  

    此致、

    Gabriel

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

    您好 Gabriel、

    对于之前的图像、我已将 SPI 频率设置得太高、示波器采样率设置得太低。 请忽略它们。 我使用了较低的 SPI 频率和较高的采样率、以获得上述格式的图。

    每个 TDC1000和 TDC7200具有1个读取和1个写入。

    SPI 频率= 250kHz

    寄存器地址 R/W 至= 0x02 (B0000 0010)

    已写入/预期将被读取的数据= 0x06 (B0000 0110)

    蓝色= DOUT         红色= DIN    绿色= SCLK        黄色= CS

    写入 TDC1000

    TDC1000读取

    TDC7200写入

    TDC7200读取

    我仍然可以读取 TDC1000的写入值(读取值= 0x06)、但不能读取 TDC7200的写入值(读取值= 0)。Arduino 似乎正在正确写入 IC、CS 在正确的窗口中设置为低电平。 但是、TDC7200 DOUT 不会返回任何值。

    我使用过其他 TDC7200 IC、希望这是硬件问题、但没有结果。

    希望这能提供更多见解。 感谢您的观看。

    此致、

    插孔

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

    尊敬的 Jack:

    感谢您提供新的图、现在很明显可以看到。  

    测试另一个 TDC7200可知、至少这不是器件问题。 这很可能是电路板问题。  

    您的硬件配置是什么? 您是否将 TDC1000和 TDC7200安装在 PCB 上、其中 Arduino 连接通过试验电路板、焊接线缆连接和电缆进行? 还是一切都在 PCB 上? 使用高速通信时、干净的硬件配置尤为重要。  

    确保遵循 TDC1000和 TDC7200的正确布局指南和建议

    对于这两个器件、建议使用源端接电阻器(22 Ω)、有关更多信息、请参阅上 一帖子。 Bob 提供了一些好的建议、并提供了详细的解释。  

    此致、

    Gabriel

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

    您好 Gabriel、

    感谢您迄今提供的帮助。 我通过将一些从 Arduino 到测试点的连接焊接到 EVM 上的 TDC7200的 R/W。 但是、我在仅对 IC 执行 R/W 时没有发现同样的成功、因此我进行错误的硬件连接可能会出现问题。

    话虽如此、我是否可以检查 TDC7200EVM 上的所有电阻器和电容器(C2/C4、R1-R6)是否都是 TDC7200正常工作所必需的? 相关电容器/电阻来自 TDC7200EVM、如下所示:

    请告诉我是否应该启动新的主题以提出此问题。

    感谢你能抽出时间。

    此致、

    插孔

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

    尊敬的 Jack:

    我很高兴您能够缩小问题的范围。  

    如果您可以将您的新问题复制到新主题中、我们将不胜感激、我将在此处发布我的答案。  

    谢谢!

    Gabriel

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

    您好 Gabriel、

    确保我将此主题标记为已解决、并将问题移至另一个主题。

    此致、

    插孔