#include "NRF24L01.h"
#include "spi.h"
#include "main.h"
//const uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ·
//const uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ·
uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ·
uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ·
uint8_t rxBuffer;
void NRF_WriteBuf(uint8_t reg, uint8_t *buf, uint8_t len) {
CSN_L;
HAL_SPI_Transmit(&hspi1, ®, 1, 100);
HAL_SPI_Transmit(&hspi1, buf, len, 100);
CSN_H;
}
void NRF_Init(void) {
CE_L; // ???CE??
CSN_H; // ???CSN??
HAL_Delay(100); // ??????
// 1. ???????(?????????)
// ????:PRIM_RX=0;??:PWR_UP=1;??CRC:EN_CRC=1
NRF_WriteReg(NRF_REG_CONFIG, 0x0E); // 0x0E = 00001110
// ??CONFIG??????(??!)
uint8_t config = NRF_ReadReg(NRF_REG_CONFIG);
// 2. ??????(?????)
NRF_WriteReg(NRF_REG_SETUP_AW, 0x03); // ????5??
NRF_WriteReg(NRF_REG_EN_AA, 0x01); // ????0????
NRF_WriteReg(NRF_REG_EN_RXADDR, 0x01); // ????0????
NRF_WriteReg(NRF_REG_RF_CH, 0x02); // ????2
NRF_WriteReg(NRF_REG_RF_SETUP, 0x07); // ??2Mbps,??0dBm
NRF_WriteReg(NRF_REG_RX_PW_P0, 0x01); // ??????1??
NRF_WriteBuf(NRF_REG_TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
NRF_WriteBuf(NRF_REG_RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
uint8_t cmd_flush_tx = NRF_CMD_FLUSH_TX;
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY);
CSN_H;
uint8_t fifo_status = NRF_ReadReg(NRF_REG_FIFO_STATUS);
CE_L;
HAL_Delay(10);
}
//¶ÁÈ¡¼Ä´æÆ÷
uint8_t NRF_ReadReg(uint8_t reg) {
uint8_t cmd = reg | 0x01;
uint8_t value;
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, &value, 1, HAL_MAX_DELAY);
CSN_H;
return value;
}
//дÈë¼Ä´æÆ÷
void NRF_WriteReg(uint8_t reg, uint8_t value) {
uint8_t cmd = reg & 0xFE; // ???:?????&0xFE
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_SPI_Transmit(&hspi1, &value, 1, HAL_MAX_DELAY);
CSN_H;
uint8_t verify = NRF_ReadReg(reg);
}
//дÈ뺯Êý
uint8_t NRF_SendByte(uint8_t data) {
// 1. ??????????(??SPI????)
uint8_t cmd_flush_tx = NRF_CMD_FLUSH_TX;
uint8_t cmd_w_tx_payload = NRF_CMD_W_TX_PAYLOAD;
// 2. ????FIFO
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY); // ????????
CSN_H;
// 3. ???????FIFO
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd_w_tx_payload, 1, HAL_MAX_DELAY); // ????????
HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
CSN_H;
// 4. ????(CE??10us????)
CE_H;
__NOP();__NOP();__NOP();__NOP();__NOP(); // ?10us(??MCU????)
CE_L;
// 5. ?????????
uint32_t timeout = 0;
while(1) {
uint8_t status = NRF_ReadReg(NRF_REG_STATUS);
// ????(TX_DS????)
if (status & (1 << 5)) {
NRF_WriteReg(NRF_REG_STATUS, status | (1 << 5)); // ??????
return 1;
}
// ????(????????)
if (status & (1 << 4)) {
NRF_WriteReg(NRF_REG_STATUS, status | (1 << 4)); // ??????
// ????FIFO,????????
CSN_L;
HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY);
CSN_H;
return 0;
}
// ????(?10ms,??????)
if (timeout++ > 10000) {
return 0;
}
__NOP(); // ????,??CPU??
}
}
//¶ÁÈ¡º¯Êý
uint8_t NRF_ReceiveByte(uint8_t *data) {
uint8_t status = NRF_ReadReg(NRF_REG_STATUS);
if (status & (1 << 6)) {
CSN_L;
HAL_SPI_Transmit(&hspi1, (uint8_t*)(NRF_CMD_R_RX_PAYLOAD), 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, data, 1, HAL_MAX_DELAY);
CSN_H;
NRF_WriteReg(NRF_REG_STATUS, 1 << 6);
CSN_L;
HAL_SPI_Transmit(&hspi1, (uint8_t*)(NRF_CMD_FLUSH_RX), 1, HAL_MAX_DELAY);
CSN_H;
return 1;
}
return 0;
}
发送不出数据
最新发布