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.
您好!
我目前在使用 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
您好 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
希望这能提供一些资料,说明我为何会面对这个问题。 再次感谢您的观看。
此致、
插孔
您好 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、
确保我将此主题标记为已解决、并将问题移至另一个主题。
此致、
插孔