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.

[参考译文] 编译器/ADS8332EVM:SPI初始化和数据读取

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/616944/compiler-ads8332evm-spi-initialisation-and-data-reading

部件号:ADS8332EVM

工具/软件:TI C/C++编译器

您好,

我想知道我是否可以获得一些有关ADS8332代码的输入。

我要学习的第一件事是打开ADS8332并初始化其寄存器。  

对于写入CFR (第15:12位为1110)和设置CFR,这看起来是否正常? 我很好奇,在这之前,我是否应该做些什么来在断电后唤醒它。

void ADS_on(void){

Porta.OUTCLR = PIN0_BM;      //降低CS
mspi_xchange (0b1110.1101万);       //写入CFR,设置CFR的自动触发模式
mspi_xchange (0b111.1101万);       //设置通道选择模式,无标签位
Porta.쫗 쿈= PIN0_BM;      //带来高CS

}

我想知道的下一件事是读取一个值。 首先我设置了一个功能来选择频道,然后我设置了一个功能来检索数据。

void Input_Channel (uint8_t channel){.(无效输入通道[uint8_t通道]

Porta.OUTCLR = PIN0_BM;       //降低CS
mspi_xchange((cannel<4)|0x0);  //将所需通道写入位15:12,并将其余的位保留为零
mspi_xchange(0x00);              //(其余的不在乎12位)
Porta.쫗 쿈= PIN0_BM;       //将CS调高
}

这里是我检索16位数据的地方

UINT16_t读取数据(无效){

Porta.OUTCLR = PIN0_BM;                  //降低CS
mspi_xchange (0b1101万);                   //将CMR设置为"Read Data"(读取数据),12位中的其余部分即'do dare不关心'位被设置为零
mspi_xchange(0x00);                         //(不在乎比特)
uINT8_t MSB = mspi_xchange(0x00);              //读取ADC数据的MSB
UINT16_t fullData = MSB | mspi_xchange(0x00);     //读取数据的LSB
Porta.쫗 쿈= PIN0_BM;                  //带来高CS
返回fullData;                         
}

非常感谢您提供的信息,谢谢。

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

    我们正在调查您的请求,并将很快回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mitchell,

    在函数ADS_ON()中,您选择了

    4位CMR =1110 :写入CFR

    12位CFR = 1101 0111 1101

    1101 :自动信道选择,内部示波器,自动触发,250kSPS

    0111 :有源高位EOC,EOC引脚,无daisychain,无自动nap

    1101 :无nap,无深度断电,无标签位,正常运行

    对上述设置的一些评论:

    请参见下面的数据表1。 在自动信道选择中,无需将信道编号写入CMR,因为内部序列发生器会处理此问题。 此外,使用自动信道选择时,应启用自动触发器和标签位。 在上述设置中,自动触发器已启用,但未启用标记位。

    函数Input_Channel()看起来正常。 如果您想要手动选择频道,请勿设置自动频道选择。

    函数READ_Data():两个注释

    A)左移MSB 8位或lsb数据的结果

    B)如果未设置标签,则每个SPI读取16个SCLK周期是正常的。 如果使用自动信道,则需要标记,因此您需要24个SCLK周期。 请参见数据表中的下表7

    谢谢!

    Vishy

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

    您好,Vishi,

    感谢您的留言。

    我已经做了更改,但在我的SPI交换中仍接收到零来读取CFR寄存器。

    /*********************************
    ADS8332读取CFR
    ********* /

    UINT16_t READ_CFR (void){

    PORTC.OUTCLR = PIN4_BM;
    SPI_Data_Transfer (0b1100万);
    SPI_Data_Transfer (0x00);
    UINT8_t MSB = SPI_Data_Transfer (0x00);
    UINT16_t fullCFR =(((uint16_t) MSB<8)| SPI_Data_Transfer (0x00);
    PORTC.STEINT= PIN4_BM;
    返回fullCFR;

    }

    这可能是电源问题吗? 我使用的是原始ADS8332,它需要10V电源,但我绕过了运算放大器和稳压器,这样5V就足够了。 我只为J3插头提供电源和接地连接。 我是否也应该对J2收割台进行接地连接?

    这是我正在使用 http://www.ti.com/lit/ug/sbau176a/sbau176a.pdf的用户指南

    谢谢!

    Mitch

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

    >>>>> 我使用的是原始ADS8332,它需要10V电源,但我绕过了运算放大器和稳压器,这样5V就足够了。 我只为J3插头提供电源和接地连接。 我是否也应该对J2收割台进行接地连接?

    请参阅第 12页的示意图:LDO TL750L05的输出电压为+5VA。 此LDO由+10V电源供电。 如果您没有在3.1 上提供+10V,我不是很清楚您如何为ADS8332设备供电。 请参阅下面的原理图片段

    >>>我是否也应该对J2管座进行接地连接?

    是:从MCU,您应该将SPI线路和接地连接到J2接头。

    请上传一个简单的示意图,显示接头J3的电源连接和接头J2的MCU SPI线路连接。 另外,指定您正在使用的跳线设置。

    在READ_CFR函数中,仅执行16位传输:在16位SPI传输后使CSB达到高水平。 串行接口在CPOL =1,CPHA =0的情况下工作:MCU可以读取下降沿上的数据。 请参见下图

    您是否还可以在SPI线路上连接示波器探测器并检查写入和读取访问是否正常? 请上传写和读访问权限的示波器截图。

    谢谢!

    Vishy

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

    您好,感谢您的帮助,

    您帮助我为设备供电。 我有一个+/-12V电源,现在可以很好地读取CFR寄存器和ADC标签位。 所以我知道SPI读/写工作正常。

    我在读取转换结果时遇到一些困难。 我注意到在我的READ_Data函数中,在第三个SPI传输中,我可以读取标签位。 4,5,6,7等,但我无法获得数据。 我预计16位数据将在第一个和第二个SPI传输中出现,但我得到了所有零。 如果问题不大,您是否介意查看我的READ_Data函数? 在第一次SPI传输时,我给CMR 4位读取数据命令(1101b),然后发送零以返回结果。 前两个SPI传输(MSB和lsb)是我预期获得16位数据的位置,第三个SPI传输(xlsb)是我获取标记位的位置。 CFR设置为0001 1111,因此手动通道选择,SCLK/2和自动触发,以避免目前使用CONVST引脚。

    /*********************************
    ADS8332读取数据
    ********* /

    UINT16_t读取数据(无效){

    PORTC.OUTCLR = PIN4_BM;                //降低SS
                                           //可能应该有一个while循环来等待数据准备就绪(可以使用INT Pin或其他方式来等待EOC)
    UINT8_t MSB = SPI_Data_Transfer (0b1101万);//我认为这将返回8 MSB的数据。 我还将1101b读取数据命令以位15:12的形式发送到CMR
    UINT8_t lsb = SPI_Data_Transfer(0x00);        //我认为这是8 lsb的数据
    UINT8_t xlsb = SPI_Data_Transfer(0x00);       //此字段的前3位是标记位,因此必须将其位移>>5(0bttt0万)
    PORTC.STEINT= PIN4_BM;               //提高SS
    返回xlsb;                               //现在只返回xlsb中的标记位

    }

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

    您好,

    不清楚何时调用"Read_Data"函数。 您应该监控状态引脚,并在转换完成时调用函数"READ_Data"。 例如,您可以在CFR_D6位中将状态引脚编程为中断输出,还可以在CFR_D7中对该位的极性进行编程。 当确定状态引脚中断时,调用函数"READ_Data"。  请参见下面的状态计时图(此处INT\处于活动低电平状态,因此您在INT\变为低电平后阅读)

    谢谢!

    Vishy

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

    您好,Vishi,

    感谢您的回复,您的帮助非常出色。

    我的过程或伪代码是我

    1.将CFR初始化为0xc6bd

    2.使用0x0000选择通道零

    3.然后,在main的while循环中,检查中断

    4.使用0xd0万轮询/读取该循环中的24位数据

    CFR读取正常,但我无法获取数据。 检查状态引脚后,发送3个SPI交换(第一个使用0xd0,第二个使用垃圾字节,第三个使用垃圾字节)以获取数据是否正确? 现在,无论我如何更改频道,我都会收到0xffffff0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mitchell,
    我找到了此设备的一些基本示例代码。 请接受我发送的朋友请求,以便我将密码发送给您。 看看这个例子,看看它是否有帮助。
    谢谢!
    Vishy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上,下面的链接中有一个应用说明和相关的示例代码

    www.ti.com/.../litabsmultiplefilelist.tsp

    如果您在访问链接时遇到问题,请告诉我。

    谢谢!
    Vishy