关于使用STM32硬件SPI驱动NRF24L01

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于使用STM32硬件SPI驱动NRF24L01+ 今天是大年初一总算有时间做点想做很久的事了,说到NRF2401可能很多电子爱好者都有用过或是软件模拟驱动又或是用单片机自带的硬件SPI来驱动,但不管是用哪种方法来驱动我想都在调试方面耗费了不少的时间(可能那些所谓的电子工程师不会出现这种情况吧!)网上的资料确实很多,但大多数都并没有经过发贴人认真测试过,有的只是理论上可以行的通但上机测试只能说是拿回来给他修改。本文作者也是经过无助的多少天才算是调试成功了(基于STM32硬件SPI,软件模拟的以前用51单片机已经调通了今天就不准备再拿来讲了,当然如果以后有朋友有需要也可以告诉我,我也可以重新写一篇关于51的驱动的只要有时间是没有问题的。)因为我用的是STM32F103C8T6的系统而且是刚接触不知道别的系统和我用的这个系统有多大的差别所以我不会整个代码全贴上来就完事了,我将就着重思路配合代码写出来,这样对于刚接触单片机的朋友会有很好的作用,但是还有一点请大家要原谅,可能会存在一些说的不好的地方,毕竟我没有经过正规渠道系统地学习过电子知识,对于前辈来说存在这样那样的问题不可避免的,在此也希望大家指教!

贴个图先:

NRF2401+的资料大家上网查一下,我输字的速度有点不好说!下面我来说一下整个调试流程吧

1.先把STM32串口一调通(因为我不知道STM32 I/O口不知可不可以像51那样并口输出数据,如果可以那就更方便啰)。

2.与NRF2401建立起通信(这个才是问题的关键);

3.利用读NRF2401的一个状态寄存器(STATUS)的值并通过串口发送到PC后通过51下载软件的串口助手显示出来(如果你用液晶来调试那你太有才了,你液晶和NRF2401存在牵连可能就会给寻找不成功的原因造成困难,而且还有不少硬件工作要做)在这说一下本文只调试发送程序,致于接收只改一个程序参数就行了。

我们先来调试STM32F103C8T6的串口1吧(也就是USART1)!它是STM32F103C8T6的片上外设之一,使用它时相对来说简单了不少。首先我要说一下我们要使用STM32的片上外设那么我们必须先对其进行初始化,实际上就是经过这段初始化代码让外设根据我们的要求来工作:

void USART1_AllInit(void)//意思是USART1的所有初始化工作,我的英文不好所以可能涵数名可能也不怎么规范

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟,它是在APB2这条总线上的

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟,它也是在APB2这条总线上的,因为USART1要用到GPIOA的端口所以也要初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);//到此USART1的IO已经初始化了GPIO_InitStructure要在使用前先通过GPIO_InitTypeDef声明一下。

USART_ART_WordLength=USART_WordLength_8b;

USART_ART_StopBits=USART_StopBits_1;

USART_ART_Parity=USART_Parity_No;

USART_ART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_ART_Mode=USART_Mode_Tx;

USART_Init(USART1,&USART_InitStructure);

USART_Cmd(USART1,ENABLE);//到此USART1已经初使化完成并使能所以以后就可以用了USART_ART_BaudRate=1200;//从这开始初始化串口的工作波特率1200,每帧数据8位长度,停此位1位,不进行较验,硬件流禁止,工作在发送模式,因为要用到USART_InitStructure所以在这之前因该找个合适的地方先使用串口初始化结构体声明一下,说一下我是在主涵数之前声明的。

}

那么我们来发送一个数字到串口然后通过串口助手看下收到的是什么看看串口按要求工作没有;

#include

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

//把上面刚写的串口初始化涵数也加到这来!

Int main(void)

{

USART1_AllInit();

While(1)

{

USART_SendData(USART1,0XAA);

}

}

然后打开串口助手设置波特率为1200,不较验,1位停止位。收到数据是0XAA吧!简单吧哈哈!我没有网络不能用QQ剪切屏幕啊要不把效果也贴止来就好了。好了串口就这样被我们调通了兴奋不?不单可以用在我们今天的调试上哦,在主涵数头你想要它在什么时侯发送什么那就看你高兴怎么用了。

好了下面我们继续调试SPI吧,我用的是SPI2,SPI1认不到是我那息不小心整坏啰不的还有5转3.3V 的LM1137不过已经更换好了,还让我调了三四天时间悲哀不?所以没有一个师傅什么都写什么都伤人呀!还好后来用试波器看了下I/O才发现了原因!也是一样先初始化一下SPI2:

void SPI2_AllInit()//SPI2所有初始化乱定义的涵数名不管只要可以用就行你甚至可以用脏话只要你素质达的到就行!

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//SPI2默认I/O在GPIOB上所以RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//这个都不用说了吧

RCC_PCLK2Config(RCC_HCLK_Div2);

相关文档
最新文档