|
#include "stm8l15x.h" #include "NRF24l01P.h" ' G* {2 X5 u8 e ^5 p9 y1 C e- z% q /*********************************************************************/ ! U" x- _% k3 P6 ?6 u #define IRQ (GPIOB->IDR & GPIO_Pin_2) $ b( I5 b7 I* o: k- I* \+ O #define MISO (GPIOB->IDR & GPIO_Pin_7) /*********************************************************************/ #define CE_0 GPIO_ResetBits(GPIOB, GPIO_Pin_3) #define CE_1 GPIO_SetBits(GPIOB, GPIO_Pin_3)) e" b$ I$ O: x #define CSN_0 GPIO_ResetBits(GPIOB, GPIO_Pin_4) #define CSN_1 GPIO_SetBits(GPIOB, GPIO_Pin_4) #define SCK_0 GPIO_ResetBits(GPIOB, GPIO_Pin_5) #define SCK_1 GPIO_SetBits(GPIOB, GPIO_Pin_5); r$ f. E/ U- m/ U; _" P3 { #define MOSI_0 GPIO_ResetBits(GPIOB, GPIO_Pin_6) #define MOSI_1 GPIO_SetBits(GPIOB, GPIO_Pin_6) /*********************************************************************/" L5 X0 Z( q, i9 h/ _% ^ //unsigned char tx_buf[PAYLOAD_WIDTH]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,% p( E; z6 F2 P5 C' S // 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,3 q4 F5 v1 _9 t6 O // 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24, // 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32};% f0 Y; Q8 Y/ e unsigned char TX_ADDRESS[ADDRESS_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0x00}; ' r4 N* I1 n9 m5 `' ^ unsigned char RX_ADDRESS0[ADDRESS_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0x00}; unsigned char RX_ADDRESS1[ADDRESS_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0x01}; unsigned char RX_ADDRESS2[1]= {0x02}; : v3 y D. g8 c6 m. D' d* f& D. p- v unsigned char RX_ADDRESS3[1]= {0x03}; unsigned char RX_ADDRESS4[1]= {0x04}; , j! c& m' a' ?: m" y unsigned char RX_ADDRESS5[1]= {0x05}; ' @9 S d; t) Z: S /* nRF24L01 Instruction Definitions */, _, R$ a3 ~$ J6 h+ P7 _' ] #define W_REGISTER 0x20 /**< Register write command */: T3 x9 H5 z7 H: [ #define R_RX_PAYLOAD 0x61 /**< Read RX payload command */" I$ L% S# B2 t7 u2 P' y #define W_TX_PAYLOAD 0xA0 /**< Write TX payload command */ #define FLUSH_TX 0xE1 /**< Flush TX register command */6 p3 Z. v4 m1 v2 T* g0 P9 d9 G. q #define FLUSH_RX 0xE2 /**< Flush RX register command */ #define REUSE_TX_PL 0xE3 /**< Reuse TX payload command */$ c! C9 s7 b) S; m #define ACTIVATE 0x50 /**< Activate features */ #define R_RX_PL_WID 0x60 /**< Read RX payload command */9 o' H) l% }, ~# p3 b) | #define W_ACK_PAYLOAD 0xA8 /**< Write ACK payload command */ #define W_TX_PAYLOAD_NOACK 0xB0 /**< Write ACK payload command */ #define NOP 0xFF /**< No Operation command, used for reading status register */ /* nRF24L01 Register Definitions */% Z; B6 g3 m% D+ ` #define CONFIG 0x00 /**< nRF24L01 config register */ #define EN_AA 0x01 /**< nRF24L01 enable Auto-Acknowledge register */! z8 C6 l5 |& p #define EN_RXADDR 0x02 /**< nRF24L01 enable RX addresses register */ #define SETUP_AW 0x03 /**< nRF24L01 setup of address width register */ #define SETUP_RETR 0x04 /**< nRF24L01 setup of automatic retransmission register */ #define RF_CH 0x05 /**< nRF24L01 RF channel register */ #define RF_SETUP 0x06 /**< nRF24L01 RF setup register */- [# Q' s" u0 U$ X+ P #define STATUS 0x07 /**< nRF24L01 status register */ #define OBSERVE_TX 0x08 /**< nRF24L01 transmit observe register */ #define CD 0x09 /**< nRF24L01 carrier detect register */ #define RX_ADDR_P0 0x0A /**< nRF24L01 receive address data pipe0 */# c E0 x8 ]. p/ e% H #define RX_ADDR_P1 0x0B /**< nRF24L01 receive address data pipe1 */3 C6 Z0 u, v1 W U5 c9 M7 S7 n/ p #define RX_ADDR_P2 0x0C /**< nRF24L01 receive address data pipe2 */3 V7 [) C) m6 k s: d #define RX_ADDR_P3 0x0D /**< nRF24L01 receive address data pipe3 */' I8 B' g9 C% n, i5 f$ \; m #define RX_ADDR_P4 0x0E /**< nRF24L01 receive address data pipe4 */, c5 a: Y; w. Q #define RX_ADDR_P5 0x0F /**< nRF24L01 receive address data pipe5 */2 v# j R3 I7 t m% `0 @& h f6 O #define TX_ADDR 0x10 /**< nRF24L01 transmit address */& Y3 y% e' _9 J2 [' |& z #define RX_PW_P0 0x11 /**< nRF24L01 \# of bytes in rx payload for pipe0 */ #define RX_PW_P1 0x12 /**< nRF24L01 \# of bytes in rx payload for pipe1 */; J& N- X* U& f4 h$ Z( c+ ~% d #define RX_PW_P2 0x13 /**< nRF24L01 \# of bytes in rx payload for pipe2 */; a" _9 c1 N: G0 C2 k+ k/ m6 Q #define RX_PW_P3 0x14 /**< nRF24L01 \# of bytes in rx payload for pipe3 */ #define RX_PW_P4 0x15 /**< nRF24L01 \# of bytes in rx payload for pipe4 */ #define RX_PW_P5 0x16 /**< nRF24L01 \# of bytes in rx payload for pipe5 */ #define FIFO_STATUS 0x17 /**< nRF24L01 FIFO status register */! j& r3 Q! {- T3 ? #define DYNPD 0x1C /**< nRF24L01 Dynamic payload setup */+ v0 E' T/ @7 ] #define FEATURE 0x1D /**< nRF24L01 Exclusive feature setup */! n3 i% T' O1 m6 X. y4 A) l & L6 b" i# k ~5 ?6 w; a' v /** @name STATUS register bit definitions */ #define RX_DR 0x40 /**< STATUS register bit 6 */' {( j/ v- k# j2 d) j& X( _ #define TX_DS 0x20 /**< STATUS register bit 5 */9 X1 E. L, l2 P( I" x3 x1 i #define MAX_RT 0x10 /**< STATUS register bit 4 */ #define TX_FULL 0x01 /**< STATUS register bit 0 */ `; f+ i4 ]" I: V, n, I /** @name FIFO_STATUS register bit definitions */8 x# P* H( J# n/ \( |$ B #define TX_REUSE 0x40 /**< FIFO_STATUS register bit 6 */+ @' ]0 d' }/ M #define TX_FIFO_FULL 0x20 /**< FIFO_STATUS register bit 5 */ #define TX_EMPTY 0x10 /**< FIFO_STATUS register bit 4 *// X9 p# X. T0 B5 n- [1 o' n #define RX_FULL 0x02 /**< FIFO_STATUS register bit 1 */$ {5 {3 s% ? N #define RX_EMPTY 0x01 /**< FIFO_STATUS register bit 0 */9 y. X5 v; I# m( _ unsigned char SPI_SendByte(unsigned char byte)( W( T7 m0 |6 Z, U. G$ s {" Z# o6 g4 B( P! ^; \ unsigned char i; for(i = 0; i < 8; i++) { if (byte & 0x80) MOSI_1;% r! P/ {* N$ j" q1 L5 q! }1 A else MOSI_0; byte <<= 1; SCK_1; if (MISO) byte++; ; L( b# C4 G- ^( m' _3 [ SCK_0; 9 H b; L$ r8 u3 G% d } return byte; # \7 Y7 U, F) S: ?: t/ m6 s } ! E7 P, F6 l6 ~6 t- ] } unsigned char NRF24L01_WriteReg(unsigned char reg, unsigned char value)# Q# E( z% M! T3 Y$ ]( [0 U {2 d& j& a5 X( x. t5 V' r6 j1 H unsigned char status; " r* ^$ i/ C6 Q9 R0 \3 A4 `: c/ ? CSN_0; status = SPI_SendByte(reg); SPI_SendByte(value); 7 h! }6 r" m" G1 \: W CSN_1; return(status); } + k- u3 |( ~* p6 E2 a unsigned char NRF24L01_ReadReg(unsigned char reg) {4 P9 ^) H8 R/ K3 ]+ ^, A unsigned char value; 5 c- R% ]0 K I3 N b CSN_0; SPI_SendByte(reg); 4 W- y- u$ D! n. w value = SPI_SendByte(0x00); CSN_1; return(value); % ?9 o; i1 R6 i' ~- B } . [$ A& V9 L6 K& E! J8 r , C+ |2 B. e4 \- w3 g. r8 d% n unsigned char NRF24L01_ReadBuf(unsigned char reg, unsigned char buf[], unsigned char len)/ s, v0 U, r/ H( o# ] { unsigned char i, status; 1 c+ K8 l/ e: z: L CSN_0; ) f# P4 y2 A0 \ status = SPI_SendByte(reg); for(i = 0; i < len; i++) buf[i] = SPI_SendByte(0x00);! ]8 a2 \, J6 a' A% k6 R CSN_1; : u# O1 G$ a. y' _ return(status); } ! i6 Z4 A- J" c* ]4 J5 |+ ^ unsigned char NRF24L01_WriteBuf(unsigned char reg, unsigned char buf[], unsigned char len): v* @8 E- t& m: F {& j6 _( f$ ]6 U7 a9 K unsigned char i, status; CSN_0; status = SPI_SendByte(reg); for(i = 0; i < len; i++) SPI_SendByte(buf[i]); CSN_1; return(status); ( }& B/ H9 ?; C7 ~2 l } % P0 m g5 _; H, ^! u, c2 { void NRF24L01_Initial(void)% N* u+ Q* g# u; x" f { t/ b, g9 d" M7 u! U1 E) T GPIO_Init(GPIOB, GPIO_Pin_2 | GPIO_Pin_7, GPIO_Mode_In_FL_No_IT);6 a6 f8 |2 t0 f GPIO_Init(GPIOB, GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6, GPIO_Mode_Out_PP_Low_Fast); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_In_FL_IT); EXTI_SetPinSensitivity(EXTI_Pin_2, EXTI_Trigger_Falling);//NRF24L01P1 t3 I+ k# |+ s/ I B CE_0; CSN_1; SCK_0; NRF24L01_WriteReg(W_REGISTER + EN_AA, 0x01); NRF24L01_WriteReg(W_REGISTER + EN_RXADDR, 0x01); NRF24L01_WriteReg(W_REGISTER + SETUP_AW, 0x03); NRF24L01_WriteReg(W_REGISTER + SETUP_RETR, 0x1A); NRF24L01_WriteReg(W_REGISTER + RF_CH, 0); 8 y: D. k6 k5 {# T NRF24L01_WriteReg(W_REGISTER + RF_SETUP, 0x0C); //0x08:-18dBm,2Mbps //0x00:-18dBm,1Mbps6 x* Y9 F/ d5 C* K) h2 \ ' P% N$ w! _& [: D9 p1 d NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P0, RX_ADDRESS0, ADDRESS_WIDTH); 6 _& e" Q4 y+ B8 B6 J8 Q NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P1, RX_ADDRESS1, ADDRESS_WIDTH); & U; U( o. r7 ~+ g% c& \ NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P2, RX_ADDRESS2, 1); NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P3, RX_ADDRESS3, 1);; O5 G; t& \. U2 s8 v3 x. b! Q NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P4, RX_ADDRESS4, 1); NRF24L01_WriteBuf(W_REGISTER + RX_ADDR_P5, RX_ADDRESS5, 1);% u* Y/ t {# y- c NRF24L01_WriteBuf(W_REGISTER + TX_ADDR, TX_ADDRESS, ADDRESS_WIDTH);3 ?# ^4 G/ R' g0 G! g" ^5 x NRF24L01_WriteReg(W_REGISTER + RX_PW_P0, PAYLOAD_WIDTH); ( d6 |9 B; G% m. g% r6 C NRF24L01_WriteReg(W_REGISTER + RX_PW_P1, PAYLOAD_WIDTH); ; `" m5 D8 B: o j NRF24L01_WriteReg(W_REGISTER + RX_PW_P2, PAYLOAD_WIDTH); ' l5 C! h3 p) v7 K' ?7 {9 A( o NRF24L01_WriteReg(W_REGISTER + RX_PW_P3, PAYLOAD_WIDTH);6 m4 E3 ~$ m- t8 l) l NRF24L01_WriteReg(W_REGISTER + RX_PW_P4, PAYLOAD_WIDTH); NRF24L01_WriteReg(W_REGISTER + RX_PW_P5, PAYLOAD_WIDTH); 3 t2 S4 E' H+ I) e1 n' {1 |4 Y NRF24L01_WriteReg(FLUSH_RX, 0x00);# @3 H( F$ m5 R NRF24L01_WriteReg(FLUSH_TX, 0x00); ( B5 j8 r0 p$ Y8 Z1 M8 a" Z" m, E& V NRF24L01_WriteReg(W_REGISTER + STATUS, 0x70); NRF24L01_WriteReg(W_REGISTER + CONFIG, 0x00); } & L5 h5 n! U: ?) i a) d! z# }5 X l: L: r! j" P% H- O unsigned char NRF24L01_RxPacket(unsigned char rx_buf[]) { unsigned char status; NRF24L01_WriteReg(W_REGISTER + CONFIG, 0x0F); delay_ms(2); CE_1;2 Z. t) c3 R. U/ F) P6 ? //while(IRQ); A9 }% G0 _# b6 ~. p9 i1 Y, \ delay_ms(10);. c7 d- _9 h& w1 l$ x+ z% W6 A CE_0;' C9 V: ~; b' Y+ [' K4 Y NRF24L01_WriteReg(W_REGISTER + CONFIG, 0x00); status = NRF24L01_ReadReg(STATUS);+ v: v* g7 S" Q1 m8 E! B. l1 y) \- t NRF24L01_WriteReg(W_REGISTER + STATUS, status);8 u5 f7 O- h& X6 g. ^% C! T if(status & RX_DR)3 v4 ]/ F$ Q6 Q; w7 _ { NRF24L01_ReadBuf(R_RX_PAYLOAD, rx_buf, PAYLOAD_WIDTH);1 P- d' l7 `( p3 h9 T4 |4 ` T NRF24L01_WriteReg(FLUSH_RX, 0x00); 0 j# j* T+ s( ]# c4 u return 1; 6 s0 K l9 V" a: s. N. \6 X1 R8 r } else { NRF24L01_WriteReg(FLUSH_RX, 0x00); return 0; }8 P+ z- ?5 V3 m3 m9 R$ X) n } unsigned char NRF24L01_TxPacket(unsigned char tx_buf[]) {2 R2 J1 j! r% ?. ~6 z unsigned char status; 9 U7 q$ Z# H: B: b3 b NRF24L01_WriteBuf(W_TX_PAYLOAD, tx_buf, PAYLOAD_WIDTH); NRF24L01_WriteReg(W_REGISTER + CONFIG, 0x0E); delay_ms(2);' k7 f- U8 u7 \8 R0 { CE_1; $ D4 I5 \& G. ]. d+ ]8 U //while(IRQ);' } ?2 e5 s( f c! w+ P delay_ms(10);: z/ P: J9 ~/ I$ ]- ?. h CE_0;- S* ^2 m; t" Y$ t* m# ^ NRF24L01_WriteReg(W_REGISTER + CONFIG, 0x00);- E/ D' _8 [7 @2 R* H) P* L8 Q( k5 i status = NRF24L01_ReadReg(STATUS); NRF24L01_WriteReg(W_REGISTER + STATUS, status); ' k) L; o" Y7 f' W if(status & MAX_RT) {. y1 y, a- f) k9 V NRF24L01_WriteReg(FLUSH_TX, 0x00); return 0; }7 S( W3 r( M+ e3 d7 q+ z/ y if(status & TX_DS)$ M+ H/ G! G4 k5 k p. U { NRF24L01_WriteReg(FLUSH_TX, 0x00);/ ?% h& @" p5 m- D: m' r h return 1; }) ]: e1 z& P1 V7 K return 2; }/ g7 \& r' `6 |0 O : p! {2 F- z; I" W# t I |
NRF24L01P.rar
下载2.2 KB, 下载次数: 522
STM8自学笔记(推荐STM8很好的入门电子书)
无刷直流电机控制应用+基于STM8S系列单片机---电子书
【精华资料】STM8Sxx固件库FOR IAR
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
微信公众号
手机版
可以的
谢谢支持