|
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。* }5 I: [- W! X5 U1 w4 f: ] 一:部分原理图设计: 6 w d/ l& ^; l% C0 g& a" y ! r( k" c( B# Z+ ^( m% h ) _+ y0 n- ^5 u1 F Z5 _ 二:PCB图展示: , [9 A* L# E8 p) v2 o( w4 l  4 J; z! X1 W4 w" S: z/ l6 L 三:软硬件设计的思路: " [" }7 ?' M& s6 I, C1 P# T 在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。 ) D! Z' F ]% V, o k& }' @8 l |, t: S 无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。 软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。 使用串口2完成与SPI之间的交互, 软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;5 J! N( L, o5 w9 r9 Y# ?" S8 V$ z7 I - u8 ?! x+ I. _# Q& m% ~5 o* l cube软件配置图如下,主要是对该项目中使用到的引脚进行配置- ]+ L5 N4 N& H5 J8 ~, h9 o3 v  # k; X3 h' D: s/ c 部分软件代码: ```abc/ I0 o* B- e0 x+ k! X if(sd == 0). ^: k# w" w/ x8 j) v { USART_Cmd(USART2, ENABLE); //使能串口 if( linecoding_old.bitrate != linecoding.bitrate ||9 W' S; O- a3 b' P linecoding_old.datatype != linecoding.datatype ||, L! i( S: `; g" v3 W$ j( R linecoding_old.format != linecoding.format ||& ]1 J s& I. v3 P( A: i( `3 }7 J linecoding_old.paritytype != linecoding.paritytype )7 [6 e/ E; S5 `/ N% o7 v7 b3 ~ { if( usart2_flag == 0 ) { uart2_config_change(linecoding);- ~% g( {$ N( Y& K# @ memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));) r' g% N t, m5 o" U( r6 A } } else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0) {3 k! Q8 k6 u" v7 \& ~ QueueElementByte data_byte; usart2_flag = 1;6 m7 D; ~( s5 O# N+ P3 I5 Y: B if(dequene(&Qusart2Send,&data_byte) == 0 )+ E I. L0 m4 ~" T2 X {4 n% f+ z- n5 a: _ USART_SendData(USART2,data_byte.buffer);9 y* N: P+ C% p) Z6 d$ y8 P; d }/ r0 L$ P8 q* P/ H USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断. q. B" x8 [2 r- _% I' L } $ n0 l# {$ T& L; W% u' | if(GetEPRxStatus(ENDP6) == EP_RX_NAK) {! q$ \+ a! Q# d" z' @: b SetEPRxValid(ENDP6); }6 z& u- |1 t3 Z1 | if(GetEPRxStatus(ENDP4) == EP_RX_NAK) { if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )0 q! \- A/ W. F# j- f5 Q SetEPRxValid(ENDP4);8 L/ K/ p9 e* E+ K& d6 | }' {; A% c0 W9 _+ x! ]) [ 0 ]" x# M" x) J8 M( I0 h4 P" H if(nrf_state == 0) NRF24L01_TxPacket(buffer,1);+ C' l6 @/ K& i5 }' | }. J% R0 o) v; y* l; j else {* N0 q/ z3 A0 `% Y0 a! X: @) K USART_Cmd(USART2, DISABLE); //失能串口 if(nrf_state == 0) { if(dap2nrf_Data() == -1) { if(GetEPRxStatus(ENDP6) == EP_RX_NAK) { SetEPRxValid(ENDP6);! k: z. M% r3 R l% y/ O } D g2 z) Y- d, x, m; g ^2 U- ?& p: R, m5 @# b if( linecoding_old.bitrate != linecoding.bitrate ||5 [( Q5 U. b: |3 @+ F linecoding_old.datatype != linecoding.datatype ||. j9 Z$ Y/ G+ m+ A6 k' r linecoding_old.format != linecoding.format || linecoding_old.paritytype != linecoding.paritytype )( h+ d: ^ ^" k4 L( i { buffer[0] = 33;//特殊串口设置指令3 B9 c m9 E, c6 {! u memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding)); NRF24L01_TxPacket(buffer,sizeof(linecoding)+1);7 {+ x# G m3 ~7 ~6 G }, m e9 p" w( S: h% k9 ^ else if(queue_size(&Qusart2Send) > 0) { QueueElementByte data_byte; for(i = 1; i < 32; i ++)% Z- B; r) m' i- Z { if(dequene(&Qusart2Send,&data_byte) == -1 )* P' J! p* G" H6 G break;) y5 c. ~$ `" p' V. y buffer = data_byte.buffer;$ Z* M ` r$ M9 A, ?& r2 n }& H% g% r9 F$ R- i+ n buffer[0] = i - 1;" }5 J2 g5 T% n# U+ E* m/ U2 n NRF24L01_TxPacket(buffer,buffer[0]+1); }7 o, b1 Z. y/ m8 ] else {6 e( e- u1 M5 b! ?: ? if(GetEPRxStatus(ENDP4) == EP_RX_NAK) { SetEPRxValid(ENDP4);; b1 c) T6 D' v6 V) F- k% y6 [ }3 Q+ U% U$ N" {7 K* m buffer[0] = 0; [: o C4 x3 B5 K5 Y" P, x. N NRF24L01_TxPacket(buffer,1);, {) F8 i# N( _- L$ V0 i } ) Y& i, ?2 m7 f; U& x/ |' }; T } }9 p4 ^: Z% J2 ]/ O: M9 f1 i } ``` 实物使用截图如下: 3 h2 C& D, i* n9 l6 G% K* X) P2 a 6 P, ^- p$ W& M C# I: @2 ]# e0 { 3 @1 {* @6 k7 ]! F; [ 在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。 使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。* k: j! H) y1 Y. f ) G( x1 W2 l2 @8 `2 J 硬件设计的时候,设计注意事项: 使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。 : p- W5 l1 u; L. S* f' m* r MP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。+ h8 x+ `; M' ~6 h5 S PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。0 T4 N8 D. `1 A5 w - O+ r9 K) T* L. o7 c6 y 同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。6 H% ]/ p7 E' o 在软件开发时候,有以下的注意事项: ; m: G# d) n2 B 抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。& R% @0 o! J) V, O/ s4 l $ g& j7 o+ I+ N# s( t; R 功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。 " i. W+ e9 Z- m; ~+ v$ L' ? 距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。 NRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。 - h% d9 f! \% @* z 原理图见附件:3 b6 ~8 E. U6 X9 y9 I : R' j3 | j y1 j# r) o  8 ? h f7 `6 _$ l! o3 @3 x |
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之继电器模块
微信公众号
手机版
重新上传一下 原理图!!!