diff --git a/source/spi_dev/spi4test b/source/spi_dev/spi4test index dc45c6a..3495e9b 100755 Binary files a/source/spi_dev/spi4test and b/source/spi_dev/spi4test differ diff --git a/source/spi_dev/spi4test.c b/source/spi_dev/spi4test.c index 04ad170..16f18a4 100755 --- a/source/spi_dev/spi4test.c +++ b/source/spi_dev/spi4test.c @@ -27,14 +27,21 @@ /* ========== SPI配置(必须与MCU主设备完全一致)========== */ #define SPI_DEVICE "/dev/spidev4.0" -#define SPI_MODE SPI_MODE_0 /* CPOL=1, CPHA=1 */ +#define SPI_MODE SPI_MODE_2 /* CPOL=1, CPHA=1 */ #define SPI_BITS 8 #define SPI_SPEED 1000000 /* 1MHz */ -#define FRAME_LEN 128 /* 每帧64字节 */ +#define FRAME_LEN 128 /* 每帧256字节 */ /* ===================================================== */ static volatile int keep_running = 1; +static int is_all_zero(const uint8_t *buf, int len) { + for (int i = 0; i < len; i++) + if (buf[i] != 0) + return 0; + return 1; +} + void sigint_handler(int sig) { (void)sig; keep_running = 0; @@ -43,7 +50,13 @@ void sigint_handler(int sig) { int main(void) { - uint8_t buf[FRAME_LEN]; + uint8_t rx_buf[FRAME_LEN]; + uint8_t tx_buf[FRAME_LEN] = {0xAA, 0xBB, 0xCC, 0xDD}; + tx_buf[FRAME_LEN-4] = 0x11; + tx_buf[FRAME_LEN-3] = 0x22; + tx_buf[FRAME_LEN-2] = 0x33; + tx_buf[FRAME_LEN-1] = 0x44; + int fd, ret; unsigned int frame_count = 0; @@ -105,32 +118,44 @@ int main(void) /* 6. 循环接收数据 */ while (keep_running) { - memset(buf, 0, FRAME_LEN); - ret = read(fd, buf, FRAME_LEN); + memset(rx_buf, 0, FRAME_LEN); + + struct spi_ioc_transfer tr = { + .tx_buf = (unsigned long)tx_buf, + .rx_buf = (unsigned long)rx_buf, + .len = FRAME_LEN, + .speed_hz = SPI_SPEED, + .bits_per_word = SPI_BITS, + }; + ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { - perror("read"); + perror("spi transfer"); break; - } else if (ret == 0) { - /* 非阻塞模式可能返回0,但这里用了阻塞模式,一般不会出现 */ - //continue; } + ret = FRAME_LEN; /* transfer 成功则返回 FRAME_LEN */ frame_count++; + + /* 只有 tx 或 rx 数据不全为零时才打印 */ + if (is_all_zero(tx_buf, FRAME_LEN) && is_all_zero(rx_buf, FRAME_LEN)) + continue; + printf("\n========== Frame #%u (%d bytes) ==========\n", frame_count, ret); - printf("HEX : "); - for (int i = 0; i < ret; i++) - printf("0x%02X ", buf[i]); - printf("\n"); - printf("ASCII: "); - for (int i = 0; i < ret; i++) - printf(" %c ", (buf[i] >= 0x20 && buf[i] < 0x7F) ? buf[i] : '.'); - printf("\n"); + if (!is_all_zero(tx_buf, FRAME_LEN)) { + printf("TX HEX: "); + for (int i = 0; i < ret; i++) + printf("0x%02X ", tx_buf[i]); + printf("\n"); + } + + if (!is_all_zero(rx_buf, FRAME_LEN)) { + printf("RX HEX: "); + for (int i = 0; i < ret; i++) + printf("0x%02X ", rx_buf[i]); + printf("\n"); + } - printf("DEC : "); - for (int i = 0; i < ret; i++) - printf("%3d ", buf[i]); - printf("\n"); printf("=========================================\n"); }