Thread 中讨论的其他器件:LMX2595、 LM2595
工具/软件:
您好团队:
我们计划使用 AM273x 通过 SPI 连接 AD7389-4 ADC。 我们可以遵循任何示例工程代码来获取 4 通道输入数据、以便进一步处理这些数据吗?
任何建议和建议都将非常感谢。
感谢您的帮助和支持
此致、
LIN
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.
工具/软件:
您好团队:
我们计划使用 AM273x 通过 SPI 连接 AD7389-4 ADC。 我们可以遵循任何示例工程代码来获取 4 通道输入数据、以便进一步处理这些数据吗?
任何建议和建议都将非常感谢。
感谢您的帮助和支持
此致、
LIN
您好 Lin、
由于 AD7389-4 支持串行 1/2/4 线模式、因此必须将其设置为 SERIAL1 线模式、以便与 AM273x MIBSPI 连接、该器件可设置为 3 引脚模式或 4 引脚模式。 这意味着您必须将 AD7389-4 的 CS、SDOA、SDI 和 SCLK 连接到 AM273x MIBSPI。
软件应该简单易行。 请按照接口部分“串行 1 线模式“中的说明进行操作。
此致、
Ming
尊敬的 Ming:
仅供参考、 EVAL-AD7380-4FMCZ 已在独立模式下加电。 现在、它通过 SPI 与 AM273x EVM 连接、如下所示。

但是,当我运行代码来配置 EVAL-AD7380-4FMCZ 板上的 AD7380-4 芯片组时。 结果似乎不正确。 我尝试将其断电、然后恢复到正常模式、设置为 1 线模式、然后读回以进行验证。 但无法获得预期的结果。 我在这里共享我的代码和 Saleae 捕获文件。 您能帮我检查一下我是否出了问题或遗漏了任何内容吗? 哦、SPI 设置与我为 LMX2595 所做的设置相同。 它有一条 4 引脚 MODE 线路连接到 J16。
void sendAD738xWrite (uint8_t regAddr、uint16_t regData)
{
uint8_t txBuf[2];
uint8_t rxBuf[2]={0};
MIBSPI_Transaction spiTransaction;
int32_t transferOK;
//格式:[1][ADDR(3 位)][DATA(12 位)]
UINT16_t FRAME =(1 << 15)|((regAddr 和 0x07)<< 12)|(regData 和 0x0FFF);
txBuf[0]=(frame >> 8)& 0xFF;
txBuf[1]= frame & 0xFF;
spiTransaction.count = 2;
spiTransaction.txBuf =(void *) txBuf;
spiTransaction.rxBuf =(void *) rxBuf;
spiTransaction.peripheralIndex = 0U;
spiTransaction.arg = NULL;
transferOK = MIBSPI_TRANSFER (gMibspiHandle[MSS_SPIB_J16]、&spiTransaction);
if ((transferOK!= SystemP_Success)||(spiTransaction.status!= MIBSPI_TRANSFER_COMPLETED))
{
DebugP_LOG(“AD738x SPI 写入失败! reg 0x%02x\r\n“、regAddr);
DebugP_ASSERT (FALSE);
}
}
uint16_t sendAD738xRead (uint8_t regAddr)
{
Uint8_t txBuf1[2]、txBuf2[2];
uint8_t rxBuf1[2]={0}、rxBuf2[2]={0};
MIBSPI_Transaction spiTransaction;
int32_t transferOK;
uint16_t 回读;
//第一条 16 位命令:[0][ADDR(3 位)]【无关】
Uint16_t cmd =((regAddr 和 0x07)<< 12);
txBuF1[0]=(cmd >> 8)& 0xFF;
txBuF1[1]= cmd 和 0xFF;
spiTransaction.count = 2;
spiTransaction.txBuf =(void *) txBuF1;
spiTransaction.rxBuf =(void *) rxBuF1;
spiTransaction.peripheralIndex = 0U;
spiTransaction.arg = NULL;
transferOK = MIBSPI_TRANSFER (gMibspiHandle[MSS_SPIB_J16]、&spiTransaction);
if ((transferOK!= SystemP_Success)||(spiTransaction.status!= MIBSPI_TRANSFER_COMPLETED))
{
DebugP_LOG(“AD738x SPI 读取失败! reg 0x%02x\r\n“、regAddr);
DebugP_ASSERT (FALSE);
}
//进行第二次传输以接收回读数据
txBuf2[0]= 0x00;//虚拟写入以接收回读数据
txBuf2[1]= 0x00;
spiTransaction.txBuf =(void *) txBuf2;
spiTransaction.rxBuf =(void *) rxBuf2;
transferOK = MIBSPI_TRANSFER (gMibspiHandle[MSS_SPIB_J16]、&spiTransaction);
if ((transferOK!= SystemP_Success)||(spiTransaction.status!= MIBSPI_TRANSFER_COMPLETED))
{
DebugP_LOG(“AD738x SPI 回读失败! reg 0x%02x\r\n“、regAddr);
DebugP_ASSERT (FALSE);
}
回读=((uint16_t) rxBuf2[0]<< 8)| rxBuf2[1];
返回读回和 0x0FFF;//只有 12 位有效
}
void mibspi_loopback_main (void * args)
{
uint16_t readbackData;
drivers_open();
BOARD_DRIVERSOpen ();
/// 1) 将 AD738x-4 断电
waitForUser(“步骤 1:关闭 AD378x-4……“);
sendAD738xWrite (0x01、0x0001);/// R1-D0
ClockP_usleep (10000);//等待 10ms
/// 2) 返回至正常模式
waitForUser(“步骤 2:恢复正常...“);
sendAD738xWrite (0x01、0x0000);/// R1-D0
ClockP_usleep (10000);//等待 10ms
/// 3) 软件硬复位
waitForUser(“步骤 3:软件硬复位...“);
sendAD738xWrite (0x02、0x00FF);// R2-D7--D0
ClockP_usleep (10000);//等待 10ms
/// 4) 检查诊断自检结果
waitForUser(“步骤 4:检查自检结果...“);
readbackData = sendAD738xRead (0x03);// R3-D8
INT 重试次数= 1000;
while ((readbackData & 0x0100)&& retries-)
{
ClockP_usleep (100);//等待 100uS
readbackData = sendAD738xRead (0x03);
}
if(重试<= 0)
{
DebugP_log(“自检超时!\n“);
返回;
}
/// 5) 设置 1 线模式、无过采样、无警报、无升压、无 CRC
waitForUser(“步骤 5:设置 AD738x-4...“);
sendAD738xWrite (0x02、0x0100);// R2-D9-D8 01->1 线
ClockP_usleep (100);//等待 100uS
sendAD738xWrite (0x01、0x0000);/// R1
ClockP_usleep (100);//等待 100uS
/// 6) 读回任何其他寄存器以确认上述设置、(1 线,无过采样)
waitForUser(“步骤 6:读回状态...“);
readbackData = sendAD738xRead (0x02);//R2-D9-D8
if (((readbackData & 0x0300)>> 8)!= 0x01)
{
DebugP_log(“AD738x 未处于 1 线模式\n“);
返回;
}
readbackData = sendAD738xRead (0x01);// R1-D8-D6
if (((readbackData & 0x01C0)>> 6)!= 0x0)
{
DebugP_log(“AD738x 未处于无过采样模式\n“);
返回;
}
DebugP_log(“AD738x 处于单线制且无过采样模式\n“);
ClockP_usleep (100);//等待 100uS
DebugP_LOG(“AD738x SPI 操作完成。\r\n“);
Board_driversClose();
drivers_close();
返回;
}
这是我的 Saleae 捕获文件之一:
e2e.ti.com/.../SessionAD7389_5F00_01.txt
非常感谢您的帮助和支持。
此致、
LIN
您好 Lin、
从你的 Saleae 捕获和程序,我没有看到任何问题。 问题是 AD7380-4 EVM 的默认模式是什么。 是 1 线、2 线还是 4 线模式? 只要 Saleae 捕获与 AM273x MIBSPI 输出匹配、AM273x 就会做正确的事情。 我不会帮助您进一步调试非 TI 器件。
如果 MIBSPI 输入不正确、则应寻求 ADI 的帮助。 您可以共享整个设置阶段的 Saleae 捕获。 他们应该能够告诉您问题所在。
此致、
Ming
尊敬的 Ming:
感谢您的答复。 通过查看 AD7380-4 的数据表,默认模式为 2 线模式。 AD 的支持人员告诉我 SPI 模式应该是 2 而不是 0。 但是、当我更改为 SPI 模式 2 时、仍然无法正常工作。
是的、完全理解、我正在与 AD 的支持团队合作。 您验证 AM273x 端 SPI 和代码是否有效对我们非常有帮助。
我将继续与 AD 的支持团队合作、并在问题解决后更新您。
此致、
LIN
尊敬的 Ming:
我可以询问有关 Saleae Logic Pro 8 的问题。 由于我刚在几周前订购并收到该软件、并且我安装了 SW Saleae Logic 2 (2.4.29)、该版本的软件是否太新了? 我记得你说我的捕获有点奇怪。 我是否应该为 Saleae Logic Pro 8 安装早期版本的软件?
我们仍然存在 AM273x EVM 和 Saleae 捕获中 SPI 模式不匹配的问题。 我想同步您的设置并获得预期的结果。
谢谢、此致、
LIN
尊敬的 Ming:
有关更多信息、请单击此处。 我缩短了 MOSI 和 SIMO 的外部环回电缆。 连接设置如下所示(希望您能清楚地看到)

在运行代码 2 SPI 写入和 1 SPI 读取后、在 Saleae 上、MOSI 和 MISO 的结果不同、如此处所示。

这是可供您参考的 Saleae 捕获文件。
e2e.ti.com/.../Session05_5F00_loopback.txt
您能帮我看看原因吗?
感谢您的帮助和支持。
此致、
LIN
尊敬的 Ming:
我有很好的结果要分享。
我通过更改 S2 并按照您在另一帖子中提供的 SPI 引脚轮廓操作、从 J16 切换到 J7。
现在设置如下所示

运行代码时、我得到了干净且匹配的 MOSI 和 SIMO 数据、如下所示:

这里是 Saleae 捕获文件
e2e.ti.com/.../Session08_5F00_J7loopback.txt
因此 J7 的信号优于 J16。 我将重新进行 LMX2595 和 AD7380-4 SPI 写入和 SPI 读取的测试。
您是否有任何提示或建议、为什么 J16 的 SPI 信号存在该问题? 我想为原型设计解决这个问题。
此致、
LIN