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.
工具与软件:
您好!
我正在尝试使用 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 的连接以及显示您的控制线路的范围或逻辑分析仪图? 函数帮助、但图片值一千行代码...