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.

[参考译文] ADS8689:pic16f15356 ADS8689 SPI 问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1529390/ads8689-pic16f15356-ads8689-spi-issue

器件型号:ADS8689
主题中讨论的其他器件:MUX36S08

工具/软件:

您好:
目前是一名学习 PIC 微控制器的学生。

我正在处理一个工程、但是使用 SPI 通信器件遇到了困难、因此、很荣幸能邀请您提供建议。
首先、提前感谢您的帮助。

当前硬件配置
8 通道 4–20mA 电流传感器输入

每个通道的电流通过 250Ω 电阻器转换为电压(确认工作正常)

使用 MUX36S08 选择通道、该器件通过 MCU 的光耦合器进行控制

所选电压由 ADS8689 读取、ADS8689 通过 SPI 将数字电压发送到 MCU

MCU 通过 RS232 通信将传感器读数发送到终端


使用 MCU pic16f15356


电流终端输出(当前代码)


CH0 = 0
CH1 = 0
CH2 = 0
CH3 = 0
CH4 = 0
CH5 = 0
CH6 = 0
CH7 = 0

所有通道当前都显示值 0。(传感器 4mA 是通道 1 的输入)


我检查过的内容
→250Ω 电阻后传感器的电流输入为 2 μ A 电压

MUX36S08 控制正常工作(确认每通道的电压输出)

整个硬件电源正常运行


通过示波器测量 SPI 信号:

CS:峰峰值 4.6V /平均 2.20V

CLK:峰峰值 4.4V /平均 1.20V

MISO:峰峰值 1.92V /平均 160mV

MOSI:pk-pk 180mV /平均 12.0mV→太弱、疑似问题

ADS8689 引脚 9 (RST) 通过电阻器上拉至 3.3V、但未连接到 MCU


当前问题
尽管 RS232 通信似乎正常工作、但我不确定问题是在于 SPI 通信还是其他地方。

如果您能查看我的代码并告诉我是否需要任何更正或改进、尤其是在 SPI 通信和初始化方面、我将不胜感激。

ADS8689 RST 引脚可能是问题吗?

非常感谢您的时间和支持。

#include <16F15356.h>
#include <stdint.h>

#device ADC=10
#use delay(internal=8MHz)

//Hardware SPI settings
#pin_select SCK1 = PIN_C3
#pin_select SDI1 = PIN_C4  // ADS8689 MISO
#pin_select SDO1 = PIN_C5  // ADS8689 MOSI
#use spi(MASTER, SPI1, MODE=0, BITS=8, BAUD=500000, STREAM=SPI_1)

//RS232 Settings
#pin_select U1TX = PIN_C6
#pin_select U1RX = PIN_C7
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=UART1)

//Chip Select Pin
#define ADS8689_CS PIN_C2

// MUX36S08 Control pin definition
#define MUX_A0  PIN_A0
#define MUX_A1  PIN_A1
#define MUX_A2  PIN_A2

// MUX Channel selection function(0-7)
void MUX36S08_Select(uint8_t ch)
{
   output_bit(MUX_A0, bit_test(ch, 0)); // A0
   output_bit(MUX_A1, bit_test(ch, 1)); // A1
   output_bit(MUX_A2, bit_test(ch, 2)); // A2
}

//ADS conversion value reading function
uint16_t ADS8689_ReadADC()
{
   uint8_t msb, lsb;

   output_low(ADS8689_CS); delay_us(1);

   //Send NOP command
   spi_xfer(SPI_1, 0x00);
   spi_xfer(SPI_1, 0x00);
   spi_xfer(SPI_1, 0x00);
   spi_xfer(SPI_1, 0x00);

   output_high(ADS8689_CS); delay_us(5);

   //Receive transformation values in the next frame
   output_low(ADS8689_CS); delay_us(1);

   msb = spi_xfer(SPI_1, 0x00);  // D[31:24]
   lsb = spi_xfer(SPI_1, 0x00);  // D[23:16]
   spi_xfer(SPI_1, 0x00);        // D[15:8] (ignore)
   spi_xfer(SPI_1, 0x00);        // D[7:0]  (ignore)

   output_high(ADS8689_CS); delay_us(1);

   return ((uint16_t)msb << 8) | lsb;
}

void main()
{
   uint8_t ch;
   uint16_t adc;

   delay_ms(100);
   printf("\r\n<MUX36S08 + ADS8689 Start testing>\r\n");

   while(TRUE)
   {
      for(ch = 0; ch < 8; ch++)
      {
         MUX36S08_Select(ch);
         delay_ms(10);  //wait for stabilization

         adc = ADS8689_ReadADC();  //Read conversion value
         printf("CH%u = %lu\r\n", ch, adc);

         delay_ms(500);
      }
   }
}

                 SPI_MOSI                                           SPI_MISO

               SPI_SCK                                            CS_pin

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

    您好、Song、

    欢迎来到我们的 e2e 论坛!  您是否可以使用四通道镜?  请将/CS、SCLK、MOSI 和 MISO 一起捕获。

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

    波形在直流 2V 设置的基础上看起来像这样。

    但是、MOSI 波形最初不显示。

    当我将示波器调整为直流 200mV 时、波形变得可见。

    此波形来自 ADS8689、该 ADS8689 通过 SPI 与 STM32 正常通信。
    但是、我不确定应该检查哪个部分。

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

    您的/CS 看起来已反转 — 它必须为低电平,而 SCLK、SDI 和 SDO 处于活动状态。  MOSI 图片显示来自 SCLK 的噪声拾取。  如果您的控制器未发出正确的命令、则问题出在控制器方面。  您是否有合适的 PCB、或者是否使用试验电路板和飞线?  

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

    我们目前正在使用制造的 PCB 样片进行测试。
    从硬件的角度来看、我们已确认电压电平和接线连接都正确。

    底部的示波器波形显示了 STM32 MCU 和 ADS8689 之间的 SPI 通信。
    在此波形中、当 CS 线路处于高电平状态时、观察到数据。
    这是否与我们遇到的问题有关?

    此外、如果您能查看代码并告诉我们是否有需要修改的部分、我们将不胜感激。

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

    您能否提供有关在代码中设置 CS 时序的最佳方法的建议?

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

    歌曲、

    如果在 ADS8689 正在接收 MOSI 和 SCLK 时/CS 为高电平、则会出现 SDO。  当/CS 为高电平时、ADC 的输出处于 tri 状态。  从伪代码的角度来看、您需要:

    清除 /CS 低电平

    发送 MOSI 以生成 SCLK

    接收 MISO

    将/CS 设置为高电平

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

    如果我根据您建议的方法对此类代码进行修改、会有帮助吗?

    uint16_t ADS8689_ReadADC()
    {
       uint8_t msb, lsb;
    
       output_low(ADS8689_CS); delay_us(1);
    
       // Send NOP command
       spi_xfer(SPI_1, 0x00);
       spi_xfer(SPI_1, 0x00);
       spi_xfer(SPI_1, 0x00);
       spi_xfer(SPI_1, 0x00);
    
       // Receive conversion values in the next frame
       msb = spi_xfer(SPI_1, 0x00);  // D[31:24]
       lsb = spi_xfer(SPI_1, 0x00);  // D[23:16]
       spi_xfer(SPI_1, 0x00);        // D[15:8] (ignore)
       spi_xfer(SPI_1, 0x00);        // D[7:0]  (ignore)
    
       output_high(ADS8689_CS); delay_us(1);
    
       return ((uint16_t)msb << 8) | lsb;
    }

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

    这应该有所帮助!

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

    我将尝试应用它、然后提供反馈。
    非常感谢!