feat(spi):update spi mode to MODE_2 to match MCU
This commit is contained in:
Binary file not shown.
@@ -27,14 +27,21 @@
|
|||||||
|
|
||||||
/* ========== SPI配置(必须与MCU主设备完全一致)========== */
|
/* ========== SPI配置(必须与MCU主设备完全一致)========== */
|
||||||
#define SPI_DEVICE "/dev/spidev4.0"
|
#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_BITS 8
|
||||||
#define SPI_SPEED 1000000 /* 1MHz */
|
#define SPI_SPEED 1000000 /* 1MHz */
|
||||||
#define FRAME_LEN 128 /* 每帧64字节 */
|
#define FRAME_LEN 128 /* 每帧256字节 */
|
||||||
/* ===================================================== */
|
/* ===================================================== */
|
||||||
|
|
||||||
static volatile int keep_running = 1;
|
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 sigint_handler(int sig) {
|
||||||
(void)sig;
|
(void)sig;
|
||||||
keep_running = 0;
|
keep_running = 0;
|
||||||
@@ -43,7 +50,13 @@ void sigint_handler(int sig) {
|
|||||||
|
|
||||||
int main(void)
|
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;
|
int fd, ret;
|
||||||
unsigned int frame_count = 0;
|
unsigned int frame_count = 0;
|
||||||
|
|
||||||
@@ -105,32 +118,44 @@ int main(void)
|
|||||||
|
|
||||||
/* 6. 循环接收数据 */
|
/* 6. 循环接收数据 */
|
||||||
while (keep_running) {
|
while (keep_running) {
|
||||||
memset(buf, 0, FRAME_LEN);
|
memset(rx_buf, 0, FRAME_LEN);
|
||||||
ret = read(fd, buf, 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) {
|
if (ret < 0) {
|
||||||
perror("read");
|
perror("spi transfer");
|
||||||
break;
|
break;
|
||||||
} else if (ret == 0) {
|
|
||||||
/* 非阻塞模式可能返回0,但这里用了阻塞模式,一般不会出现 */
|
|
||||||
//continue;
|
|
||||||
}
|
}
|
||||||
|
ret = FRAME_LEN; /* transfer 成功则返回 FRAME_LEN */
|
||||||
|
|
||||||
frame_count++;
|
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("\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: ");
|
if (!is_all_zero(tx_buf, FRAME_LEN)) {
|
||||||
|
printf("TX HEX: ");
|
||||||
for (int i = 0; i < ret; i++)
|
for (int i = 0; i < ret; i++)
|
||||||
printf(" %c ", (buf[i] >= 0x20 && buf[i] < 0x7F) ? buf[i] : '.');
|
printf("0x%02X ", tx_buf[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
printf("DEC : ");
|
if (!is_all_zero(rx_buf, FRAME_LEN)) {
|
||||||
|
printf("RX HEX: ");
|
||||||
for (int i = 0; i < ret; i++)
|
for (int i = 0; i < ret; i++)
|
||||||
printf("%3d ", buf[i]);
|
printf("0x%02X ", rx_buf[i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
printf("=========================================\n");
|
printf("=========================================\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user