mirror of
https://github.com/IcedRooibos/py32f0-template.git
synced 2025-10-29 17:02:04 -07:00
refactor: nrf24l01 example, rx interrupt
This commit is contained in:
parent
d430e05ff4
commit
8d60209268
@ -17,13 +17,15 @@
|
|||||||
#include "py32f0xx_bsp_printf.h"
|
#include "py32f0xx_bsp_printf.h"
|
||||||
#include "nrf24l01.h"
|
#include "nrf24l01.h"
|
||||||
|
|
||||||
|
/* MODE_TX, MODE_RX, MODE_RX_INT */
|
||||||
|
#define MODE_TX 0
|
||||||
|
#define MODE_RX 2
|
||||||
|
#define MODE_RX_INT 3
|
||||||
|
#define NRF24_MODE MODE_TX
|
||||||
|
|
||||||
uint8_t RX_ADDRESS[NRF24L01_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x65};
|
uint8_t RX_ADDRESS[NRF24L01_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x65};
|
||||||
uint8_t TX_ADDRESS[NRF24L01_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x22};
|
uint8_t TX_ADDRESS[NRF24L01_ADDR_WIDTH] = {0x32,0x4E,0x6F,0x64,0x22};
|
||||||
|
|
||||||
/*-----------------------------------------------------*/
|
|
||||||
/* Mode: sending:1 or receiving:0 */
|
|
||||||
uint8_t Mode = 1;
|
|
||||||
/*-----------------------------------------------------*/
|
|
||||||
extern uint8_t RX_BUF[];
|
extern uint8_t RX_BUF[];
|
||||||
extern uint8_t TX_BUF[];
|
extern uint8_t TX_BUF[];
|
||||||
|
|
||||||
@ -50,42 +52,58 @@ int main(void)
|
|||||||
|
|
||||||
while (NRF24L01_Check() != 0)
|
while (NRF24L01_Check() != 0)
|
||||||
{
|
{
|
||||||
printf("nRF24L01 check failed\r\n");
|
printf("nRF24L01 check: error\r\n");
|
||||||
LL_mDelay(2000);
|
LL_mDelay(2000);
|
||||||
}
|
}
|
||||||
printf("nRF24L01 check succeeded\r\n");
|
printf("nRF24L01 check: succ\r\n");
|
||||||
|
|
||||||
if (Mode == 1)
|
#if (NRF24_MODE == MODE_RX)
|
||||||
{
|
printf("nRF24L01 in RX polling mode\r\n");
|
||||||
printf("nRF24L01 in SEND mode\r\n");
|
|
||||||
NRF24L01_TX_Mode(RX_ADDRESS, TX_ADDRESS);
|
|
||||||
}
|
|
||||||
else if (Mode == 0)
|
|
||||||
{
|
|
||||||
printf("nRF24L01 in RECEIVE mode\r\n");
|
|
||||||
NRF24L01_RX_Mode(TX_ADDRESS, RX_ADDRESS);
|
NRF24L01_RX_Mode(TX_ADDRESS, RX_ADDRESS);
|
||||||
|
NRF24L01_DumpConfig();
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
NRF24L01_RxPacket(RX_BUF);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1)
|
#elif (NRF24_MODE == MODE_RX_INT)
|
||||||
{
|
printf("nRF24L01 in RX interrupt mode\r\n");
|
||||||
|
NRF24L01_RX_Mode(TX_ADDRESS, RX_ADDRESS);
|
||||||
|
NRF24L01_ClearIRQFlags();
|
||||||
NRF24L01_DumpConfig();
|
NRF24L01_DumpConfig();
|
||||||
|
|
||||||
if (Mode == 1)
|
|
||||||
{
|
while(1);
|
||||||
|
|
||||||
|
#elif (NRF24_MODE == MODE_TX)
|
||||||
uint8_t tmp[] = {0x1f,
|
uint8_t tmp[] = {0x1f,
|
||||||
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
|
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
|
||||||
0x21, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28,
|
0x21, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28,
|
||||||
0x31, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x38,
|
0x31, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x38,
|
||||||
0x41, 0x12, 0x13, 0x14, 0x15, 0x16, 0x47, 0x48};
|
0x41, 0x12, 0x13, 0x14, 0x15, 0x16, 0x47, 0x48};
|
||||||
NRF24L01_TxPacket(tmp, 32);
|
printf("nRF24L01 in TX mode\r\n");
|
||||||
LL_mDelay(1000);
|
NRF24L01_TX_Mode(RX_ADDRESS, TX_ADDRESS);
|
||||||
}
|
NRF24L01_DumpConfig();
|
||||||
else if (Mode == 0)
|
|
||||||
|
while(1)
|
||||||
{
|
{
|
||||||
NRF24L01_RxPacket(RX_BUF);
|
NRF24L01_TxPacket(tmp, 32);
|
||||||
|
LL_mDelay(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (NRF24_MODE == MODE_RX_INT)
|
||||||
|
void EXTI4_15_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(LL_EXTI_IsActiveFlag(LL_EXTI_LINE_4))
|
||||||
|
{
|
||||||
|
NRF24L01_IntRxPacket(RX_BUF);
|
||||||
|
LL_EXTI_ClearFlag(LL_EXTI_LINE_4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t SPI_TxRxByte(uint8_t data)
|
uint8_t SPI_TxRxByte(uint8_t data)
|
||||||
{
|
{
|
||||||
@ -108,6 +126,10 @@ uint8_t SPI_TxRxByte(uint8_t data)
|
|||||||
static void APP_GPIOConfig(void)
|
static void APP_GPIOConfig(void)
|
||||||
{
|
{
|
||||||
LL_GPIO_InitTypeDef GPIO_InitStruct;
|
LL_GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
#if (NRF24_MODE == MODE_RX_INT)
|
||||||
|
LL_EXTI_InitTypeDef EXTI_InitStruct;
|
||||||
|
#endif
|
||||||
|
|
||||||
// PA6 CSN
|
// PA6 CSN
|
||||||
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_OUTPUT);
|
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_OUTPUT);
|
||||||
// PA5 CE
|
// PA5 CE
|
||||||
@ -117,6 +139,18 @@ static void APP_GPIOConfig(void)
|
|||||||
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
|
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
|
||||||
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
|
||||||
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
#if (NRF24_MODE == MODE_RX_INT)
|
||||||
|
/* Triggerred by falling edge */
|
||||||
|
EXTI_InitStruct.Line = LL_EXTI_LINE_4;
|
||||||
|
EXTI_InitStruct.LineCommand = ENABLE;
|
||||||
|
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
|
||||||
|
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
|
||||||
|
LL_EXTI_Init(&EXTI_InitStruct);
|
||||||
|
|
||||||
|
NVIC_SetPriority(EXTI4_15_IRQn, 1);
|
||||||
|
NVIC_EnableIRQ(EXTI4_15_IRQn);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -190,6 +190,7 @@ void NRF24L01_RX_Mode(uint8_t *rx_addr, uint8_t *tx_addr)
|
|||||||
*/
|
*/
|
||||||
NRF24L01_Write_Reg(NRF24L01_CMD_REGISTER_W + NRF24L01_REG_CONFIG, 0x0f); //RX,PWR_UP,CRC16,EN_CRC
|
NRF24L01_Write_Reg(NRF24L01_CMD_REGISTER_W + NRF24L01_REG_CONFIG, 0x0f); //RX,PWR_UP,CRC16,EN_CRC
|
||||||
CE(1);
|
CE(1);
|
||||||
|
NRF24L01_FlushRX();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -215,15 +216,17 @@ uint8_t NRF24L01_RxPacket(uint8_t *rx_buf)
|
|||||||
while(IRQ);
|
while(IRQ);
|
||||||
CE(0);
|
CE(0);
|
||||||
status = NRF24L01_Read_Reg(NRF24L01_REG_STATUS);
|
status = NRF24L01_Read_Reg(NRF24L01_REG_STATUS);
|
||||||
printf("Interrupted, status: %02X\r\n", status);
|
BSP_UART_TxHex8(status);
|
||||||
|
BSP_UART_TxChar(':');
|
||||||
|
|
||||||
if(status & NRF24L01_FLAG_RX_DREADY)
|
if(status & NRF24L01_FLAG_RX_DREADY)
|
||||||
{
|
{
|
||||||
NRF24L01_Read_To_Buf(NRF24L01_CMD_RX_PLOAD_R, rx_buf, NRF24L01_PLOAD_WIDTH);
|
NRF24L01_Read_To_Buf(NRF24L01_CMD_RX_PLOAD_R, rx_buf, NRF24L01_PLOAD_WIDTH);
|
||||||
for (int i = 0; i < 32; i++)
|
for (int i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
printf("%02X ", RX_BUF[i]);
|
BSP_UART_TxHex8(RX_BUF[i]);
|
||||||
}
|
}
|
||||||
|
BSP_UART_TxString("\r\n");
|
||||||
result = 1;
|
result = 1;
|
||||||
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_RX_DREADY);
|
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_RX_DREADY);
|
||||||
}
|
}
|
||||||
@ -231,6 +234,32 @@ uint8_t NRF24L01_RxPacket(uint8_t *rx_buf)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read in interrupt
|
||||||
|
*/
|
||||||
|
void NRF24L01_IntRxPacket(uint8_t *rx_buf)
|
||||||
|
{
|
||||||
|
uint8_t status;
|
||||||
|
CE(0);
|
||||||
|
status = NRF24L01_Read_Reg(NRF24L01_REG_STATUS);
|
||||||
|
BSP_UART_TxHex8(status);
|
||||||
|
BSP_UART_TxChar(':');
|
||||||
|
|
||||||
|
if(status & NRF24L01_FLAG_RX_DREADY)
|
||||||
|
{
|
||||||
|
NRF24L01_Read_To_Buf(NRF24L01_CMD_RX_PLOAD_R, rx_buf, NRF24L01_PLOAD_WIDTH);
|
||||||
|
for (int i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
BSP_UART_TxHex8(RX_BUF[i]);
|
||||||
|
}
|
||||||
|
BSP_UART_TxString("\r\n");
|
||||||
|
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_RX_DREADY);
|
||||||
|
}
|
||||||
|
status |= NRF24L01_MASK_STATUS_IRQ;
|
||||||
|
NRF24L01_Write_Reg(NRF24L01_REG_STATUS, status);
|
||||||
|
CE(1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send data in tx_buf and wait till data is sent or max re-tr reached
|
* Send data in tx_buf and wait till data is sent or max re-tr reached
|
||||||
*/
|
*/
|
||||||
@ -245,20 +274,20 @@ uint8_t NRF24L01_TxPacket(uint8_t *tx_buf, uint8_t len)
|
|||||||
|
|
||||||
CE(0);
|
CE(0);
|
||||||
status = NRF24L01_Read_Reg(NRF24L01_REG_STATUS);
|
status = NRF24L01_Read_Reg(NRF24L01_REG_STATUS);
|
||||||
printf("Interrupted, status: %02X\r\n", status);
|
BSP_UART_TxHex8(status);
|
||||||
|
BSP_UART_TxChar(':');
|
||||||
if(status & NRF24L01_FLAG_TX_DSENT)
|
if(status & NRF24L01_FLAG_TX_DSENT)
|
||||||
{
|
{
|
||||||
printf("Data sent: ");
|
BSP_UART_TxString("Data sent: ");
|
||||||
for (uint8_t i = 0; i < len; i++) {
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
printf("%02X ", tx_buf[i]);
|
BSP_UART_TxHex8(tx_buf[i]);
|
||||||
}
|
}
|
||||||
printf("\r\n");
|
BSP_UART_TxString("\r\n");
|
||||||
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_TX_DSENT);
|
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_TX_DSENT);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(status & NRF24L01_FLAG_MAX_RT)
|
else if(status & NRF24L01_FLAG_MAX_RT)
|
||||||
{
|
{
|
||||||
printf("Sending exceeds max retries\r\n");
|
BSP_UART_TxString("Sending exceeds max retries\r\n");
|
||||||
NRF24L01_FlushTX();
|
NRF24L01_FlushTX();
|
||||||
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_MAX_RT);
|
NRF24L01_ClearIRQFlag(NRF24L01_FLAG_MAX_RT);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -124,6 +124,7 @@ uint8_t NRF24L01_Write_From_Buf(uint8_t reg,uint8_t *pBuf,uint8_t len);
|
|||||||
* Hold till data received and written to rx_buf
|
* Hold till data received and written to rx_buf
|
||||||
*/
|
*/
|
||||||
uint8_t NRF24L01_RxPacket(uint8_t *rx_buf);
|
uint8_t NRF24L01_RxPacket(uint8_t *rx_buf);
|
||||||
|
void NRF24L01_IntRxPacket(uint8_t *rx_buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send data in tx_buf and wait till data is sent or max re-tr reached
|
* Send data in tx_buf and wait till data is sent or max re-tr reached
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user