查了很对想要实现一对一互传,实际都是使用接收发送模式不断的切换来实现的;本例程使用的是STM32F103C8T6的板子,SPI接口使用的SPI2,SPI_NSS是靠引脚上下拉(hal_gpio_write())控制,本来以为Cubemx选择了引脚SPI_NSS输出,hal库的SPI会自动拉高拉低NSS引脚,发现不能自动拉,也没有仔细去查芯片的数据手册看原因,就直接定义为普通引脚上下拉控制。
使用FREERTOS,单开一个线程接收与发送,一个做为主发送,另一个做主接收,所以循环中,当主发送端长时间接收不到数据会进入发送模式;同理,主接收端在长时间发送失败时会进入接收模式;这样会避免两个设备因时序不同导致进入死循环无法相互通讯;
发送与接收放在同一个线程中,主发送或主接收的自行注释即可,线程进入循环前有一个USB初始化,因为本人调试过程是使用USB输出打印,大家也可以改为其他方式输出打印信息;
关于NRF24L01工作流程及配置可参考https://blog.csdn.net/m0_37968313/article/details/98219062
void StartDefaultTask(void const * argument)
{
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init(); //调试过程中使用USB输出打印
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
//接收模式
// uint8_t flag=0X20;
// uint32_t time_out=0;
// for(;;)
// {
// NF24G_init(0);
// time_out=0;
// while(flag != 0x20)
// {
// flag = NF24G_TxPack(version,sizeof (version));
// if(time_out >= 40) flag = 0x20;
// osDelay(1);
// time_out ++;
// }
// NF24G_init(1);
// while(flag == 0x20)
// {
// if(NF24G_RxPack(NF_RxPack))
// {
// flag = 0;
// usbvcom_printf("\r\n Rx_mode Rxpack =%s",NF_RxPack);
// }
// osDelay(1);
// }
// }
//发送模式
uint8_t flag=0;
uint32_t time_out=0;
for(;;)
{
NF24G_init(0);
while(flag != 0x20)
{
flag = NF24G_TxPack(version,sizeof (version));
osDelay(1);
}
NF24G_init(1);
while(flag == 0x20)
{
if((NF24G_RxPack(NF_RxPack))||(time_out>=20))
{
time_out =0;
flag = 0;
usbvcom_printf("\r\n Tx_mode Rxpack =%s",NF_RxPack);
}
osDelay(1);
time_out ++;
}
}
/* USER CODE END StartDefaultTask */
}
过程已附上,需要可自行下载