nRF24LE1无线监控通信开发文档
16
nRF24LE1无线监控通信开发文档
第四章 子模块代码解析
本设计采用可读性好,移植容易并普遍使用的C语言进行开发。nRF24LE1内置增强型的8051,因此,大部分针对8051的C代码可以加以利用。
本设计采用的为5mm*5mm 32引脚QFN封装(15个通用的I/O),因此以此型号为例进行介绍。本章节代码均在keil C51下编译通过,并在nRF24LE1上验证成功。
4.1 I/O口的使用
nRF24LE1的每个I/O引脚具有MCU通用的I/O引脚功能包括以下功能(x取0、1、2、3,为四组I/O):
? 数字或模拟
? 配置方向:寄存器PxDIR做输入和输出方向控制 ? 配置驱动能力,配置上拉或者下拉:寄存器PxCON控制每个引脚的驱动
能力,以及上拉和下拉电阻。
5mm*5mm 32引脚具有15个通用的I/O,如表4.1所示。注意:不同封装的芯片的管脚功能有一定的区别。
管脚复用:
? 对于默认连接:例如表4.1中P0.4~P1.0的每个引脚列出有两个系统输入,
17
nRF24LE1无线监控通信开发文档
这意味着该引脚若已配置为输入则将控制两个模块的输入,即这两个功能通过一个与门结合同时起作用。
1) 对于动态使能连接:端口交叉模块可以根据系统需要实时修改与芯片的
外设模块(如SPI,I2C等)的动态连接,在选用较小封装时,引脚的分配可能会发送冲突,这可以通过设置每个外设模块的优先级来解决。
表4.1 32引脚映射表
例如令P0DIR = 0x17,按表4.1,可以得出设置结果为:P0.7、P0.6、P0.5、P0.3设置为输出;P0.4、P0.2、P0.1、P0.0设置为输入。其中,P0.4为输入,P0.3为输出,则默认连接UART/RXD和UART/TXD起作用,接通相应电路后,就可以用做串口通信。
4.2 UART子模块
串口由寄存器S0CON控制,而实际的数据传送可读/写SBUF寄存器。数据传送速率(波特率)S0RELL、S0RELH和ADCON寄存器来选择。
实现串口通信步骤:
? 1 要在母板上相应的线连接起来,如图4.1所示,并确定上部的串口开
关置于开启状态。
18
nRF24LE1无线监控通信开发文档
图4.1 串口硬件连接图
? 2 配置相应的I/O口。配置P0.4为输入,P0.3为输出,即可。 ? 3通过调用SDK中的hal_uart.c文件,可以容易的实现串口通信。首先调
用函数hal_uart_init(hal_uart_baudrate_t baud)初始化串口,然后就可以通过hal_uart_getchar()和hal_uart_putchar(uint8_t ch)进行串口通信了。 代码示例: #include \Main() { …
P0DIR = 0x17; …
hal_uart_init(4); //采用方式1,波特率为9600 …
hal_uart_getchar(); //串口接收一个字节
hal_uart_putchar(0xFF);//串口输出一个十六进制FF }
19
nRF24LE1无线监控通信开发文档
4.3 实时钟RTC
RTC2包含两个寄存器用来捕获定时器的值,一个由32.768kHz时钟的下降沿驱动;另一个由MCU的时钟驱动来获得更好的分辨率。两个寄存器均可由外部事件的结果来更新。当定时器和比较器寄存器预定义周期的值相同时,RTC2产生一个中断,RTC2确保唤醒的功能优于中断。通过RTC定时,可以用于芯片掉电休眠的周期性唤醒源。
例程
//************************************** //功能:RTC2定时器初始化子程序
//************************************** void rtc2_init(void) { }
//************************************** //功能:RTC2中断服务子程序
//**************************************
void RTC2_IRQ(void) interrupt INTERRUPT_TICK { }
或者调用SDK中的hal_rtc.c文件。
LED0= !LED0; //需要实现的RTC中断功能
CLKLFCTRL=0x01; RTC2CMP0=0xff; RTC2CMP1=0xff; RTC2CON=0x07; WUIRQ=1;
// 比较模式,启动RTC2 // 使能TICK中断
// 使用32K RC时钟
// 定时时间2秒
20