实验思路:
1、在 main 中每两秒发射一次数据,调试输出发射的数据内容。
2、在发射模块的 IRQ 中断(PC8)中,对发射情况进行调试输出。
3、在接收模块的 IRQ 中断(PC9)中,对接收情况进行调试输出,并调试输出接收的内容。
经过调试输出判断,NRF24L01 先进行发射,如果成功,会先在接收端产生 RX_OK 中断,然后是发送方产生 TX_OK 中断。如果发送不成功,仅在发送端产生 MAX_TX 中断。
相关代码
[C] 纯文本查看 复制代码
int main(void){ _Init(); while (1) { static u32 i = 0; u8 lTxBuffer[33]; i++; sprintf((char *)lTxBuffer, "%032d", i); oDebug("RF1 => [%s]rn", lTxBuffer); WIRELESS_SendPacket(WIRELESS1, lTxBuffer); LED1 = !LED1; Wait_s(2); }}
NRF24L01 中为配合中断方式,做了些调整,代码如下
[C] 纯文本查看 复制代码
static bool WIRELESS1_IsIrqHandled;static bool WIRELESS2_IsIrqHandled;...void WIRELESS_IrqHandled(u8 aWhichWireless){ switch(aWhichWireless) { case WIRELESS1: WIRELESS1_IsIrqHandled = TRUE; break; case WIRELESS2: WIRELESS2_IsIrqHandled = TRUE; break; }}void WIRELESS_SendPacket(u8 aWhichWireless, u8 *aBuffer){ switch(aWhichWireless) { case WIRELESS1: WIRELESS1_CE = 0; WIRELESS1_IsIrqHandled = FALSE; break; case WIRELESS2: WIRELESS2_CE = 0; WIRELESS2_IsIrqHandled = FALSE; break; } WIRELESS_WriteBuffer(aWhichWireless, NFR_WRITE_TX_PAYLOAD, aBuffer, WIRELESS_TX_PAYLOAD_WIDTH); switch(aWhichWireless) { case WIRELESS1: WIRELESS1_CE = 1; do { Wait_us(10);} while(WIRELESS1_IsIrqHandled == FALSE); break; case WIRELESS2: WIRELESS2_CE = 1; do { Wait_us(10);} while(WIRELESS2_IsIrqHandled == FALSE); break; } return; }
中断处理代码如下:
[C] 纯文本查看 复制代码
void EXTI9_5_IRQHandler(void){ // WIRELESS1 触发的中断 if(EXTI_GetITStatus(EXTI_Line8) == SET) { u8 lStatus = WIRELESS_ReadReg(WIRELESS1, NRF_READ_REG + NFR_STATUS); // 读取状态寄存器的值 oDebug("RF1 => "); if(lStatus & NFR_MAX_TX) // 达到最大重发次数 { WIRELESS_WriteReg(WIRELESS1, NFR_FLUSH_TX, 0xFF); // 清除TX FIFO寄存器 oDebug("MAX_TXrn"); } if(lStatus & NFR_TX_OK) // 发送完成 { oDebug("TX_OKrn"); } if(lStatus & NFR_RX_OK) // 接收完成 { oDebug("RX_OKrn"); } // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志 WIRELESS_WriteReg(WIRELESS1, NRF_WRITE_REG + NFR_STATUS, lStatus); WIRELESS_IrqHandled(WIRELESS1); EXTI_ClearITPendingBit(EXTI_Line8); } if(EXTI_GetITStatus(EXTI_Line9) == SET) { u8 lStatus = WIRELESS_ReadReg(WIRELESS2, NRF_READ_REG + NFR_STATUS); // 读取状态寄存器的值 oDebug("RF2 => "); if(lStatus & NFR_MAX_TX) // 达到最大重发次数 { WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_TX, 0xFF); // 清除TX FIFO寄存器 oDebug("MAX_TXrn"); } if(lStatus & NFR_TX_OK) // 发送完成 { oDebug("TX_OKrn"); } if(lStatus & NFR_RX_OK) // 接收完成 { u8 lRxBuffer[33]; oDebug("RX_OK"); WIRELESS_ReadBuffer(WIRELESS2, NFR_READ_RX_PAYLOAD, lRxBuffer, WIRELESS_RX_PAYLOAD_WIDTH); // 读取数据 WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_RX, 0xFF); // 清除RX FIFO寄存器 lRxBuffer[32] = 0; oDebug("[%s]rn", lRxBuffer); } // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志 WIRELESS_WriteReg(WIRELESS2, NRF_WRITE_REG + NFR_STATUS, lStatus); WIRELESS_IrqHandled(WIRELESS2); EXTI_ClearITPendingBit(EXTI_Line9); }}
实验思路:
1、在 main 中每两秒发射一次数据,调试输出发射的数据内容。
2、在发射模块的 IRQ 中断(PC8)中,对发射情况进行调试输出。
3、在接收模块的 IRQ 中断(PC9)中,对接收情况进行调试输出,并调试输出接收的内容。
经过调试输出判断,NRF24L01 先进行发射,如果成功,会先在接收端产生 RX_OK 中断,然后是发送方产生 TX_OK 中断。如果发送不成功,仅在发送端产生 MAX_TX 中断。
相关代码
[C] 纯文本查看 复制代码
int main(void){ _Init(); while (1) { static u32 i = 0; u8 lTxBuffer[33]; i++; sprintf((char *)lTxBuffer, "%032d", i); oDebug("RF1 => [%s]rn", lTxBuffer); WIRELESS_SendPacket(WIRELESS1, lTxBuffer); LED1 = !LED1; Wait_s(2); }}
NRF24L01 中为配合中断方式,做了些调整,代码如下
[C] 纯文本查看 复制代码
static bool WIRELESS1_IsIrqHandled;static bool WIRELESS2_IsIrqHandled;...void WIRELESS_IrqHandled(u8 aWhichWireless){ switch(aWhichWireless) { case WIRELESS1: WIRELESS1_IsIrqHandled = TRUE; break; case WIRELESS2: WIRELESS2_IsIrqHandled = TRUE; break; }}void WIRELESS_SendPacket(u8 aWhichWireless, u8 *aBuffer){ switch(aWhichWireless) { case WIRELESS1: WIRELESS1_CE = 0; WIRELESS1_IsIrqHandled = FALSE; break; case WIRELESS2: WIRELESS2_CE = 0; WIRELESS2_IsIrqHandled = FALSE; break; } WIRELESS_WriteBuffer(aWhichWireless, NFR_WRITE_TX_PAYLOAD, aBuffer, WIRELESS_TX_PAYLOAD_WIDTH); switch(aWhichWireless) { case WIRELESS1: WIRELESS1_CE = 1; do { Wait_us(10);} while(WIRELESS1_IsIrqHandled == FALSE); break; case WIRELESS2: WIRELESS2_CE = 1; do { Wait_us(10);} while(WIRELESS2_IsIrqHandled == FALSE); break; } return; }
中断处理代码如下:
[C] 纯文本查看 复制代码
void EXTI9_5_IRQHandler(void){ // WIRELESS1 触发的中断 if(EXTI_GetITStatus(EXTI_Line8) == SET) { u8 lStatus = WIRELESS_ReadReg(WIRELESS1, NRF_READ_REG + NFR_STATUS); // 读取状态寄存器的值 oDebug("RF1 => "); if(lStatus & NFR_MAX_TX) // 达到最大重发次数 { WIRELESS_WriteReg(WIRELESS1, NFR_FLUSH_TX, 0xFF); // 清除TX FIFO寄存器 oDebug("MAX_TXrn"); } if(lStatus & NFR_TX_OK) // 发送完成 { oDebug("TX_OKrn"); } if(lStatus & NFR_RX_OK) // 接收完成 { oDebug("RX_OKrn"); } // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志 WIRELESS_WriteReg(WIRELESS1, NRF_WRITE_REG + NFR_STATUS, lStatus); WIRELESS_IrqHandled(WIRELESS1); EXTI_ClearITPendingBit(EXTI_Line8); } if(EXTI_GetITStatus(EXTI_Line9) == SET) { u8 lStatus = WIRELESS_ReadReg(WIRELESS2, NRF_READ_REG + NFR_STATUS); // 读取状态寄存器的值 oDebug("RF2 => "); if(lStatus & NFR_MAX_TX) // 达到最大重发次数 { WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_TX, 0xFF); // 清除TX FIFO寄存器 oDebug("MAX_TXrn"); } if(lStatus & NFR_TX_OK) // 发送完成 { oDebug("TX_OKrn"); } if(lStatus & NFR_RX_OK) // 接收完成 { u8 lRxBuffer[33]; oDebug("RX_OK"); WIRELESS_ReadBuffer(WIRELESS2, NFR_READ_RX_PAYLOAD, lRxBuffer, WIRELESS_RX_PAYLOAD_WIDTH); // 读取数据 WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_RX, 0xFF); // 清除RX FIFO寄存器 lRxBuffer[32] = 0; oDebug("[%s]rn", lRxBuffer); } // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志 WIRELESS_WriteReg(WIRELESS2, NRF_WRITE_REG + NFR_STATUS, lStatus); WIRELESS_IrqHandled(WIRELESS2); EXTI_ClearITPendingBit(EXTI_Line9); }}
举报