把上面两贴中用到的代码文件附在这里了,想详细看代码的拿去。
里面介绍了SPI的接口函数与nfr2401的配置方法,附带了nfr2401的命令宏和配置寄存器的宏,对nfr2401的理解很有帮助。
下面解读程序:
一、分析匿名四轴的程序。
1、SPI配置与程序接口
这两项在spi.c文件中,该文件只有两个函数,spi1_init()函数负责SPI1端口的配置,Spi_RW(u8 dat)函数提供了程序接口
首先是初始化函数
配置SPI1的各个端口,其中PA5~PA7是stm32的SPI1的三个主要功能接口SCK、MISO、MOSI,配置了这些接口再启动SPI1后,stm32就会自动通过这三个接口收发数据,不需要用户指定哪个接口做时钟接口,哪个接口做MOSI接口。在PCB上可以看出是这样连接三个端口的。
同理SPI2的这三个接口是PB13~PB15,下面是crazyflie的PCB连接图,可知该nfr2401接到了stm32的SPI2接口。
其他的端口CS,CE,IRQ端口依电路图配置。
然后就是Spi_RW函数
被调用的函数位于stm32的spi库函数中。
2、Nfr2401配置与程序接口
Nrf2401是通过spi端口与mcu通讯,有了上面的spi接口函数,就可以编写nrf的接口函数了。
上面的两个函数,一个是向一个nfr2401寄存器地址写入1字节的数据,另一个从寄存器中读取一个字节的数据。
上面的函数,一个是向一个寄存器地址写入pBuf地址处的uchars个字节的数据,这些数据写入寄存器reg;另一个则从寄存器reg读取uchar个字节的数据,保存在pBuf中。
上面的程序先配置频道P0接收数据地址,发送地址,地址长度
宏定义见头文件里的定义。
然后向nrf2401写待发送数据,并激发数据发送。
Nrf24l01_Init()函数则是配置NRF参数的,暂不分析。
上面是分析的匿名四轴的程序,下一贴分析crazyflie四轴的程序。
二、分析crazyflie四轴方案的程序。
该方案使用了三个文件,nRF24L01reg.h配置使用到的参数或寄存器地址的宏定义。Nrf24l01.h文件是对Nrf24l01.c文件中函数名的引用。程序实现全部在Nrf24l01.c文件中。
1、SPI程序接口
与匿名四轴基本相同,仅多了一个spiReceiveByte()函数。
2、nrf读写寄存器函数
上面的两个函数是中间函数,主要用到下面的几个函数
读一个寄存器和写一个寄存器,与匿名的程序基本上是一样的。
3、Flush函数
nrf的命令,用于清空接收和发送缓冲区。
4、***
5、中断处理函数
中断服务程序,第二个函数是设置使用哪个回调函数的,eskylink,radiolink等都有各自的回调函数。
6、参数配置函数
7、SPI的端口,中断及参数的配置
匿名的程序把初始化工作放在了SPI1的初始化里,其实是一样的。注意的一点是crazyflie的程序多了中断的处理,这里着重分析一下中断部分。
由PCB版图可知无线的中断接到端口PA9上。
上面是中断初始化,相关的宏定义如下:
GPIO口与EXTI外中断的映像图:
nrf24l01外部中断接到了PA9上,所以*.EXTI_Line = EXTI_Line9。
中断端口配置好后,就要对该中断初始化了,主要配置优先级和中断服务程序等。在nrfInit函数中,第一个调用的函数就是中断初始化函数了,该函数位于exti.c文件中。
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 这一句要注意,中断线0~4是有独立的IRQ通道,中断线5~9共用一个IRQ通道,10~15共用一个IRQ通道。如下图:
如果采用了用中断线0,则*IRQChannel = EXTI0_IRQn。
中断服务函数:
检查中断是否为无线电的中断,是则调用nrfIsr()函数,操作完毕后,调用EXTI_ClearITPendingBit() 清除中断标置位再退出中断服务函数。
8、中断处理程序
函数释放二进制信号量dataRdy,二进制信号量相关宏或函数:
vSemaphoreCreateBinary // Macro that creates a Binary semaphore
xSemaphoreTake // Macro to obtain a semaphore
xSemaphoreGive // Macro to release a semaphore
xSemaphoreGiveFromISR // Macro to release a semaphore (used from ISR)
这是在中断中的处理,所以用了*GiveFromISR来释放。
总算分析完了,明天移植一下看看。
启动一系列的系统初始化,将需要的配置都启动。查看代码:
完成初始化之后如何运行下去呢,就要靠定时器产生的中断了,在初始化的第三项,启动了一个时长0.5ms的定时器:
定时器每0.5ms就会产生一次中断,中断号为TIM3_IRQn:
有了中断就可以看中断响应函数了:
该中断响应函数中,有查看Nrf事件的,有取得传感器信息,获取姿态数据的,有控制马达的,有发送数据到遥控器上的,有发送电池电压数据到遥控器上的,等等。
综合上述可见,该方案将系统的运行建立在中断之上。
前几天上网找资料,才看到CrazePony的项目,也是一个开源四轴项目,在他们的wiki上对四轴的一些知识总结的不错,看过之后收获颇多,发到这里分享给需要的朋友。为增加论坛人气,连接在最下面需要回复才能查看,还可以下载他们的工程的源码,他们的方案采用了mpu6050的DMP,不需要做数据融合处理了。
——回复可见内容——
有奖活动 | |
---|---|
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 |