From a699f03d72de22fc842f129658c5110e35b40f9e Mon Sep 17 00:00:00 2001 From: "zhimin.liu" Date: Thu, 2 Jul 2026 14:38:23 +0800 Subject: [PATCH] feat(spi):update spi mode to MODE_2 to match MCU --- source/spi_dev/spi4test | Bin 20064 -> 20056 bytes source/spi_dev/spi4test.c | 67 ++++++++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/source/spi_dev/spi4test b/source/spi_dev/spi4test index dc45c6a238885fbf5c8cb1e8832eb39226c0e967..3495e9bcf7354683e9097650796e6d00b2ddf34b 100755 GIT binary patch delta 4165 zcmb_feQZ@d9el8zQ7CJ@=R`?7=X4 z*fYU8w>_$J+bbmPwZ+hjS@uR*8I9&scTq3JXO)LMPU1?a&!f(G$9$(3O{L~}wGk(R z4s@th*r@t2q59ZbWU80#Ktqk=O`5+<@+L1h?rNfmO_s&iyo z9ZgR=XzZY|gT{_m($g0Tg`=0LrvS#_W_(5mcx3|fB~^Zt8EJrtAkiqmKXL%w6zp)& z#B!&1-v4GX(q-}CjE*`e1h$F3C$-og*yl34;X z`4Y$$0+1~Qs4@eoY`#RF(Exq~php4#dlF<02!pat^LiE>;4w)*PrO;8XUV0~CJ8i3pbl8Y7*8L8rkae9WiXbF32>9ZfpM=1{B0Yo z{|>Ot7T9NC<(iBdfwfX#UF2BpKkPEu$X+wK8nWgaHei|n)55!!`vK|^!zln43P4I- z6-9YRgkx5O4P5UoXKi^MmkXO;w~g8pwKQR6U?gHxNIubQluDlDF2OU}7E2deY=}^@1)tDj~bBle?wHh~Q zEFJp0jiB%i_}?F@8pKRHaoGCfC^X$4-wo^Q< zcNrRq8b`RHxG)swhLn2@9pV^q5jpARiRY)vw)3cMC`n3IbY|2TBt9iB8@j!$GaZ~R zbn|oBZ|SAFW{2LiZa{wdpjq0)mS_BBVWo86z)o#&Z~yLn-`>6#yDPp>-`%6NZ|G^( z2;6Fo`qMJS{6b=zRNc2UbuMs^< z^q)j0h~6Z6jp(M23x!)m4-&1R>;2ZPLZOxD!CAt=HSR#$w+NA6B@ipAN%1% zav3!))2VaItwed#sPi>WG~5ras3Kbq8u3;|{V;V0$*gBKR<3O;2fEt;Mya>s1@{9> zenVUjX&mIsV&xOcPaBReQx~y!|5gs%?ltP?(d7vh`N&sCrp?n?8gV;y5(CidU{RW} z+EzhJ1$7qd7RTRp-bOK4+qWvG=)?mQSziF3L$^43aII!4xael3YF2Fv*m6yU#0sNt0MM6g?AfhU|d z88zQ7-bOJU47s#2-5MRjOUz3@UECg@@Kj*I7*3HM2(<3Zvc+ld=wmWfEkE@KHu8my8Pk#_(Kt z0h-K#V{6=gIV*Q$OlY0AwG<6|*KT4t>|a~07J-T5YrV{eQ#2}pVWM8zUp{j2-41)% zb!#-AN`4ECH2PMnRAHE=(I{b7s})qT=V(-ic^Y{jMf5qAz&%Y~Hb~#<%<-nh6hDqf zyp=DApQIwEFpuE}ky=W;t2xfPaZ9t;FXNUw9JF+~2kB;R^QGnxdCd7S%o9I=o))iv zKx9b*f0Y;o%3y@dRK(ItdM zi|I;mz!d(g)$f;;FBPP(2@JM{{3qwE^w3HMJd&MlOIZMoHm|?Yl2yUSi((SQq7fXY z*-bRdFGu-5g;eRoskXo}S#?tSBxzUjT@aDTj698=s5iNg{%g^|3yC>m0AFWjA z%ogjyyiMNWv#7;BnZI*iU;nOMec#=__lb=E(Gx85$8{GOj%*lV?HJn_a^)1=T9U&9 z8^az`j7-AitqI3BhCK2u^NF&03Ryhl85XbBu#hgqSUlt!6Vfp}5D&X1#ApJu@$l_; z?z&i^A!`r0r0-6Qw1+*ivbAE{0~6Ejp-P!#>)&RY7%j%v+gG||!Hwcfd)OuS^*ly8 z!X9~W>corHi|LM#CnfI1l#njZjCVvC+mEa>T*ra4!D)@-sYtqWJsRT4c2GNK}AzG)XqKzsUS5*VWT;I&j z@NrH4?3`xbypQ?Kn>RCW<}QvgXN--O>WOR%cyYe~aeLK-uU!{1XtzHM`}TWW=4I5` zk3*LWT<&s#+e6VVR}5X4Vt>fXCoY%jVyb!goaalrk6JlYv#H)g74Wy7-Dqj0Y%?}% zVOEE_W@J4{3KP$`yc}5{f^6J_Lv7ImQU}ab6|7R|(Gx)r?8JM8w|0b!4+s;(kQ9z!Jlq z&JF_K;evJF0k-Fhz@{U1M1r+Ru+to@_1R8`jX&iSkpnF*-U#81Naw!!xp>1ogf;g4 z5^#eAe2V~SmUql>O3aWCc(=2zyoJl}8q}3HkX%G`yvD9n?ReBKSM6a^tdI<&H4(;8 zD-3wZFKbXKLO;ZcNLM&ZvJla~XsnXLUpcFJD@C7pt-XYBoE=tlmgFu@on69ZMONyT zEM8~(Nyhx{J{X4SIy+Z70OSl)ZL{9Kc~g4t)Z71|b}x_0V_ShaOxA#Iw%KU&0n$ey zMY*HcIhsh#(%@!qyyn(ytVa71AMmIIB->eP^9@J`aQE(;=`M>UIxi~Bc%yxeV@^QI z;FuG`w?TtL(BDQo)|t3N_8IFxOf$GsMwzjAIxEq6%ZWsz{SJ3xLOMa=z2uX|$2r37H=#w~Hfv za6a9|mn9+W5}gZ!e-e3RVelQ1Bd{W`ifu`LBQN4{lkHf+m#bPgZ8yzY6RHMQR;}A^ zLh~anZEeJxD<3mWTAPP9wFv#n^*x*gWPTG9`97XJ*ix;ogD6k^WB*R4Y0p6JXX*41 z(R!kkcwva>8$^#0Jw7NMu~H1A)W5P@A-obs|iV5HqF_~c=BIO z^;wct5#@!;EUIsitez+@CRN^N20!%QU-A)Y=vok^jJ`jm`W~**m##cUEv_x&>gN0@ z_S(I#muOk+<4gI#@!z9*5ueb*SwKFmNWP|T&BZA_9v#iGNJY1&q@)#v-%z~dx&*96 zmT2Wkz6V3gc2%G9xY8^st?{}%U1*|Q@mPW`7GDYm9$(hPYVhi^pq`WE>iE6N%N&M+ zVK#%?f#w;thtx<;1Acl&j`=_c;n*v?L2_eR=|a0O3pH2C@xmklR~8noh^^YQhM7y-2_ zWDo?==-p+}S{W=(-x4hk5;#I!4~i|e;U*r88vAN& zQhN^dIwLSA`x_-4qbq&$%!e?`cR|FQor z$qPOCpiYMJYMjd5*cNX{Vm1%4JvdzHq-ZAN{5L~@5%s)Ym0ym2&X4W&8L(J_qLe!Sz(jl5FR>%GViF^J6wxq^Y!Ed z5B`!B@c&*`tiA2QmR;-CR!5R&THa?Ok8rX(t)YX zVO`y8HS$;uVYgX?xv?_+guL-iNKF|=V_`fT^W#9Q$~Pyqb9g)!xpm{^$m_BOuf@VX zH3JK)TO+#K;ctwBR;iolsC6Fv7zMgtwkQzg@1f_J-dq6 M9*!^_tG`nIUrC1NjQ{`u 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"); }