|
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。' C6 t# h, n O3 U; k: O 5 ]+ y* o+ Z/ q' U8 r: { 一:部分原理图设计:0 v2 N3 o" R' n( U" k 8 ^2 a2 ?" J: r0 R8 b 二:PCB图展示:# O1 T9 A1 c$ g) ^/ K* T6 I" } " L" n, w! Z' l1 m1 ^$ s  % k3 ?& a2 t' b6 a/ O 三:软硬件设计的思路:6 y0 E: W q4 `$ G( u 在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。 无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。 软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。+ `: {6 k+ E6 V" S 使用串口2完成与SPI之间的交互,+ F" X6 t, N3 L I: X6 X ; E$ B( k- \* g( ]2 K6 B7 U 软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;) b1 o) X2 d8 e8 g! Z- S ( k; A4 o# z/ O" f cube软件配置图如下,主要是对该项目中使用到的引脚进行配置( T8 x- ?, f2 n  部分软件代码:/ _9 T* y/ A2 A R ```abc if(sd == 0)+ S* `7 b5 ]* e4 R* ]* N {$ b; J/ Y+ b% j USART_Cmd(USART2, ENABLE); //使能串口 if( linecoding_old.bitrate != linecoding.bitrate ||9 i& b) \3 A. w5 n* r linecoding_old.datatype != linecoding.datatype || linecoding_old.format != linecoding.format ||" m1 @( V1 D; a( q6 g0 n& t linecoding_old.paritytype != linecoding.paritytype )3 V2 X" W/ A2 Q6 e+ G4 N! X { if( usart2_flag == 0 ) { uart2_config_change(linecoding); memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding)); } } y3 K. m0 e! U3 j" _; B& V+ K$ d else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0) { QueueElementByte data_byte;1 O6 }3 x4 w% M. G, Z% _, o usart2_flag = 1; if(dequene(&Qusart2Send,&data_byte) == 0 ) {8 x4 i" \, @% U1 ~/ X, }2 g USART_SendData(USART2,data_byte.buffer); } USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断 }' r: ]$ C8 t+ H$ v, B6 m! {( @, Q" v # W9 {' j2 S# ?1 z: B if(GetEPRxStatus(ENDP6) == EP_RX_NAK) {+ p# p% Y' t: M9 r2 E SetEPRxValid(ENDP6);* k! M" Z0 v1 S* s } if(GetEPRxStatus(ENDP4) == EP_RX_NAK) { if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 ) SetEPRxValid(ENDP4);( {/ ^1 u& j# V }6 k+ K$ f$ `. H% a 8 m/ J" u) o) h7 G \ if(nrf_state == 0) NRF24L01_TxPacket(buffer,1);: d& b4 [# f5 A; w } else { USART_Cmd(USART2, DISABLE); //失能串口 ( h. Y) ~+ ^7 G F if(nrf_state == 0). J3 p. J2 U' t% A" t" @% h { if(dap2nrf_Data() == -1), t/ _" P& _) ~, b! F D8 O% c6 E {1 h+ L% F# M4 e: B 5 F3 A8 m- |+ L" z% |, E if(GetEPRxStatus(ENDP6) == EP_RX_NAK) {3 w2 [: K2 p% P SetEPRxValid(ENDP6);* u3 V$ V; L( U3 P( z* W ? }9 b5 U( ^3 q& P2 z/ l. i ]/ t' s' ~ if( linecoding_old.bitrate != linecoding.bitrate ||$ R2 o6 ]0 E ~; j linecoding_old.datatype != linecoding.datatype ||" k: c% k6 _3 l: ]1 b# P linecoding_old.format != linecoding.format || linecoding_old.paritytype != linecoding.paritytype )2 V% }# o1 |9 b, J6 Y( h {+ o7 S$ M Q) @8 m( t) g) G: @ buffer[0] = 33;//特殊串口设置指令 memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding)); NRF24L01_TxPacket(buffer,sizeof(linecoding)+1); } else if(queue_size(&Qusart2Send) > 0) {; ^$ p/ z( `9 ~/ Y& h- L8 u" P0 g QueueElementByte data_byte;4 V" p$ D0 }* n! s0 Q( g0 Z+ w1 y for(i = 1; i < 32; i ++)- @) P4 s/ j7 S6 w$ E/ u { if(dequene(&Qusart2Send,&data_byte) == -1 )4 h1 a) z5 y. k+ l8 b; ^# T1 k break;; v+ w' w! j* y+ D5 f& a buffer = data_byte.buffer; }7 Q& d0 g' t! I buffer[0] = i - 1;; s" Z3 B: e2 _. T NRF24L01_TxPacket(buffer,buffer[0]+1); } else {& ?( i$ m+ i5 y* Y- {; v if(GetEPRxStatus(ENDP4) == EP_RX_NAK)9 J) b4 M* } r- O; P+ S { SetEPRxValid(ENDP4);' M B5 t; ]0 G" t9 r: w }, W2 D$ v2 e' H) V! v9 V% L buffer[0] = 0;2 F/ f$ ?% b( Y, S NRF24L01_TxPacket(buffer,1); }8 g/ ~5 n0 D1 F' j }; n. J$ @$ b5 k } } ``` - c5 u. k6 x( s* t, ^. M" Y 实物使用截图如下:9 m0 T3 Y% j X) s+ C9 Z" T) `  在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。7 x! I. A# x! T+ e & |$ _! j- W3 a 使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。8 C5 b5 j& t: Z1 m' ?. {) `' t 硬件设计的时候,设计注意事项:% J6 g, o# D1 W3 |* ]6 Q6 s! i 使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。 MP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。 $ a) u6 s4 q. H; ^0 e1 T! P$ h PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。 同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。% x$ T2 H/ {9 H( j$ W) a1 g 在软件开发时候,有以下的注意事项: $ g) E& W3 N. I9 W6 B8 m 抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。 功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。 距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。 NRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。 原理图见附件:  $ @( F1 b! I8 y( ] |
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之继电器模块
微信公众号
手机版
重新上传一下 原理图!!!- `/ s, g& d4 q' N2 F+ b