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.

[参考译文] ADS131M03:SPI 问题 Attiny84和 amp;ADS131M03

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1283662/ads131m03-spi-issues-attiny84-ads131m03

器件型号:ADS131M03

大家下午好!
我正在执行一个学生项目、其中我需要 使用 Attiny84微控制器从3通道 ADC ADS131M03获取数据。

我的问题是、我无法从任何寄存器中读取任何数据、甚至无法了解问题是在电路设计还是程序代码中。
请帮我弄清楚这一点。



原理图中。

Attiny84 -> ADS131M03  

MOSI   -> DI

MISO   ->操作

SCK    -> SCLK

CKOUT -> CLKIN

GND   -> CS

当我使用 SPI 总线对微控制器以及其他器件进行编程时、我手动切换 CS

我使用 Arduino IDE 设计代码和" Arduino 作为 SPI"编程器。

此外、我还使用 AVRDUDE 对 Attiny84的熔丝进行编程。

在我的代码中、我将逐一读取所有23个寄存器、并将此数据发送到串行端口。

我的代码:

#包含
#包含

//定义
#define rxPin 9
#define txPin 10
SoftwareSerial mySerial (rxPin、txPin)

uint8_t reg = 0x00
//函数
//将24位字传输到  ADS131M03  
uint32_t spiTransferWord (uint16_t inputdata)
 uint32_t data = spi.transfer (inputdata >> 8)
 数据<<= 8
 data |= spi.transfer ((inputdata<<8)>> 8)
 数据<<= 8
 data |= spi.transfer (0x00)

 返回数据<< 8
//  使用 RREG 命令从 ADS131M03读取1个寄存器
uint16_t readSingleRegister (uint8_t reg)
 uint8_t 命令 Pref = 0x0A

 //使用数据表中的语法生成命令字101a AAAA a000 0000
 uint16_t 命令 Word =(commandPref << 12)|(reg << 7)

 uint32_t responseArr[5]

  //发送第一个字中的命令
 responseArr[0]= spiTransferWord (commandWord);

 //对于接下来的3个字,只需读取数据
 对于(uint8_t i = 1;i < 5;i++)
  responseArr[i]= spiTransferWord (0)
 

 //安全寄存器数据
 responseArr[0]= spiTransferWord (0)

 返回(responseArr[0]>>8) //从响应中提取16位数据

void setup(){
 mySerial.begin(1200);
 mySerial.println ("程序已启动")

 SPI.begin();
 SPI.setDataMode(SPI_MODE1);

void loop(){
 REG++;
 if (reg >23){
  寄存器= 0
 

 uint16_t reg_data = readSingleRegister (reg)

 mySerial.print ("注册数据:0x")
 mySerial.println (reg、hex)
 mySerial.print ("注册数据:0x")
 mySerial.println (reg_data、hex)

 mySerial.println ("***** ")
 延迟(1000)



根据我的理解、我需要发送一个包含16位命令的24位字。
然后发送任何命令以获得5个响应字、第6个字应为寄存器数据。

我对 Attiny84的 CKOUT Fuse 进行编程、以 将(PCINT10/INT0/OC0A/OCKOUT) PB2引脚设置为8MHz 的频率发生器。  
没有示波器来检查此信号 质量。


ADC CS 与 GND 的结果://一些随机值
CS of ADC to VCC 的结果://seros
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     

    为了正确调试此类问题、必须监控通信线路、这样您就可以验证硬件是否有任何问题、因此我建议您使用示波器或逻辑分析仪检查通信情况。

    除此之外、我确实注意到了一个小的逻辑错误:

    uint32_t spiTransferWord (uint16_t inputdata)
     uint32_t data = spi.transfer (inputdata >> 8)
     数据<<= 8
     data |= spi.transfer ((inputdata<<8)>> 8)
     数据<<= 8
     data |= spi.transfer (0x00)

     返回数据<< 8
    [/报价]

    您的 spiTransferWord 函数似乎有额外的字节移位、因此数据的回读始终是左对齐的。

    列维德弗里斯

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

    您好!

    自上次以来、我改变了 MOSI 和 MISO 之间的连接。 最初、它连接不正确。
    这纠正了完全随机值的误差、因为微控制器的 DO 连接到 ADC 的 DO。
    我是在示波器的帮助下发现这个问题的、因为 Attiny84微控制器的 MOSI 意外地为 DI、而 MISO 为

    但是、现在我有一个不同的问题。
    我可以使用示波器、这就是我得到的:


    CLKIN ADC 输入上的1MHz 信号。

    来自数据表的建议运行条件

    fCLKIN 外部时钟频率

    ---------------- ---------------- ---------------- ---------------- +
    |模式               |最小值(MHz)|标称值(MHz)|最大值(MHz)|
    ---------------- ---------------- ---------------- ---------------- +
    |高分辨率模式 |0.3            | 8.192         | 8.4             |
    ---------------- ---------------- ---------------- ---------------- +

    ADC 的 CS 始终接地  

    遗憾的是、我只有一个双通道示波器。 因此、我将发送不同的 MOSI (CH2)+ CSK (CH1)图片和 MISO (CH2)+ CSK (CH1)测量视频。

    通道的 MOSI 桥臂上的高脉冲信号。
    我发送一个24位字命令来每秒读取寄存器0x00 (A0 0000)一次

    在不同的刻度上与上一页相同。

    https://youtu.be/RutCUdXQ6C4

    https://youtu.be/RutCUdXQ6C4

    介绍 SCLK + MISO 测量的视频

    如上所述、每秒一次、我发送一个24位字(0xA0 0000)的读取命令、然后在这个字之后、我再发送4个带零的字来完成一个5字帧、+1个字、在此期间我希望获得响应。 不过、每次我从 ADC 获得不同的数据时、即使该命令有时是相同的。

    "我不知道,我不知道你在胡说什么。"

    此致。

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

    您好!

    您是否可以尝试 仅使用一个完整帧来发送命令? 器件要求使用您已配置的读取命令每帧只有5个字、因此如果您操作器件、而中断与此类似的帧、则可能会破坏通信。 为此、您可以等待每帧的整个一秒超时、或者将帧之间的 CS 线路拉高。

    此外、我无法从示波器屏幕截图中读取 MISO 数据、如果您可以放大比例或提供整个帧的数据读出、我认为此信息将有助于调试。

    谢谢。

    列维德弗里斯

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

    您好!

    我意识到问题是什么。 我每次收到一个响应0xFF23。 在数据表中、我意识到这是 ADC 复位信号。 问题是、我没有意识到连接到 ADC RST 的微控制器输出始终为0。
    我用代码修复了它、现在一切都正常。

    在一天结束时、我有3个错误。   
    1)我连接 MOSI 和 MISO 不正确。
    2) 2)我没有指定微控制器输出为高电平以防止 ADC 复位。
    3)正如你正确地说-向左移8位是绝对没有必要的。

    帧之间的延迟是不必要的、显然 ADC 本身决定了5个字的限制。  

    非常感谢您的帮助!
    现在我必须编写一个代码、以便获取测量结果和

    此致、Ihor Shybka