コード例 #1
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief
 * @param	Device: The device to use
 * @param	Address: A 5-byte array with the address to set [MSByte ... LSByte]
 * @param	Pipe: The pipe to set the address for. Can be 0 to 5. Pipe 0-1 are 5 bytes, pipe 2-5 are 1 byte
 * @retval	None
 */
void NRF24L01_SetRxAddressForPipe(NRF24L01_Device* Device, uint8_t* Address, uint8_t Pipe)
{
	if (Pipe < 2)
		NRF24L01_WriteRegister(Device, RX_ADDR_P0 + Pipe, Address, 5);
	else if (Pipe < 6)
		NRF24L01_WriteRegister(Device, RX_ADDR_P0 + Pipe, Address, 1);
}
コード例 #2
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Power up the device in RX mode
 * @param	Device: The device to use
 * @retval	None
 */
void NRF24L01_PowerUpInRxMode(NRF24L01_Device* Device)
{
	uint8_t data = CONFIG_BASE | (1 << PWR_UP) | (1 << PRIM_RX);
	NRF24L01_WriteRegister(Device, CONFIG, &data, 1);

	Device->InTxMode = pdFALSE;
}
コード例 #3
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Set the size of the payload for a specified pipe
 * @param	Device: The device to use
 * @param	Size: The size of the payload, can be 0 to 32 bytes, where 0 means pipe is not used
 * @param	Pipe: The pipe to set, can be 0 to 5
 * @retval	None
 */
void NRF24L01_SetPayloadSizeForPipe(NRF24L01_Device* Device, uint8_t Size, uint8_t Pipe)
{
	if (Pipe < 6 && Size < 33)
	{
		NRF24L01_WriteRegister(Device, RX_PW_P0 + Pipe, &Size, 1);
	}
}
コード例 #4
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Set the RF channel to transmit on
 * @param	Device: The device to use
 * @param	Channel: The channel
 * @retval	None
 * @note	Freq = 2400 + RF_CH [MHz], -> 2400 MHz - 2525 MHz operation frequencies
 */
void NRF24L01_SetRFChannel(NRF24L01_Device* Device, uint8_t Channel)
{
	if (Channel <= 125)
	{
		NRF24L01_WriteRegister(Device, W_REGISTER | RF_CH, &Channel, 1);
	}
}
コード例 #5
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_SetChannel(uint8_t channel) {
	if (channel <= 125 && channel != NRF24L01_Struct.Channel) {
		/* Store new channel setting */
		NRF24L01_Struct.Channel = channel;
		/* Write channel */
		NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, channel);
	}
}
コード例 #6
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Enable a pipe
 * @param	Device: The device to use
 * @param	Pipe: The pipe to enable, can be 0 to 5
 * @retval	None
 */
void NRF24L01_EnablePipe(NRF24L01_Device* Device, uint8_t Pipe)
{
	if (Pipe < 6)
	{
		uint8_t value = 0;
		NRF24L01_ReadRegister(Device, EN_RXADDR, &value, 1);	/* Get the old value */
		value |= (1 << Pipe);											/* Enable the new pipe */
		NRF24L01_WriteRegister(Device, EN_RXADDR, &value, 1);	/* Set the new value */
	}
}
コード例 #7
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_PowerUpRx(void) {
	/* Disable RX/TX mode */
	NRF24L01_CE_LOW;
	/* Clear RX buffer */
	NRF24L01_FLUSH_RX(NRF24L01_SPI);
	/* Clear interrupts */
	NRF24L01_CLEAR_INTERRUPTS;
	/* Setup RX mode */
	NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | 1 << NRF24L01_PWR_UP | 1 << NRF24L01_PRIM_RX);
	/* Start listening */
	NRF24L01_CE_HIGH;
}
コード例 #8
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_GetData(uint8_t* data) {
	/* Pull down chip select */
	NRF24L01_CSN_LOW;
	/* Send read payload command*/
	SPI_Send(NRF24L01_SPI, NRF24L01_R_RX_PAYLOAD_MASK);
	/* Read payload */
	SPI_SendMulti(NRF24L01_SPI, data, data, NRF24L01_Struct.PayloadSize);
	/* Pull up chip select */
	NRF24L01_CSN_HIGH;

	/* Reset status register, clear RX_DR interrupt flag */
	NRF24L01_WriteRegister(NRF24L01_REG_STATUS, (1 << NRF24L01_RX_DR));
}
コード例 #9
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_WriteBit(uint8_t reg, uint8_t bit, uint8_t value) {
	uint8_t tmp;
	/* Read register */
	tmp = NRF24L01_ReadRegister(reg);
	/* Make operation */
	if (value) {
		tmp |= 1 << bit;
	} else {
		tmp &= ~(1 << bit);
	}
	/* Write back */
	NRF24L01_WriteRegister(reg, tmp);
}
コード例 #10
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_SetRF(NRF24L01_DataRate_t DataRate, NRF24L01_OutputPower_t OutPwr) {
	uint8_t tmp = 0;
	NRF24L01_Struct.DataRate = DataRate;
	NRF24L01_Struct.OutPwr = OutPwr;

	if (DataRate == NRF24L01_DataRate_2M) {
		tmp |= 1 << NRF24L01_RF_DR_HIGH;
	} else if (DataRate == NRF24L01_DataRate_250k) {
		tmp |= 1 << NRF24L01_RF_DR_LOW;
	}
	/* If 1Mbps, all bits set to 0 */

	if (OutPwr == NRF24L01_OutputPower_0dBm) {
		tmp |= 3 << NRF24L01_RF_PWR;
	} else if (OutPwr == NRF24L01_OutputPower_M6dBm) {
		tmp |= 2 << NRF24L01_RF_PWR;
	} else if (OutPwr == NRF24L01_OutputPower_M12dBm) {
		tmp |= 1 << NRF24L01_RF_PWR;
	}

	NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, tmp);
}
コード例 #11
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_SoftwareReset(void) {
	uint8_t data[5];

	NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, 		NRF24L01_REG_DEFAULT_VAL_CONFIG);
	NRF24L01_WriteRegister(NRF24L01_REG_EN_AA,		NRF24L01_REG_DEFAULT_VAL_EN_AA);
	NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 	NRF24L01_REG_DEFAULT_VAL_EN_RXADDR);
	NRF24L01_WriteRegister(NRF24L01_REG_SETUP_AW, 	NRF24L01_REG_DEFAULT_VAL_SETUP_AW);
	NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 	NRF24L01_REG_DEFAULT_VAL_SETUP_RETR);
	NRF24L01_WriteRegister(NRF24L01_REG_RF_CH, 		NRF24L01_REG_DEFAULT_VAL_RF_CH);
	NRF24L01_WriteRegister(NRF24L01_REG_RF_SETUP, 	NRF24L01_REG_DEFAULT_VAL_RF_SETUP);
	NRF24L01_WriteRegister(NRF24L01_REG_STATUS, 		NRF24L01_REG_DEFAULT_VAL_STATUS);
	NRF24L01_WriteRegister(NRF24L01_REG_OBSERVE_TX, 	NRF24L01_REG_DEFAULT_VAL_OBSERVE_TX);
	NRF24L01_WriteRegister(NRF24L01_REG_RPD, 		NRF24L01_REG_DEFAULT_VAL_RPD);

	//P0
	data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_0;
	data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_1;
	data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_2;
	data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_3;
	data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P0_4;
	NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P0, data, 5);

	//P1
	data[0] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_0;
	data[1] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_1;
	data[2] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_2;
	data[3] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_3;
	data[4] = NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P1_4;
	NRF24L01_WriteRegisterMulti(NRF24L01_REG_RX_ADDR_P1, data, 5);

	NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P2, 	NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P2);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P3, 	NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P3);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P4, 	NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P4);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_ADDR_P5, 	NRF24L01_REG_DEFAULT_VAL_RX_ADDR_P5);

	//TX
	data[0] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_0;
	data[1] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_1;
	data[2] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_2;
	data[3] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_3;
	data[4] = NRF24L01_REG_DEFAULT_VAL_TX_ADDR_4;
	NRF24L01_WriteRegisterMulti(NRF24L01_REG_TX_ADDR, data, 5);

	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P0);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P1);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P2);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P3);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P4);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, 	NRF24L01_REG_DEFAULT_VAL_RX_PW_P5);
	NRF24L01_WriteRegister(NRF24L01_REG_FIFO_STATUS, NRF24L01_REG_DEFAULT_VAL_FIFO_STATUS);
	NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, 		NRF24L01_REG_DEFAULT_VAL_DYNPD);
	NRF24L01_WriteRegister(NRF24L01_REG_FEATURE, 	NRF24L01_REG_DEFAULT_VAL_FEATURE);
}
コード例 #12
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
void NRF24L01_PowerUpTx(void) {
	NRF24L01_CLEAR_INTERRUPTS;
	NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG | (0 << NRF24L01_PRIM_RX) | (1 << NRF24L01_PWR_UP));
}
コード例 #13
0
ファイル: nrf24l01.c プロジェクト: AntonLynnyk/Embedded
uint8_t NRF24L01_Init(uint8_t channel, uint8_t payload_size)
{
    /* Initialize SPI */
	SPI_Initialize();

	/* Initialize CE and CSN pins */
	NRF24L01_InitPins();

	/* Max payload is 32bytes */
	if (payload_size > 32) {
		payload_size = 32;
	}

	/* Fill structure */
	NRF24L01_Struct.Channel = !channel; /* Set channel to some different value for NRF24L01_SetChannel() function */
	NRF24L01_Struct.PayloadSize = payload_size;
	NRF24L01_Struct.OutPwr = NRF24L01_OutputPower_0dBm;
	NRF24L01_Struct.DataRate = NRF24L01_DataRate_2M;

	/* Reset nRF24L01+ to power on registers values */
	NRF24L01_SoftwareReset();

	/* Channel select */
	NRF24L01_SetChannel(channel);

	/* Set pipeline to max possible 32 bytes */
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P0, NRF24L01_Struct.PayloadSize); // Auto-ACK pipe
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P1, NRF24L01_Struct.PayloadSize); // Data payload pipe
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P2, NRF24L01_Struct.PayloadSize);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P3, NRF24L01_Struct.PayloadSize);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P4, NRF24L01_Struct.PayloadSize);
	NRF24L01_WriteRegister(NRF24L01_REG_RX_PW_P5, NRF24L01_Struct.PayloadSize);

	/* Set RF settings (2mbps, output power) */
	NRF24L01_SetRF(NRF24L01_Struct.DataRate, NRF24L01_Struct.OutPwr);

	/* Config register */
	NRF24L01_WriteRegister(NRF24L01_REG_CONFIG, NRF24L01_CONFIG);

	/* Enable auto-acknowledgment for all pipes */
	NRF24L01_WriteRegister(NRF24L01_REG_EN_AA, 0x3F);

	/* Enable RX addresses */
	NRF24L01_WriteRegister(NRF24L01_REG_EN_RXADDR, 0x3F);

	/* Auto retransmit delay: 1000 (4x250) us and Up to 15 retransmit trials */
	NRF24L01_WriteRegister(NRF24L01_REG_SETUP_RETR, 0x4F);

	/* Dynamic length configurations: No dynamic length */
	NRF24L01_WriteRegister(NRF24L01_REG_DYNPD, (0 << NRF24L01_DPL_P0) | (0 << NRF24L01_DPL_P1) | (0 << NRF24L01_DPL_P2) | (0 << NRF24L01_DPL_P3) | (0 << NRF24L01_DPL_P4) | (0 << NRF24L01_DPL_P5));

	/* Clear FIFOs */
	NRF24L01_FLUSH_TX(NRF24L01_SPI);
	NRF24L01_FLUSH_RX(NRF24L01_SPI);

	/* Clear interrupts */
	NRF24L01_CLEAR_INTERRUPTS;

	/* Go to RX mode */
	NRF24L01_PowerUpRx();

	/* Return OK */
	return 1;
}
コード例 #14
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Power down the device
 * @param	Device: The device to use
 * @retval	None
 */
void NRF24L01_PowerDownMode(NRF24L01_Device* Device)
{
	uint8_t data = CONFIG_BASE | (0 << PWR_UP);
	NRF24L01_WriteRegister(Device, CONFIG, &data, 1);
}
コード例 #15
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Reset flags related to TX (TX_DS, MAX_RT) in the STATUS register
 * @param	Device: The device to use
 * @retval	None
 */
void NRF24L01_ResetTxFlags(NRF24L01_Device* Device)
{
	uint8_t data = (1 << TX_DS) | (1 << MAX_RT);
	NRF24L01_WriteRegister(Device, STATUS, &data, 1);
}
コード例 #16
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Reset the Data Ready (RX_DR) flag in the STATUS register
 * @param	Device: The device to use
 * @retval	None
 */
void NRF24L01_ResetDataReadyFlag(NRF24L01_Device* Device)
{
	uint8_t data = (1 << RX_DR);
	NRF24L01_WriteRegister(Device, STATUS, &data, 1);
}
コード例 #17
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief	Set the address width of the device
 * @param	Device: The device to use
 * @retval	None
 */
void NRF24L01_SetAddressWidth(NRF24L01_Device* Device)
{
	NRF24L01_WriteRegister(Device, SETUP_AW, &Device->addressWidth, 1);
}
コード例 #18
0
ファイル: nrf24l01.c プロジェクト: fwengineer/STM32-Libraries
/**
 * @brief
 * @param	Device: The device to use
 * @param	Address: A 5-byte array with the address to set [MSByte ... LSByte]
 * @retval	None
 */
void NRF24L01_SetTxAddress(NRF24L01_Device* Device, uint8_t* Address)
{
	NRF24L01_WriteRegister(Device, TX_ADDR, Address, 5);
}