Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by ahihi ( 6 years ago )
#include "MY_NRF24.h"
//------------------------------------------------
extern SPI_HandleTypeDef hspi1;
extern UART_HandleTypeDef huart1;
//------------------------------------------------
#define TX_ADR_WIDTH 3
#define TX_PLOAD_WIDTH 5
uint8_t TX_ADDRESS0[TX_ADR_WIDTH] = {0xb7,0xb5,0xa1};
uint8_t TX_ADDRESS1[TX_ADR_WIDTH] = {0xb5,0xb5,0xa1};
uint8_t RX_BUF[TX_PLOAD_WIDTH] = {0};
volatile uint8_t rx_flag = 0, tx_flag = 0;

uint8_t Rx_str[200];
uint8_t Rx_index=0;

//------------------------------------------------
__STATIC_INLINE void DelayMicro(__IO uint32_t micros)
{
  micros *= (SystemCoreClock / 1000000) / 9;
  /* Wait till done */
  while (micros--) ;
}
//--------------------------------------------------
uint8_t NRF24_ReadReg(uint8_t addr)
{
  uint8_t dt=0, cmd;
  CS_ON;
  HAL_SPI_TransmitReceive(&hspi1,&addr,&dt,1,1000);
  if (addr!=STATUS)//åñëè àäðåñ ðàâåí àäðåñ ðåãèñòðà ñòàòóñ òî è âîçâàðùàåì åãî ñîñòîÿíèå
  {
    cmd=0xFF;
    HAL_SPI_TransmitReceive(&hspi1,&cmd,&dt,1,1000);
  }
  CS_OFF;
  return dt;
}
//------------------------------------------------
void NRF24_WriteReg(uint8_t addr, uint8_t dt)
{
  addr |= W_REGISTER;//âêëþ÷èì áèò çàïèñè â àäðåñ
  CS_ON;
  HAL_SPI_Transmit(&hspi1,&addr,1,1000);//îòïðàâèì àäðåñ â øèíó
  HAL_SPI_Transmit(&hspi1,&dt,1,1000);//îòïðàâèì äàííûå â øèíó
  CS_OFF;
}
//------------------------------------------------
void NRF24_ToggleFeatures(void)
{
  uint8_t dt[1] = {ACTIVATE};
  CS_ON;
  HAL_SPI_Transmit(&hspi1,dt,1,1000);
  DelayMicro(1);
  dt[0] = 0x73;
  HAL_SPI_Transmit(&hspi1,dt,1,1000);
  CS_OFF;
}
//-----------------------------------------------
void NRF24_Read_Buf(uint8_t addr,uint8_t *pBuf,uint8_t bytes)
{
  CS_ON;
  HAL_SPI_Transmit(&hspi1,&addr,1,1000);//îòïðàâèì àäðåñ â øèíó
  HAL_SPI_Receive(&hspi1,pBuf,bytes,1000);//îòïðàâèì äàííûå â áóôåð
  CS_OFF;
}
//------------------------------------------------
void NRF24_Write_Buf(uint8_t addr,uint8_t *pBuf,uint8_t bytes)
{
  addr |= W_REGISTER;//âêëþ÷èì áèò çàïèñè â àäðåñ
  CS_ON;
  HAL_SPI_Transmit(&hspi1,&addr,1,1000);//îòïðàâèì àäðåñ â øèíó
  DelayMicro(1);
  HAL_SPI_Transmit(&hspi1,pBuf,bytes,1000);//îòïðàâèì äàííûå â áóôåð
  CS_OFF;
}
//------------------------------------------------
void NRF24_FlushRX(void)
{
  uint8_t dt[1] = {FLUSH_RX};
  CS_ON;
  HAL_SPI_Transmit(&hspi1,dt,1,1000);
  DelayMicro(1);
  CS_OFF;
}
//------------------------------------------------
void NRF24_FlushTX(void)
{
  uint8_t dt[1] = {FLUSH_TX};
  CS_ON;
  HAL_SPI_Transmit(&hspi1,dt,1,1000);
  DelayMicro(1);
  CS_OFF;
}
//------------------------------------------------
void NRF24L01_RX_Mode(void)
{
  uint8_t regval=0x00;
  regval = NRF24_ReadReg(CONFIG);
  //ðàçáóäèì ìîäóëü è ïåðåâåä¸ì åãî â ðåæèì ïðè¸ìíèêà, âêëþ÷èâ áèòû PWR_UP è PRIM_RX
  regval |= (1<<PWR_UP)|(1<<PRIM_RX);
  NRF24_WriteReg(CONFIG,regval);
	NRF24_Write_Buf(TX_ADDR, TX_ADDRESS1, TX_ADR_WIDTH);
	NRF24_Write_Buf(RX_ADDR_P0, TX_ADDRESS1, TX_ADR_WIDTH);
  CE_SET;
  DelayMicro(150);
  // Flush buffers
  NRF24_FlushRX();
  NRF24_FlushTX();
}
//------------------------------------------------
void NRF24L01_TX_Mode(uint8_t *pBuf)
{
  NRF24_Write_Buf(TX_ADDR, TX_ADDRESS0, TX_ADR_WIDTH);
	NRF24_Write_Buf(RX_ADDR_P0, TX_ADDRESS0, TX_ADR_WIDTH);
  CE_RESET;
  // Flush buffers
  NRF24_FlushRX();
  NRF24_FlushTX();
}
//------------------------------------------------
void NRF24_Transmit(uint8_t addr,uint8_t *pBuf,uint8_t bytes)
{
  CE_RESET;
  CS_ON;
  HAL_SPI_Transmit(&hspi1,&addr,1,1000);//îòïðàâèì àäðåñ â øèíó
  DelayMicro(1);
  HAL_SPI_Transmit(&hspi1,pBuf,bytes,1000);//îòïðàâèì äàííûå â áóôåð
  CS_OFF;
  CE_SET;
}
//------------------------------------------------
uint8_t NRF24L01_Send(uint8_t *pBuf)
{
 uint8_t regval=0x00;
  NRF24L01_TX_Mode(pBuf);
  regval = NRF24_ReadReg(CONFIG);
  //åñëè ìîäóëü óøåë â ñïÿùèé ðåæèì, òî ðàçáóäèì åãî, âêëþ÷èâ áèò PWR_UP è âûêëþ÷èâ PRIM_RX
  regval |= (1<<PWR_UP);
  regval &= ~(1<<PRIM_RX);
  NRF24_WriteReg(CONFIG,regval);
  DelayMicro(150); //Çàäåðæêà ìèíèìóì 130 ìêñ
  //Îòïðàâèì äàííûå â âîçäóõ
  NRF24_Transmit(WR_TX_PLOAD, pBuf, TX_PLOAD_WIDTH);
  CE_SET;
  DelayMicro(15); //minimum 10us high pulse (Page 21)
  CE_RESET;
  return 0;
}
//------------------------------------------------
void NRF24L01_Receive(void)
{
//if(rx_flag==1)
//{
//	HAL_Delay(1);
//			LED_TGL;
//	for(int i=0;i<Tx_index;i+=5)
//	{
//		for(int j=0;j<5;j++)
//		{
//			if((i+j)<Tx_index)
//			TX_BUF[j]=Tx_str[i+j];
//			else
//				TX_BUF[j]=0;
//		}		
//		NRF24L01_Send(TX_BUF);
//	HAL_Delay(1);
//	}
////	NRF24L01_Send(Tx_str);
//	rx_flag = 0;
//}
}

void IRQ_Callback(void)
{
  uint8_t status=0x01;
  DelayMicro(10);
  status = NRF24_ReadReg(STATUS);
  if(status & 0x40)
  { 
    NRF24_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);
    NRF24_WriteReg(STATUS, 0x40);
		for(int i=0;i<5;i++)
		{
			if(RX_BUF[i]==';')
			{
				//LED_TGL;
				Rx_str[Rx_index]=RX_BUF[i];
				Rx_index++;
				rx_flag = 1;
				
			}
			else
			{
				Rx_str[Rx_index]=RX_BUF[i];
				Rx_index++;
			}
		}
  }
  if(status&TX_DS) //tx_ds == 0x20
  {
   // LED_TGL;
    NRF24_WriteReg(STATUS, 0x20);
    NRF24L01_RX_Mode();
    tx_flag = 1;
  }
  else if(status&MAX_RT)
  {
    NRF24_WriteReg(STATUS, 0x10);
    NRF24_FlushTX();
    //Óõîäèì â ðåæèì ïðè¸ìíèêà
    NRF24L01_RX_Mode();
  }

}
//------------------------------------------------
void NRF24_ini(void)
{
	CE_RESET;
  DelayMicro(5000);
	NRF24_WriteReg(CONFIG, 0x0a); // Set PWR_UP bit, enable CRC(1 byte) &Prim_RX:0 (Transmitter)
  DelayMicro(5000);
	NRF24_WriteReg(EN_AA, 0x01); // Enable Pipe0
	NRF24_WriteReg(EN_RXADDR, 0x01); // Enable Pipe0
	NRF24_WriteReg(SETUP_AW, 0x01); // Setup address width=3 bytes
	NRF24_WriteReg(SETUP_RETR, 0x5F); // // 1500us, 15 retrans
	NRF24_ToggleFeatures();
	NRF24_WriteReg(FEATURE, 0);
	NRF24_WriteReg(DYNPD, 0);
	NRF24_WriteReg(STATUS, 0x70); //Reset flags for IRQ
	NRF24_WriteReg(RF_CH, 76); // ÷àñòîòà 2476 MHz
	NRF24_WriteReg(RF_SETUP, 0x06); //TX_PWR:0dBm, Datarate:1Mbps
	NRF24_Write_Buf(TX_ADDR, TX_ADDRESS0, TX_ADR_WIDTH);
	NRF24_Write_Buf(RX_ADDR_P0, TX_ADDRESS0, TX_ADR_WIDTH);
	NRF24_WriteReg(RX_PW_P0, TX_PLOAD_WIDTH); //Number of bytes in RX payload in data pipe 0
 //ïîêà óõîäèì â ðåæèì ïðè¸ìíèêà
  NRF24L01_RX_Mode();
 // LED_OFF;
}
//--------------------------------------------------

 

Revise this Paste

Your Name: Code Language: