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.

[参考译文] ADS8686S:无法从 ADS8686S 读取数据

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1377105/ads8686s-unable-to-read-data-from-the-ads8686s

器件型号:ADS8686S
主题中讨论的其他器件:AM625

工具与软件:

您好!

我正在尝试使用 AM625电路板中的 SPIdev0.0从 ADS8686S 中读取数据。我们使用的是 ADS8686S-EVM。

 我已经将 SER/BYTE/PAR 引脚连接到逻辑高电平(3.3V)、将 DB9连接到逻辑低电平(GND)以选择串行接口模式。 DB4连接到 GND 以选择1线模式。

下面是我尝试从寄存器读取数据的测试代码。

#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>

#define SPI_DEVICE "/dev/spidev0.0"  // SPI device path (change according to your setup)

int main() {
    int fd;
    unsigned char tx_buffer[2] = { 0x20, 0x00 };  // Example TX buffer (send 4 bytes of 0x00)
    unsigned char rx_buffer[2] = { 0 };  // RX buffer to store received data
    struct spi_ioc_transfer transfer = {
        .tx_buf = (unsigned long)tx_buffer,
        .rx_buf = (unsigned long)rx_buffer,
        .len = sizeof(tx_buffer),
        .delay_usecs = 0,
        .speed_hz = 10000000,  // SPI clock speed in Hz (adjust as needed)
        .bits_per_word = 8,
    };

    // Open SPI device
    fd = open(SPI_DEVICE, O_RDWR);
    if (fd < 0) {
        perror("Error opening SPI device");
        return -1;
    }

    // Perform SPI transfer
    if (ioctl(fd, SPI_IOC_MESSAGE(1), &transfer) < 0) {
        perror("Error in SPI_IOC_MESSAGE");
        return -1;
    }

    // Perform SPI transfer
    if (ioctl(fd, SPI_IOC_MESSAGE(1), &transfer) < 0) {
        perror("Error in SPI_IOC_MESSAGE");
        return -1;
    }

    // Display received data (optional)
    printf("Received data:");
    for (int i = 0; i < sizeof(rx_buffer); i++) {
        printf(" 0x%02X", rx_buffer[i]);
    }
    printf("\n");

    // Perform SPI transfer
    if (ioctl(fd, SPI_IOC_MESSAGE(1), &transfer) < 0) {
        perror("Error in SPI_IOC_MESSAGE");
        return -1;
    }

    // Display received data (optional)
    printf("Received data:");
    for (int i = 0; i < sizeof(rx_buffer); i++) {
        printf(" 0x%02X", rx_buffer[i]);
    }
    printf("\n");

    // Close SPI device
    close(fd);

    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <linux/spi/spi.h>

#define SPI_DEVICE "/dev/spidev0.0" // SPI device node

int main() {
    int spi_fd;
    uint16_t reg_address = 0x0400;
    uint16_t tx_buffer[1] = {0x2000}; // Transmit buffer
    uint16_t rx_buffer[1] = { 0x0000}; // Receive buffer

    // Open SPI device
    spi_fd = open(SPI_DEVICE, O_RDWR);
    if (spi_fd < 0) {
        perror("Error opening SPI device");
        return 1;
    }

    // SPI mode (0, 1, 2, or 3)
    uint8_t mode = SPI_MODE_0;

    // Set SPI mode
    if (ioctl(spi_fd, SPI_IOC_WR_MODE, &mode) < 0) {
        perror("Error setting SPI mode");
        return 1;
    }

    // Set SPI mode
    if (ioctl(spi_fd, SPI_IOC_RD_MODE, &mode) < 0) {
        perror("Error setting SPI mode");
        return 1;
    }

    uint8_t bits_per_word = 16;

    if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &bits_per_word) < 0) {
        perror("Error setting SPI bits per word");
        return -1;
    }

    if (ioctl(spi_fd, SPI_IOC_RD_BITS_PER_WORD, &bits_per_word) < 0) {
        perror("Error setting SPI bits per word");
        return -1;
    }


    // SPI clock speed (Hz)
    uint32_t speed_hz = 40000000; // 15MHz

    // Set SPI clock speed
    if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed_hz) < 0) {
        perror("Error setting SPI clock speed");
        return 1;
    }

    // Set SPI clock speed
    if (ioctl(spi_fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed_hz) < 0) {
        perror("Error setting SPI clock speed");
        return 1;
    }



    // Populate tx_buffer with data to be sent (if necessary)
    //     // Read data from SPI device
    if (write(spi_fd, tx_buffer, 2) != sizeof(tx_buffer)) {
        perror("Error reading from SPI device");
        return 1;
    }


    // Read data from SPI device
    if (read(spi_fd, rx_buffer, 2) != sizeof(rx_buffer)) {
        perror("Error reading from SPI device");
        return 1;
    }

    // Read data from SPI device
    if (read(spi_fd, rx_buffer, 2) != sizeof(rx_buffer)) {
        perror("Errostatic ssize_t");
        return 1;
    }


    // Print received data
    printf("Received data: ");
    for (int i = 0; i < sizeof(rx_buffer); i++) {
        printf("%02x ", rx_buffer[i]);
    }
    printf("\n");

    // Close SPI device
    close(spi_fd);

    return 0;
}

我已尝试过这两种方法、但 Rx_BUFFER 中的值始终为0。

请检查此问题。

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

    您好、naveenkumar、

    您能否发布一个原理图片段、其中显示了与 ADS8686S 的连接以及显示您的控制线路的范围或逻辑分析仪图?  函数帮助、但图片值一千行代码...