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.

[参考译文] ADS9224R:读取数据和寄存器

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1186026/ads9224r-reading-data-and-registers

器件型号:ADS9224R
主题中讨论的其他器件: ADS7066

您好!

我们将评估 ADS9224R。 遗憾的是、不支持 C 代码、也不支持任何其他代码。
我们首先设计了 SPI 的标准函数。 接下来、我们将读取和写入寄存器。
根据数据表、我们首先必须发送命令读取或写入地址和数据。

我们实现了以下功能:

void vSendCommand(char cOPCode, char cAddr, char cData) {

int CodeToTransfer = 0, digit;
volatile bool myBit = false;

SPI_CS_Low;

SPI_CONVST_High;

CodeToTransfer = (cOPCode << 12) | (cAddr << 8) | cData;

digit = 0;

do{

myBit = CHECKBIT(CodeToTransfer,digit);

_NOP();

if (myBit){
SPI_SDI_High; //SDA high
}
else {

SPI_SDI_Low; //SDA low
}

SPI_SCK_High; //Clock high
SPI_SCK_Low; //Clock low

_NOP();

}while(++digit < 16);

SPI_CONVST_Low;

SPI_CS_High;

_NOP();
}

到目前为止这是正确的吗?


现在、我们要从相应的寄存器中读取数据。 我们如何做到这一点。 我们曾考虑过一个函数"unsigned char ucRegisterData()"。

其中、我们监控 RDY 引脚、一旦数据就绪、我们就会读取它。 不幸的是、我们被困在这里。 我们如何获取相应寄存器的数据。
如果有人能帮助我们提供 C 代码示例以跳过第一个障碍、那会很好。

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

    您好、Michael、

    感谢您发帖并关注 ADS9224R。 我们没有该器件的示例 C 代码、这是对的、但我将检查是否有类似器件的代码。

    读取寄存器数据包括发送两个帧:命令帧和接收帧。 第7.6.3节详细介绍了寄存器读取命令的命令帧结构和操作码。 下一帧中 SDI 上的数据可以是任何数据、包括 NOP。

    此致、

    Ryan

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

    您好、Ryan、

    首先、非常感谢您的回复。
    如果我理解正确、那么我必须使用函数"void vSendCommand (char cOPCode、char cAddr、char cData)"发送一次命令来读取相应的寄存器、和
    接收帧之后立即执行。 这是什么样子的? 我在哪条线路上接收数据? SDI 是 AD 转换器的输入、而在 SDO-x 上、我只读取转换器数据、对吧? 我很高兴您能为我提供帮助(也提供伪代码)。 我已经期待您的回答。

    此致 Michael

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

    您好、Michael、

    现在、请看一下我们的 ADS7066示例 C 代码。 这些器件在速度和性能方面并不完全可比、但我相信接口和命令结构已经足够相似了。

    https://www.ti.com/product/ADS7066#software-development

    接收帧中的寄存器数据可以在 SDO-XA 或 SDO-XB 上读取。

    此致、

    Ryan

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

    Hallo Ryan、

    erstmal danke für den tipp。 ICH schaue mir den Code An und melde mich weder。 Erstmal schönes Wochenenenenende。 MIT freundlichen Grüßen

    Michael

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

    抱歉、现在在 englisch 中:

    您好、Ryan、

    首先、感谢您的提示。 我将查看代码并返回给您。 首先、祝您度过美好的周末。 此致

    Michael

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

    您好、Ryan、

    花了更长的时间,但是有一些其他的项目…

    查看了 ADS7066的代码。 到目前为止,一切都是可以理解的。 只是屯门的一些问题。 如果您使用
    转换为"startManualConversions (0、200000);"、这意味着使用200ksp. 只有计时器永远不会再次停止。 其中是单个结果、因为不存在读取这些样本的数组。 如果您查找 ReadData (data)、则只会获得一个结果;
    IRQ 例程中的中断。 缺少一个 main.c 来处理该问题。
    如果我要测量2000个采样、例如200ksps、这种情况会是怎样的?

    此致 Michael

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

    您好、Ryan、

    我思考了主要程序的外观、并提出了以下想法:

    int32_t result[size_array]={0};
    int32_t iCounter = 0;

    int main (void){

    initAdcPeripheral();

    initADS7066();

    setChannelAsAnalogInput (0);

    startManualConversions (0、200000);

    while (1)

    DELAY_us (1);

    在计时器 ISR 中、我要添加以下内容:

    Result [iCounter]= ReadData (data);

    if (++iCounter > size_array){
     stopConversion();

     delay_us (1);//Breakpoint

    就其运行而言、这是否正确、或者您是否会以不同的方式看到它?

    此致

    Michael