|
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。9 f2 m8 L' @9 ?0 n! L `( b( w: ]/ @0 W: {' g2 U 一:部分原理图设计:1 k& V) j$ p! k  c* y# d# i+ ^4 l# t- b* N 二:PCB图展示: ! [0 `# c j: R' v% e! F+ n; Q 5 i8 m. \& ?$ Q6 E- R* } ; \: K% p1 w+ ?, ] 三:软硬件设计的思路: 在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。3 T" ~, H( W8 O % r$ r8 ~1 _- ` 无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。 软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。 / F g# X$ D% w 使用串口2完成与SPI之间的交互, 软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;3 F0 q# b% U/ @ f8 s# I& }3 t. _# [ cube软件配置图如下,主要是对该项目中使用到的引脚进行配置! M5 V5 H/ ~4 n; _% J  部分软件代码: 0 i, l2 A$ M! `4 l+ Y: { ```abc if(sd == 0) { USART_Cmd(USART2, ENABLE); //使能串口 if( linecoding_old.bitrate != linecoding.bitrate || linecoding_old.datatype != linecoding.datatype ||+ V: W, ~, P7 \4 e" i linecoding_old.format != linecoding.format || linecoding_old.paritytype != linecoding.paritytype )" z1 q7 \# I) s7 H4 o: N8 X. q { if( usart2_flag == 0 ) { uart2_config_change(linecoding); memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));5 [$ f: T! w+ r; S1 I } }, n: u0 x2 [; ?( w: F) u else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0): C9 o* e/ L5 t# A3 P; r8 b- o. e {# r% P, ^, v) i# S1 h' ^ QueueElementByte data_byte;; C0 A5 G# Z; Y$ ?0 n* P6 J, q2 `4 p usart2_flag = 1;' H$ z, R, [1 \2 a! U/ h: y if(dequene(&Qusart2Send,&data_byte) == 0 )4 Z# u. B+ f) E { USART_SendData(USART2,data_byte.buffer);6 V! Z6 ~* ?5 L5 j: Z$ G } USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断 }7 W* \" j# [% f( Q( c2 C" H 1 t# m8 q( o( f4 J. y+ D; V/ t if(GetEPRxStatus(ENDP6) == EP_RX_NAK) { SetEPRxValid(ENDP6); }5 N! p& B% P2 z+ W1 | if(GetEPRxStatus(ENDP4) == EP_RX_NAK) { if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )" N2 j% O) o V, q1 r5 B SetEPRxValid(ENDP4);0 g2 k6 N8 e, w, M& K- Z! z0 Z }# s2 o3 M$ T( h9 L' T+ g 4 Z0 I" X) q- y. M if(nrf_state == 0) NRF24L01_TxPacket(buffer,1); }- j" o% Y6 A( x1 R else { USART_Cmd(USART2, DISABLE); //失能串口 ! u: j6 a% P0 }( h4 W$ u6 v5 J+ d if(nrf_state == 0) { if(dap2nrf_Data() == -1) { if(GetEPRxStatus(ENDP6) == EP_RX_NAK) { SetEPRxValid(ENDP6);# \) K2 S# _- L& J6 u } if( linecoding_old.bitrate != linecoding.bitrate || linecoding_old.datatype != linecoding.datatype ||" I9 V4 U' h" p0 i linecoding_old.format != linecoding.format || linecoding_old.paritytype != linecoding.paritytype ) { buffer[0] = 33;//特殊串口设置指令* z I4 E& w `. m! p, A3 y* C# S memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding)); NRF24L01_TxPacket(buffer,sizeof(linecoding)+1); } else if(queue_size(&Qusart2Send) > 0)! d, g Y0 ^9 y5 \0 v; Z {' p$ Y* w* A. Z. K# ]; v- J# {' i QueueElementByte data_byte; for(i = 1; i < 32; i ++)9 F4 ^6 c/ i6 ?5 V5 J {0 g. ?5 ?/ T8 ? if(dequene(&Qusart2Send,&data_byte) == -1 )0 F5 E, l t& s9 s7 e break;+ j2 ?8 F8 m$ ]! ]6 P6 u7 o buffer = data_byte.buffer;/ x7 I; I+ a0 O6 d }4 N1 n2 d7 S% b7 e) a$ l4 M! p- w buffer[0] = i - 1; NRF24L01_TxPacket(buffer,buffer[0]+1); } else { if(GetEPRxStatus(ENDP4) == EP_RX_NAK) a; K5 A3 v* J9 B+ g& T/ p; ] {& a( r, E3 R |. H* A: }/ T8 O SetEPRxValid(ENDP4); } buffer[0] = 0; NRF24L01_TxPacket(buffer,1);4 x: Q/ e. z& t' F+ O! q; l0 \ }: b1 M; {- w5 N4 z- n" o# S8 R }+ j( I- \* D/ _: [% b. K }% x* U* ~2 t# B0 @% ~% Q }, K2 `( g! z+ G+ w" U ``` 1 X6 u% g2 I% r7 D6 B# c4 T 实物使用截图如下:  + J; ]7 p8 {. F; ~0 {$ T 在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。0 u/ R* A+ v- s r9 T. Y( E4 r ' w x, s3 R2 S! X3 Q6 { 使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。 硬件设计的时候,设计注意事项: ) T" k" K/ [* Y9 v9 z 使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。8 ` d) e) y9 m & N ?+ n$ M$ N# U* i( k MP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。5 M* U% X0 e+ _" `; D+ M$ F PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。 同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。8 Y+ j/ y$ l2 X4 ? 在软件开发时候,有以下的注意事项: 3 t( R& R) _& d. E 抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。 功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。. D( r) ]: K' ]0 D 距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。- F$ j [7 z$ y! i 0 t) c8 ^' H& A1 ]& R% \( P [! M NRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。 T; R0 Y: U6 w1 S r ! d3 F0 S) q! }2 Y! Y* J 原理图见附件:9 r$ n% I+ M. \- X% D  ; r8 _. E7 ~, i# L1 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之继电器模块
微信公众号
手机版
重新上传一下 原理图!!!