editor 在 提交
![editor的头像 editor的头像](https://cdn.eetrend.com/files/styles/picture200/public/pictures/picture-105-1456553757.png?itok=1oEMHjjE)
作者:渠红杰
第一篇:开箱
收到灵动MM32F103开发板,感觉外包装是相当的给力。在厚厚的外纸箱里面又有一个紧凑的纸盒包装,
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11066-100003274-10719-1.png)
双重包装保证了板卡不会被快递路上的各种坑所折。打开包装,看到板卡被防静电袋层层包裹,看得出上海灵动微电子科技技术严谨的工作作风。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11067-100003274-10720-2.png)
全家福包含MM32F103RB开发板主板,MM32开发板扩展配件--2.8吋TFT液晶屏和MM32 Debugger调试器及其连接线。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11069-100003274-10721-3.png)
由于板卡都没有外壳,从防静电袋里抽出的过程还是会磕磕绊绊的。建议增加诸如有机玻璃外壳,这种外壳的透明度还是非常好的。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11070-100003274-10722-4.png)
首先看主板,从指引框图上可以明晰的看出,
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11071-100003274-10723-5.png)
整个主板设计充分的发挥了灵动MM32F103RB这颗mcu的所有资源和接口。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11072-100003274-10724-6.png)
除了标配的BOOT选项插针,按键,指示灯,usb供电接口,LCD接口,串口通信接口,JTAG仿真接口,用户备用IO端口引出之外,根据当前流行趋势比较有特色的接口有RF接口,红外传感器,PS/2鼠标接口,eeprom和扩展8M flash ram等体现了小而精,小而全的思想!
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11073-100003274-10725-7.png)
在当下wifi成为必备的情况下,主板并没有设计焊接wifi模块的接口稍微有些遗憾。另外,值得一提的是,板卡上RTC后备电池的适用型号在说明书等资料中都没有提及,这里告诉大家,电池型号是1220 3V钮扣电池。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11074-100003274-10726-8.png)
再说配件,2.8吋TFT液晶屏背面还附带了一个TF-SD卡座,可以扩充存储容量,具体可以支持多少MB,目前还没有资料显示。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11075-100003274-10727-9.png)
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11076-100003274-10728-10.png)
液晶屏支持电阻式触摸,因此附带了一支触摸笔,方便使用。
MM32 Debugger调试器是调试仿真不可缺少的必备工具,采用通用的JTAG接口。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11077-100003274-10729-11.png)
Usb端口直接供电。运用起来还是很方便的。出现的问题依然是缺少外壳,外观不是很美观。
第二篇:上电测试
在详细了解了灵动MM32F103RB开发板及相关的资料之后,准备上电测试。
首先,安装钮扣电池,将1220 3V钮扣电池正极在上,一端倾斜放置在电池座带卡扣一侧,压入另一侧听到发出清脆响声后放平即可。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11078-100003274-10730-12.png)
其次,安装显示屏。在开发板按键一端中间的两个圆孔处安装两颗铜柱作为显示屏的支撑。铜柱最好是φ3×10mm的,我用的是φ3×8mm的垫了两个垫片。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11079-100003274-10731-13.png)
因为主板上LCD接口和OLED接口是一起的,LCD接口少2针。依照靠近无线模块一端的TCS和CLK一端对齐,接入LCD显示屏即可。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11080-100003274-10732-14.png)
然后,将USB电源插到标识USB的端口处,usb线兼容手机充电线,配线还是非常方便的。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11081-100003274-10733-15.png)
打开主板上的电源开关,主板mcu预写入了演示代码,可以看到LCD显示屏上灵动的标识条做屏保运动。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11082-100003274-10734-16.png)
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11083-100003274-10735-17.png)
第三篇:小项目—无线通信
结合工作中的项目需要,暂且在灵动MM32F103RB开发板上做了个无线数据通信的测试。
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11084-100003274-10736-18.png)
![](http://mm32.eetrend.com/files/2016-10/博客/100003365-11085-100003274-10737-19.png)
硬件配备:MM32F103RB开发板主板,nRF24L01无线模块,usb线,电脑及项目应用设备。JTAG下载器,下载线,usb供电数据线等。
软件配备:IAR for arm V7.60,项目应用软件。
项目软件具体创建项目应用请参见IAR相关 | 灵动微电子中文社区http://mm32.eetrend.com/tags/890 ,这里不再细述。
部分配置代码如下:
/* Public functions ----------------------------------------------------------*/
// 驱动定义:
/**
* @brief Main program.
* @param None
* @retval None
*/
void Delay(__IO uint16_t nCount)
{
/* Refresh IWDG */
/* Decrement nCount value */
while (nCount != 0)
{
IWDG_ReloadCounter();
nCount--;
}
}
nRF24L01配置
/*---------------------------------------------------------------------------------------------
NRF24L01寄存器操作命令及寄存器地址
-----------------------------------------------------------------------------------------------*/
#define SPI_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址
#define SPI_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节
#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP 0xFF //空操作,可以用来读状态寄存器
#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5
#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define RF_CH 0x05 //RF通道,bit6:0,工作通道频率;
#define RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,自动重发完成中断
//bit5:数据发送完成中断;bit6:接收数据完成中断;
#define MAX_TX 0x10 //达到最大发送次数中断,即自动重发完成中断
#define TX_OK 0x20 //TX发送完成中断,即数据发送完成中断
#define RX_OK 0x40 //接收到数据中断,即数据接收完成中断
#define OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define CD 0x09 //载波检测寄存器,bit0,载波检测;
#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;
/*---------------------------------------------------------------------------------------------
24L01发送接收数据宽度定义
-----------------------------------------------------------------------------------------------*/
#define TX_ADR_WIDTH 5 //5字节的地址宽度
#define RX_ADR_WIDTH 5 //5字节的地址宽度
#define TX_PLOAD_WIDTH 32 //32字节的用户数据宽度
#define RX_PLOAD_WIDTH 32 //32字节的用户数据宽度
/*---------------------------------------------------------------------------------------------
24L01相关操作函数定义
-----------------------------------------------------------------------------------------------*/
void NRF24L01_Init(void);//初始化
void RX_Mode(void);//配置为接收模式
//void TX_Mode(void);//配置为发送模式(原始定义)
void TX_Mode(u8 * addr);//配置为发送模式
static u8 SPIx_ReadWriteByte(u8 TxData);
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//写数据区
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//读数据区
u8 NRF24L01_Read_Reg(u8 reg); //读寄存器
u8 NRF24L01_Write_Reg(u8 reg, u8 value);//写寄存器
u8 NRF24L01_Check(void);//检查24L01是否存在
u8 NRF24L01_TxPacket(u8 *txbuf);//发送一个包的数据
//u8 NRF24L01_RxPacket(u8 *rxbuf);//接收一个包的数据(原始定义)
u8 NRF24L01_RxPacket(u8 *rxbuf, u8 *chl);//接收一个包的数据
/**
@* 函数名:NRF24L01_SPI_Init()
@* 描述 :初始化SPI2端口及基模式,用于操作nRF24L01无线2.4G模块
@* 输入 :无
@* 输出 : 无
@* 调用 :内部调用
*/
static void NRF24L01_SPI_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
//注意将普通IO作为中断线时必须开启AFIO时钟
RCC_APB2PeriphClockCmd(NRF24L01_SPI_Periph_CLK|RCC_APB2Periph_AFIO, ENABLE);//开启GPIOB的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//开启SPI2的时钟
/*配置 SPI的SCK, MISO, MOSI引脚,GPIOB^13,GPIOB^14,GPIOB^15 */
GPIO_InitStructure.GPIO_Pin = NRF24L01_SPI_SCK_PIN| NRF24L01_SPI_MISO_PIN | NRF24L01_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用输出功能
GPIO_Init(NRF24L01_SPI_GPIO_SRC, &GPIO_InitStructure);
/*GPIOB^10为nRF24L01的CE引脚,CSN引脚GPIOB^12 */
GPIO_InitStructure.GPIO_Pin = NRF24L01_CE_PIN|NRF24L01_CSN_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(NRF24L01_SPI_GPIO_SRC, &GPIO_InitStructure);
/* GIOB^11为nRF24L01的IRQ中断输入引脚 */
GPIO_InitStructure.GPIO_Pin = NRF24L01_IRQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮动输入
GPIO_Init(NRF24L01_SPI_GPIO_SRC, &GPIO_InitStructure);
SPI_Cmd(SPI2,DISABLE);/*先失能,然后再使能*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ; /* 全双工 */
SPI_InitStructure.SPI_Mode = SPI_Mode_Master ; /*当前的设备为主机模式*/
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low ; /* 时钟极性为低,即SPI空闲时,SCK为低电平 */
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ; /* 时钟相位,第一个时钟沿(也就是奇数边沿)捕捉数据 */
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; /* 数据宽度 */
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ; /* 低地址存放最高有效字节 */
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; /*配置片选为软件控制方式*/
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; /* 时钟分频为8分频,即72MHz/8=9MHz */
SPI_InitStructure.SPI_CRCPolynomial = 7; /* 校验多项式,这个不起作用 */
SPI_Init(SPI2, &SPI_InitStructure);
//使能SPI2
SPI_Cmd(SPI2,ENABLE);
EXTI_Configuration();//配置中断线
}
/**
@* 函数名:SPIx_ReadWriteByte()
@* 描述 :SPI2 读写一个字节
@* 输入 :TxData:要写入的字节
@* 输出 : 读取到的字节
@* 调用 :内部调用
*/
static u8 SPIx_ReadWriteByte(u8 TxData) {
/** 原来的实现方式
u8 retry=0;
while((SPI2->SR&1<<1)==0) {//等待发送区空
retry++;
if(retry>200)return 0;
}
SPI2->DR=TxData; //发送一个byte
retry=0;
while((SPI2->SR&1<<0)==0) { //等待接收完一个byte
retry++;
if(retry>200)return 0;
}
return SPI2->DR; //返回收到的数据 */
/* Loop while DR register in not empty */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI2, TxData);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2);
}
/**
@* 函数名:NRF24L01_Init()
@* 描述 :初始化24L01的相关IO口
@* 输入 :无
@* 输出 : 无
@* 调用 :外部板级支持包调用
*/
void NRF24L01_Init(void) {
NRF24L01_SPI_Init(); //初始化SPI2
NRF24L01_CE=0; //使能24L01
NRF24L01_CSN=1; //SPI片选取消
}
/**
@* 函数名:NRF24L01_Check()
@* 描述 :检测24L01是否存在
@* 输入 :无
@* 输出 : 0:成功,1:失败
@* 调用 :外部板级支持包调用
*/
u8 NRF24L01_Check(void) {
u8 buf[5]={0x21,0x21,0x21,0x21,0x21};
u8 buf1[5];
u8 i;
//SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.
NRF24L01_Read_Buf(TX_ADDR,buf1, 5); //读出写入的地址
for(i=0;i<5;i++)if(buf1[i]!=0x21)break; //判断读出的数据和写入的数据是否完全一致
if(i!=5)return 1;//检测24L01错误
return 0; //执行到这里,表示成功检测到24L01
}
/**
@* 函数名:NRF24L01_Write_Reg()
@* 描述 :SPI写寄存器
@* 输入 :reg: 指定的寄存器地址
@* value: 要写入的值
@* 输出 : 返回寄存器的状态值
@* 调用 :内部调用
*/
u8 NRF24L01_Write_Reg(u8 reg,u8 value) {
u8 status;
NRF24L01_CSN=0; //使能SPI传输
status =SPIx_ReadWriteByte(reg); //发送寄存器号
SPIx_ReadWriteByte(value); //写入寄存器的值
NRF24L01_CSN=1; //禁止SPI传输
return(status); //返回状态值
}
/**
@* 函数名:NRF24L01_Read_Reg()
@* 描述 :读取SPI寄存器值
@* 输入 :reg: 指定的寄存器地址
@* 输出 : 返回寄存器的状态值
@* 调用 :内部调用
*/
u8 NRF24L01_Read_Reg(u8 reg) {
u8 reg_val;
NRF24L01_CSN = 0; //使能SPI传输
SPIx_ReadWriteByte(reg); //发送寄存器号
reg_val=SPIx_ReadWriteByte(0XFF); //读取寄存器内容
NRF24L01_CSN = 1; //禁止SPI传输
return(reg_val); //返回状态值
}
/**
@* 函数名:NRF24L01_Read_Buf()
@* 描述 :在指定位置读出指定长度的数据
@* 输入 :reg:指定的寄存器位置
@* pBuf:数据指针用来存储读到的数据,一般是数组
@* len:数据长度
@* 输出 : 此次读到的状态寄存器值
@* 调用 :内部调用
*/
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len) {
u8 status,u8_ctr;
NRF24L01_CSN = 0; //使能SPI传输
status=SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
for(u8_ctr=0;u8_ctr
return status; //返回读到的状态值
}
/**
@* 函数名:NRF24L01_Write_Buf()
@* 描述 :在指定位置写指定长度的数据
@* 输入 :reg:寄存器(位置)
@* pBuf:数据指针
@* len:数据长度
@* 输出 : 此次读到的状态寄存器值
@* 调用 :内部调用
*/
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len) {
u8 status,u8_ctr;
NRF24L01_CSN = 0; //使能SPI传输
status = SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
for(u8_ctr=0; u8_ctr
return status; //返回读到的状态值
}
/**
@* 函数名:NRF24L01_TxPacket()
@* 描述 :启动NRF24L01发送一次数据
@* 输入 :txbuf:待发送数据首地址
@* 输出 : 发送完成状况
@* 调用 :外部板级支持包调用
*/
u8 NRF24L01_TxPacket(u8 *txbuf) {
//u8 sta;
//SPIx_SetSpeed(SPI_SPEED_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 最长32个字节
NRF24L01_CE=1;//启动发送,10微秒后启动发送
return 0xff;//其他原因发送失败
}
/**
@* 函数名:NRF24L01_RxPacket()
@* 描述 :启动NRF24L01接收数据
@* 输入 :rxbuf:用来接收数据的buffer
@* chl:接收到数据的通道号
@* 输出 : 0,接收完成;其他,错误代码
@* 调用 :外部板级支持包调用
*/
u8 NRF24L01_RxPacket(u8 *rxbuf, u8 *chl) {
u8 sta;
//SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
//状态寄存器的bit1-bit3是表示接收到数据的通道号,最大值为6
*chl=(0x0e&sta)>>1;
//清除TX_DS或MAX_RT中断标志,注意这里是写1清零,只有清零后设备才能正常通讯
NRF24L01_Write_Reg(SPI_WRITE_REG+STATUS,sta);
if(sta&RX_OK) { //接收到数据
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX, 0xff);//清除RX FIFO寄存器
return 0;
}
return 1;//没收到任何数据
}
/**
@* 函数名:RX_Mode()
@* 描述 :该函数初始化NRF24L01到RX模式
@* 设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
@* 当CE变高后,即进入RX模式,并可以接收数据了
@* 输入 :无
@* 输出 : 无
@* 调用 :外部板级支持包调用
*/
void RX_Mode(void) {
NRF24L01_CE=0; //CE为0进入待机模式
//配置通道的接收
NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX0_Address,RX_ADR_WIDTH);//写RX节点地址(通道0),也就是表示用哪个通道接收数据
//======================注意以下被注释掉的内容可作参考和=========================================
//NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P1,(u8*)RX1_Address,RX_ADR_WIDTH);//写RX节点地址(通道1),也就是表示用哪个通道接收数据
//NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P2,(u8*)RX2_Address,1);//写RX节点地址(通道2),也就是表示用哪个通道接收数据
//NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P3,(u8*)RX3_Address,1);//写RX节点地址(通道3),也就是表示用哪个通道接收数据
//NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P4,(u8*)RX4_Address,1);//写RX节点地址(通道4),也就是表示用哪个通道接收数据
//NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P5,(u8*)RX5_Address,1);//写RX节点地址(通道5),也就是表示用哪个通道接收数据
NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA, 0x01); //使能通道0的自动应答
NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址,共有6个通道,高两位保留固定为00
NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,0); //设置RF通信频率
NRF24L01_Write_Reg(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x07);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_CE = 1; //CE为高,进入接收模式
}
/**
@* 函数名:TX_Mode()
@* 描述 :该函数初始化NRF24L01到TX模式
@* 设置TX地址,写TX数据宽度,设置RX自动应答的地址,
@* 填充TX发送数据,选择RF频道,波特率和LNA HCURR,PWR_UP,CRC使能
@* 当CE变高后,即进入RX模式,并可以接收数据了
@* CE为高大于10us,则启动发送
@* 输入 :addr,要发送数据的目标地址
@* 输出 : 无
@* 调用 :外部板级支持包调用
*/
void TX_Mode(u8 * addr) {
NRF24L01_CE=0; //CE为0进入待机模式
NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR, addr, TX_ADR_WIDTH);//写TX节点地址,也就是接收方的地址(目标地址)
//在发送端,数据通道0被用作接收应答信号,因此数据通道0的接收地址必须要与发送端的地址相同以确保收到正确的应答信号
NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)addr, RX_ADR_WIDTH);
//先单独测试发送方,看发送是否正常
NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
NRF24L01_Write_Reg(SPI_WRITE_REG+SETUP_RETR, 0x1a); //使能自动重发,设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,0); //设置RF通道为40
NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
NRF24L01_CE=1;//CE为高,10us后启动发送
}
#endif