#include "M451Series.h" #include "24l01.h" #include "spi_hal.h" uchar Recv_Buf[32] = {0}; uchar Send_Buf[32] = {0}; char rfch = 45; unsigned short RxCnt = 0; unsigned char TxAddr[]={0x11,0x22,0x33,0x44,0x55};//???? unsigned char RxAddr[]={0x11,0x22,0x33,0x44,0x55};//???? enum NRF_Mode Curr_Mode = NRF_RX_Mode; void delay_s() { int z=0; for(z=0;z<250;z++) {} } void delay_mss() { int z = 0; for(z=0;z<5;z++) { delay_s(); } } void NRF_Init(void) { } void NRF_SetUpInterrupt(void) { GPIO_SetMode(PB,BIT15,GPIO_MODE_INPUT); GPIO_EnableInt(PB,15,GPIO_INT_FALLING); NVIC->ISER[0]|=(0X01<<2); } int gRecvPkg = 0; //½ÓÊÕ»òÕß·¢ËÍÖÐ¶Ï void EINT0_IRQHandler() { char trycnt = 5; gRecvPkg ++; delay_s(); switch(Curr_Mode){ //if now in rx mode mean data been receieved case NRF_RX_Mode: //PB9 = 0; while(trycnt > 0) { if(NRF24L01_RxPacket(Recv_Buf) == 0) { NRFSetTxMode(); break; } trycnt --; } //nrf_write(FLUSH_RX,0xff);//Çå³ýRX FIFO¼Ä´æÆ÷ //PB9 = 1; //read the buffer break; //if now in tx mode mean data been sent case NRF_TX_Mode: break; } PB->INTSRC |= BIT14; } void RX_Mode(void) { char sta; sta = nrf_read(STATUS); nrf_write(W_REGISTER + STATUS,sta); nrf_write(FLUSH_TX,0xff); nrf_write(FLUSH_RX,0xff); PB13=0; Curr_Mode = NRF_RX_Mode; delay_s(); nrf_writebuf(W_REGISTER + TX_ADDR,(uchar*)TxAddr,5);//дTX½ÚµãµØÖ· nrf_writebuf(W_REGISTER + RX_ADDR_P0,(uchar*)RxAddr,5); //ÉèÖÃTX½ÚµãµØÖ·,Ö÷ҪΪÁËʹÄÜACK nrf_write(W_REGISTER + SETUP_RETR,0x11);//ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us + 86us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î nrf_write(W_REGISTER + EN_AA, 0x01); // Enable Auto.Ack:Pipe0 nrf_write(W_REGISTER + EN_RXADDR, 0x01); // Enable Pipe0 nrf_write(W_REGISTER + RF_CH, rfch); // Select RF channel 40 nrf_write(W_REGISTER + RX_PW_P0,RX_DATA_WITDH); //nrf_write(W_REGISTER+FEATURE, 0x20); nrf_write(W_REGISTER + RF_SETUP, 0x0f); nrf_write(W_REGISTER + CONFIG, 0x2f); // Set PWR_UP bit, enable CRC(2 bytes) delay_s(); PB13=1; } void NRFSwitchMode(char mode) { static char ifinit = 0; //TX Mode if(mode == 1) { if (0 == ifinit) { NRFSetTxMode(); ifinit = 1; return; } PB9 = 0; nrf_write(W_REGISTER + STATUS,0xff); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð nrf_write(FLUSH_TX,0); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð nrf_write(W_REGISTER + CONFIG,0xfe); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð delay_s(); PB9 = 1; } else { PB9 = 0; nrf_write(W_REGISTER+STATUS,0xff); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð nrf_write(FLUSH_TX,0); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð nrf_write(W_REGISTER + CONFIG,0xff); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð delay_s(); PB9 = 1; } } void NRFSetTxMode() { char sta; sta = nrf_read(STATUS); nrf_write(W_REGISTER + STATUS,sta); nrf_write(FLUSH_TX,0xff); nrf_write(FLUSH_RX,0xff); PB14 = 0; Curr_Mode = NRF_TX_Mode; delay_s(); nrf_writebuf(W_REGISTER+TX_ADDR,(uchar*)TxAddr,5);//дTX½ÚµãµØÖ· nrf_writebuf(W_REGISTER+RX_ADDR_P0,(uchar*)RxAddr,5); //ÉèÖÃTX½ÚµãµØÖ·,Ö÷ҪΪÁËʹÄÜACK nrf_write(W_REGISTER+EN_AA,0x01); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð nrf_write(W_REGISTER+EN_RXADDR,0x01); //ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ· nrf_write(W_REGISTER+SETUP_RETR,0x1a);//ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us + 86us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î nrf_write(W_REGISTER+RF_CH,rfch); //ÉèÖÃRFͨµÀΪ40 nrf_write(W_REGISTER+RF_SETUP,0x0f); //ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒ濪Æô nrf_write(W_REGISTER+CONFIG,0x0e); //ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ,¿ªÆôËùÓÐÖÐ¶Ï delay_s(); PB14 = 1; } //Æô¶¯NRF24L01·¢ËÍÒ»´ÎÊý¾Ý //txbuf:´ý·¢ËÍÊý¾ÝÊ×µØÖ· //·µ»ØÖµ:·¢ËÍÍê³É×´¿ö unsigned char NRF24L01_TxPacket(unsigned char *txbuf) { unsigned char sta; PB9=0; delay_s(); nrf_writebuf(W_TX_PAYLOAD,txbuf,TX_DATA_WITDH);//дÊý¾Ýµ½TX BUF 32¸ö×Ö½Ú PB9=1; sta=nrf_read(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ nrf_write(W_REGISTER+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾ if(sta&0x10)//´ïµ½×î´óÖØ·¢´ÎÊý { nrf_wf(FLUSH_TX);//Çå³ýTX FIFO¼Ä´æÆ÷ nrf_write(W_REGISTER+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾ sta=nrf_read(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ return 0x10; } if(sta&0x20)//·¢ËÍÍê³É { return 0; } return 0xff;//ÆäËûÔ­Òò·¢ËÍʧ°Ü } unsigned char NrfDump() { char ret = 0; ret=nrf_read(EN_AA); delay_s(); ret=nrf_read(EN_RXADDR); delay_s(); ret=nrf_read(RF_CH); delay_s(); ret=nrf_read(RX_PW_P0); delay_s(); ret=nrf_read(RF_SETUP); delay_s(); ret=nrf_read(CONFIG); delay_s(); ret=nrf_read(CD); delay_s(); ret=nrf_read(STATUS); delay_s(); return ret; } unsigned char NRF24L01_Read_Buf(unsigned char reg,unsigned char *pBuf,unsigned char len) { unsigned char status,u8_ctr; spi_enable(); status=spi_send(reg); for(u8_ctr=0;u8_ctr