|
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。. s& A5 b0 q6 r 一:部分原理图设计: 9 Z1 Z4 v. ~/ B$ j  二:PCB图展示: ' R e9 |3 n2 N : A6 L& x& z. g) D2 A; e " }; t& K3 T) i6 {3 b4 D 三:软硬件设计的思路:" W9 u+ W) E3 P ' t/ H- u6 x! C& t2 h2 ` 在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。 " e6 j1 D2 z3 P, Q7 B1 H2 s" J 无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。9 I* G% Y* Z% K0 n : Q9 | ~7 V+ a# O9 t1 n( n/ R3 M 软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。8 f; g% G8 g# F; @ 4 \# ? w b% \$ H: K 使用串口2完成与SPI之间的交互,7 }4 W5 t0 U% H" r; q0 C : {2 q6 }, C U1 G! v4 C/ M# U3 p 软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;4 ?- X9 n/ q0 i7 B- y, a cube软件配置图如下,主要是对该项目中使用到的引脚进行配置 $ Q. V4 ^* C5 ` C ( J4 n! E0 i" i: Y3 p H 部分软件代码: ; q4 O2 L1 h f- H* n ```abc: v5 |) ~9 n8 h( ?# E7 k7 m if(sd == 0)! M9 z: f* e" I a* j1 `: h; f5 K { USART_Cmd(USART2, ENABLE); //使能串口 if( linecoding_old.bitrate != linecoding.bitrate ||5 z% N/ U0 M6 v- T* m: @/ d) P linecoding_old.datatype != linecoding.datatype ||0 X$ e8 d9 H# W: T5 D linecoding_old.format != linecoding.format ||8 |8 H; o8 I" H( c# l/ [ linecoding_old.paritytype != linecoding.paritytype ) {+ ^1 M- @* o$ E& T- w K if( usart2_flag == 0 )) H5 Z8 ?8 x. {. j0 b {$ L0 [; Y2 b2 X uart2_config_change(linecoding); memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding)); } }" h: q, ~+ R: K else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0) {6 @( o, {& s; V+ Z# m QueueElementByte data_byte;, A0 @ d$ {' @: i usart2_flag = 1; if(dequene(&Qusart2Send,&data_byte) == 0 ) { l- }( x1 `' K USART_SendData(USART2,data_byte.buffer);- E3 K9 ^0 g& H) n }1 c$ {3 y0 D3 f! y USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断! V1 ]9 _0 j7 T6 W1 _ } & m5 o, z' S7 R$ R, l if(GetEPRxStatus(ENDP6) == EP_RX_NAK)" a! ^/ c+ w9 g {- g m. y6 b( J2 D SetEPRxValid(ENDP6);6 }# T2 f8 W w# h. u/ f } if(GetEPRxStatus(ENDP4) == EP_RX_NAK) {) L% Q" r. c& k if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 ) SetEPRxValid(ENDP4); } ! B# |3 K' L' \4 `- R# T* ]& G if(nrf_state == 0)/ Q0 A9 j% n* P$ n9 i; `1 n NRF24L01_TxPacket(buffer,1); }+ y. j* r* z% o else { USART_Cmd(USART2, DISABLE); //失能串口 if(nrf_state == 0)1 c z0 o+ k3 ^! y' ] {8 w5 C( I" y3 f; V& L if(dap2nrf_Data() == -1) {1 t8 x7 | F3 {1 U * m6 ?& R* w! ^ if(GetEPRxStatus(ENDP6) == EP_RX_NAK) {8 M7 n* V- {3 Z$ i3 c8 s( X+ S SetEPRxValid(ENDP6); }: G+ s9 |' i/ @0 |& {9 U, A1 n if( linecoding_old.bitrate != linecoding.bitrate ||3 }0 p7 ~8 B0 u linecoding_old.datatype != linecoding.datatype || linecoding_old.format != linecoding.format || linecoding_old.paritytype != linecoding.paritytype ) {' _' ]# m8 U# j9 ~/ r buffer[0] = 33;//特殊串口设置指令 memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding)); NRF24L01_TxPacket(buffer,sizeof(linecoding)+1); }: [ c1 \" f$ ]2 _ else if(queue_size(&Qusart2Send) > 0)# l2 ]! N1 K' L { QueueElementByte data_byte;: h, K3 S& Z: p) T for(i = 1; i < 32; i ++)" p J& ], m* U5 L/ A& d { if(dequene(&Qusart2Send,&data_byte) == -1 )% y+ A3 u# c0 `7 _; q3 R break;9 v# l* ?& n6 L& Y6 g- O/ G buffer = data_byte.buffer; } x& [& K! e; X$ E% k buffer[0] = i - 1;( k- P; `9 a7 \ @ NRF24L01_TxPacket(buffer,buffer[0]+1);) v I* s: `1 X, f } else& H5 X5 G+ z# b/ p { if(GetEPRxStatus(ENDP4) == EP_RX_NAK)7 H. u4 i- c* @/ K+ H0 [4 B, r# u {$ {( T2 p. C4 l5 s1 h SetEPRxValid(ENDP4); }) V! W/ Y9 y4 L8 u! p buffer[0] = 0;% x9 i5 Y3 ]9 J; i NRF24L01_TxPacket(buffer,1);* \' m4 P3 U5 h2 j# q) z }4 g- f/ J, w# m( _' \6 F* z2 h; E M }4 a) [, K' e% i( S0 Z } } ```* F! P2 R4 [+ X I/ H8 |! x# h, I 实物使用截图如下:( J, n6 x7 Z! s2 H, E/ H 6 z% A! n3 O k8 F  在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。 使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。5 u: U; E( R9 W ' _4 [8 ?' C/ ~% u6 z 硬件设计的时候,设计注意事项: 8 w6 G" A( Y8 F! M/ \ 使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。4 E# ~2 d$ U8 g. k3 j& o6 M, I 8 U% F1 @) y* {* f2 |, {% h, c# ? MP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。* }6 ]* D( k, x6 F) Q6 O PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。: e# k1 X/ N7 _' w 同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。4 R8 V4 w! ?( r + e6 [. l! }9 H0 M+ s5 h1 e 在软件开发时候,有以下的注意事项: 抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。 $ Y9 T3 \: R' v6 r" ^9 K 功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。 距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。$ B. v. P+ t& @' m) j6 a, ]7 j. W , `# N* j2 j$ J NRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。3 j8 c# ]# ~% Q% U5 t' g- @8 m$ @ 1 h1 x) o, s, W* S# W. E& l% g 原理图见附件: 5 A: K: A- c* j$ |( J& B |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版
重新上传一下 原理图!!!