STM8学习之nRF24L01

发布者:和谐相伴最新更新时间:2021-02-22 来源: eefocus关键字:STM8  nRF24L01 手机看文章 扫描二维码
随时随地手机看文章

简介:nRF24L01是收发双方都要编程的,同时调试一旦出错,不易判断哪方出错,所以可以采用分开调试。


收发过程:


发送 - 等待应答 - (自动重发)- 产生中断


接收 - 等待应答 - 产生中断


取消等待应答便可以实现单独调试发送方了,等发送方调试成功再调接收方。


SPI模拟函数:


u8 SPI_RW(u8 byte)


{


u8 i;


for(i=0;i < 8;i++)


{


if((byte & 0x80) == 0) //数据从最高位一位一位地输出到nRF24L01的MOSI


{ MOSI = 0; }


else


{ MOSI = 1; }


byte = (byte << 1); //向左循环8次,完成从高位输出,低位输入一个字节的同步模拟


SCK = 1; //上升沿输入nRF24L01的MOSI


if(MISO == 1)


{ byte |= 1; }


else


{ byte |= 0; } //可以不写,没有实际作用,方便查看与理解


SCK = 0; //下降沿输入单片机MISO


}


return (byte);


}


u8 SPI_RW_Reg(u8 reg, u8 value)


{


u8 status;


CSN = 0; // CSN置低,开始传输数据


status = SPI_RW(reg); // 选择寄存器,同时返回状态字


SPI_RW(value); // 然后写数据到该寄存器


CSN = 1; // CSN拉高,结束数据传输


return(status); // 返回状态寄存器


}


u8 SPI_Read(u8 reg)


{


u8 reg_val;


CSN = 0; // CSN置低,开始传输数据


SPI_RW(reg); // 选择寄存器


reg_val = SPI_RW(0); // 然后从该寄存器读数据


CSN = 1; // CSN拉高,结束数据传输


return(reg_val); // 返回寄存器数据


}


u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 bytes)


{


u8 status, i;


CSN = 0; // CSN置低,开始传输数据


status = SPI_RW(reg); // 选择寄存器,同时返回状态字


for(i=0; i


pBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出


CSN = 1; // CSN拉高,结束数据传输


return(status); // 返回状态寄存器


}


u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 bytes)


{


u8 status, i;


CSN = 0; // CSN置低,开始传输数据


status = SPI_RW(reg); // 选择寄存器,同时返回状态字


delay_us(10);


for(i=0; i


SPI_RW(*pBuf++); // 逐个字节写入nRF24L01


CSN = 1; // CSN拉高,结束数据传输


return(status); // 返回状态寄存器


}


void SetRX_Mode(void)


{


//CE=0; //可以不进行拉低操作,考虑此时的效率


//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收


CE = 1; // 从Standby I模式进入RX模式,开始接受数据


delay_us(1500); // 需要一定的延时,具体时间等待验证(手册上写的是130us)


}


// 接受数据函数


u8 RxPacket(u8* rx_buf)


{


u8 revale=0;


sta = SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况


if(RX_DR) // 判断是否接收到数据


{


CE = 0; // SPI使能


SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer


//SPI_RW_Reg(FLUSH_RX, 0Xff);


revale =1; // 读取数据完成标志


}


SPI_RW_Reg(WRITE_REG+STATUS,sta); // 接收到数据后RX_DR置高,写1清中断标志,同时清除RX FIFOS?


//SPI_RW_Reg(FLUSH_RX, 0Xff);


return revale; // 是否接受到数据的标志位


}


// 发送数据函数


void TxPacket(u8* tx_buf)


{


CE=0; //StandBy I模式


SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址


SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据


//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送


CE=1; //置高CE,激发数据发送


delay_us(1000); //延时时间待最小确定,是否是130us?


}


// 初始化TX or RX Mode


void init_nRF(void)


{


delay_us(1000);


CE=0; // chip enable


CSN=1; // Spi disable


SCK=0; // Spi clock line init high


SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址


SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址


SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 频道0自动ACK应答允许


SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21


SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致


//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); // disable the retr (TX mode)


SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // 设置接收数据长度,本次设置为32字节


SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB


SPI_RW_Reg(WRITE_REG + CONFIG, 0X0F); // 0x0f for RX (0x0e for TX mode)


delay_ms(1);


}


第一步:


寄存器的读写操作。写进(如CONFIG)一个值,然后读出,可以检查nRF24L01是否正常,引脚配置与连接是否正确,SPI模拟时序函数是否可用等。


第二步:


然后再只调发送端。把自动应答关闭。


SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自动应答


SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X00); //无接收通道


SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); //取消自动重发功能


第三步:


最后调接收端,同样先把自动应答关闭。


SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自动应答


SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X01); //使能接收通道0


关键字:STM8  nRF24L01 引用地址:STM8学习之nRF24L01

上一篇:STM8S单片机的内部eeprom编程
下一篇:STM8s 定时器2使用

推荐阅读最新更新时间:2024-11-10 10:36

STM8 模拟串口程序
1、接收 默认串口的数据格式为 一位起始位+8位数据位+停止位,由于起始位为低电平,停止位为高电平。因此,RX线要使能外部中断,中断方式为下降沿中断。只需要在中断程序中使能定时器,并且要在main函数之前对定时器进行初始化,设置定时器的预装值,这里设置的预装值就是设置串口的波特率,另外还要使能定时器的更新中断,在定时器的中断处理程序中,按位接收串口发送过来的数据。当接收到停止位时,失能定时器,然后对定时器进行清零处理 下面是外部中断处理函数: INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) { if(EXTI_GetExtIntSensitivity(EXTI_PORT_GP
[单片机]
STM8的NRST脚和SWIM脚简述
1.NRST脚 NRST引脚产生复位。当NRST为低电平时,MCU处于复位状态,重设所有的内部寄存器。 2.SWIM脚 SWIM引脚为开漏(OD)结构,以此实现双向通信。在NRST复位后,SWIM脚复位进入OFF状态,此时不能使用此脚为普通I/O。通过软件配置可将SWIM脚设置为普通I/O,使用为普通I/O时可能会有较多限制,复位以后将恢复为OFF状态。
[单片机]
一个关于STM8中断应用异常的话题
某日一工程师跟我反映,他在使用STM8S芯片开发产品,用到某ADC通道,使用连续采集模式,开启ADC转换结束中断。整个中断程序执行时间大概200多us,因为连续采集转换,在这个ISR处理过程中可能会有新的EOC标志产生。 他发现一个奇怪的现象,ADC中断服务程序能够不停的自己嵌套自己,仿佛进入了递归嵌套,最后导致堆栈溢出跑飞而令系统复位。在调试过程中也的确能发现ADC中断服务程序有连续多次入栈的情况。 后来他发现这个异常跟在ADC ISR中首尾分别加了一句关中断和开中断语句有关。即在ISR的开头加了disableInterrupt(); ISR结尾部分加了 enableInterrupt(); 如果拿掉首尾那2句开关
[单片机]
一个关于<font color='red'>STM8</font>中断应用异常的话题
怎么写stm8的IAP升级的bootloader和app
因为之前写个stm32的IAP升级程序,所以我总结了做IAP升级的三个主要的难点: 1、如何设置中断向量,也就是说中断向量的重定向 2、如何配置程序的起始地址 3、如何从IAP跳转到APP程序 4、使用库函数要注意的地方(防止被坑) 说文章的时候我已经完成了一个最简单的IAP升级程序,可以通过串口接收bin文件写入到flash里面,然后再运行。 1、如何设置中断向量,也就是说中断向量的重定向 stm8不像stm32那样有个一寄存器管理着中断向量的地址,所以stm32的中断可以任意设置(符合要求的情况之下),但是stm8的中断向量表是固定的 在0X8000地址,不能修改,所以BOOT区不能开中断,否则会和APP区的中断打架,但是AP
[单片机]
怎么写<font color='red'>stm8</font>的IAP升级的bootloader和app
nrf24l01 2.4GHZ无线发射接收模块接收程序
发射程序是用51写的 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define TX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH 4 // SPI(nRF24L01) commands #define READ_REG 0x00 #define WRITE_REG 0x20 #define RD_RX_PLOAD 0x61 #define WR_TX_PLOAD 0xA0 #define FLUSH_TX 0xE1 #define
[单片机]
IAR新建STM8工程
1、准备标准库函数文件,官方的标准库函数为stsw-stm8069,解压后如下图: 2、新建一个文件夹,本例子命名为stm8-project,新建四个子文件夹,分别命名为APP、Readme、USER、STM8S_StdPerph_Driver: 3、从库函数例程以下目录拷贝文件 inc和src两个文件夹以及内容至STM8S_StdPerph_Driver目录。 4、从库函数例程以下目录拷贝文件 main.c、stm8s_conf.h、stm8s_it.c 、stm8s_it.h到USER目录。 5、在Readme目录下新建一个文本文件,命名为readme.txt,这个主要用来记录开发进度: 6、打开IAR,新
[单片机]
IAR新建<font color='red'>STM8</font>工程
NRF24L01无线模块多机通信单片机程序 上位机+下位机
最近在接了一个项目,要求各个设备能够联网(不是互联网)控制。nrf24l01刚好有这个功能。但是之前只做过一对一的通信,还是用例程的那一种。我在想,用两个地址,共用同一个通道应该也可以完成。后来他又要求发过去的数据还要能回传,这下我只好来研究多通道通信了。 多机通信和一对一通信基本上相同,就是要配置其他通道的地址和使能其他通道的有效数据宽度,还有自动应答。 这是接收机的: void NRF24L01_Init_RX(void) { CE=0; CSN=1; SCK=0; SPI_Write_Buf(WRITE_REG + TX_ADDR, RX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(W
[单片机]
STM8实现万年历(高亮调时)
一、设计内容: 本次设计使用stm8s实现简单的万年历,主要功能是显示时间、调时、设置闹铃。另外还添加了游戏辅助功能。 二、设计要求: 1、主控芯片使用stm8s 2、使用pcb板 3、至少要实现数码管显示时间和调时功能 三、设计过程: 设计总共分为两块,硬件设计和软件设计。首先是构思要实现的功能,然后了解硬件资源再进行软件设计。所以下面首先介绍硬件设计。 1、硬件设计部分 A、元件清单 器件名 型号 数量 Lcd 12864 1 DS1302 1 晶振 32.768KHz 1 Stm8s105s4 1 按键 5 二极管 1n4
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved