#include "main.h"
sbit MOSI = P1 ^ 4 ; // Master Out, Slave In pin (output)
sbit MISO = P1 ^ 3; // Master In, Slave Out pin (input)
sbit SCK = P1 ^ 5; // Serial Clock pin, (output)
sbit CSN = P1 ^ 6; // Slave Select pin, (output to CSN)
sbit CE = P1 ^ 7; // Chip Enable pin signal (output)
sbit IRQ = P1 ^ 2; // Interrupt signal, from nRF24L01 (input)
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x0A, 0x01, 0x07, 0x0E, 0x01}; // 定义一个静态发送地址
static u8 SPI_RW ( u8 byte )
{
u8 bit_ctr;
for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ )
{
if ( byte & 0x80 )
{
MOSI = 1;
}
else
{
MOSI = 0;
}
byte = ( byte << 1 );
SCK = 1;
byte |= MISO;
SCK = 0;
}
return ( byte );
}
/********************************************************
函数功能:SI24R1引脚初始化
入口参数:无
返回 值:无
*********************************************************/
void SI24R1_Init ( void )
{
SCK = 0; //SPI时钟线拉低
CSN = 1;
CE = 0;
IRQ = 1;
}
/********************************************************
函数功能:写寄存器的值(单字节)
入口参数:reg:寄存器映射地址(格式:WRITE_REG|reg)
value:寄存器的值
返回 值:状态寄存器的值
*********************************************************/
u8 SI24R1_Write_Reg ( u8 reg, u8 value )
{
u8 status;
CSN = 0;
status = SPI_RW ( reg );
SPI_RW ( value );
CSN = 1;
return ( status );
}
/********************************************************
函数功能:写寄存器的值(多字节)
入口参数:reg:寄存器映射地址(格式:WRITE_REG|reg)
pBuf:写数据首地址
bytes:写数据字节数
返回 值:状态寄存器的值
*********************************************************/
u8 SI24R1_Write_Buf ( u8 reg, const u8 *pBuf, u8 bytes )
{
u8 status, byte_ctr;
CSN = 0;
status = SPI_RW ( reg );
for ( byte_ctr = 0; byte_ctr < bytes; byte_ctr++ )
{
SPI_RW ( *pBuf++ );
}
CSN = 1;
return ( status );
}
/********************************************************
函数功能:读取寄存器的值(单字节)
入口参数:reg:寄存器映射地址(格式:READ_REG|reg)
返回 值:寄存器值
*********************************************************/
u8 SI24R1_Read_Reg ( u8 reg )
{
u8 value;
CSN = 0;
SPI_RW ( reg );
value = SPI_RW ( 0 );
CSN = 1;
return ( value );
}
/********************************************************
函数功能:读取寄存器的值(多字节)
入口参数:reg:寄存器映射地址(READ_REG|reg)
pBuf:接收缓冲区的首地址
bytes:读取字节数
返回 值:状态寄存器的值
*********************************************************/
u8 SI24R1_Read_Buf ( u8 reg, u8 *pBuf, u8 bytes )
{
u8 status, byte_ctr;
CSN = 0;
status = SPI_RW ( reg );
for ( byte_ctr = 0; byte_ctr < bytes; byte_ctr++ )
{
pBuf[byte_ctr] = SPI_RW ( 0 ); //读取数据,低字节在前
}
CSN = 1;
return ( status );
}
/********************************************************
函数功能:SI24R1接收模式初始化
入口参数:无
返回 值:无
*********************************************************/
void SI24R1_RX_Mode ( void )
{
CE = 0;
SI24R1_Write_Buf ( WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH ); // 接收设备接收通道0使用和发送设备相同的发送地址
SI24R1_Write_Reg ( WRITE_REG + EN_AA, 0x01 ); // 使能接收通道0自动应答
SI24R1_Write_Reg ( WRITE_REG + EN_RXADDR, 0x01 ); // 使能接收通道0
SI24R1_Write_Reg ( WRITE_REG + RF_CH, 40 ); // 选择射频通道0x40
SI24R1_Write_Reg ( WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH ); // 接收通道0选择和发送通道相同有效数据宽度
SI24R1_Write_Reg ( WRITE_REG + RF_SETUP, 0x0f ); // 数据传输率2Mbps,发射功率7dBm
SI24R1_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); // CRC使能,16位CRC校验,上电,接收模式
SI24R1_Write_Reg ( WRITE_REG + STATUS, 0xff ); //清除所有的中断标志位
CE = 1; // 拉高CE启动接收设备
}
/********************************************************
函数功能:SI24R1发送模式初始化
入口参数:无
返回 值:无
*********************************************************/
void SI24R1_TX_Mode ( void )
{
CE = 0;
SI24R1_Write_Buf ( WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH ); // 写入发送地址
SI24R1_Write_Buf ( WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH ); // 为了应答接收设备,接收通道0地址和发送地址相同
SI24R1_Write_Reg ( WRITE_REG + EN_AA, 0x01 ); // 使能接收通道0自动应答
SI24R1_Write_Reg ( WRITE_REG + EN_RXADDR, 0x01 ); // 使能接收通道0
SI24R1_Write_Reg ( WRITE_REG + SETUP_RETR, 0x0a ); // 自动重发延时等待250us+86us,自动重发10次
SI24R1_Write_Reg ( WRITE_REG + RF_CH, 40 ); // 选择射频通道0x40
SI24R1_Write_Reg ( WRITE_REG + RF_SETUP, 0x0f ); // 数据传输率2Mbps,发射功率7dBm
SI24R1_Write_Reg ( WRITE_REG + CONFIG, 0x0e ); // CRC使能,16位CRC校验,上电
//CE = 1;
}
/********************************************************
函数功能:读取接收数据
入口参数:rxbuf:接收数据存放首地址
返回 值:0:接收到数据
1:没有接收到数据
*********************************************************/
u8 SI24R1_RxPacket ( u8 *rxbuf )
{
u8 state;
state = SI24R1_Read_Reg ( STATUS ); //读取状态寄存器的值
SI24R1_Write_Reg ( WRITE_REG + STATUS, state ); //清除RX_DS中断标志
if ( state & RX_DR ) //接收到数据
{
SI24R1_Read_Buf ( RD_RX_PLOAD, rxbuf, TX_PLOAD_WIDTH ); //读取数据
SI24R1_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
return 0;
}
return 1; //没收到任何数据
}
/********************************************************
函数功能:发送一个数据包
入口参数:txbuf:要发送的数据
返回 值:0x10:达到最大重发次数,发送失败
0x20:发送成功
0xff:发送失败
*********************************************************/
u8 SI24R1_TxPacket ( u8 *txbuf )
{
u8 state;
CE = 0; //CE拉低,使能SI24R1配置
SI24R1_Write_Buf ( WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH ); //写数据到TX FIFO,32个字节
CE = 1; //CE置高,使能发送
while ( IRQ == 1 ); //等待发送完成
state = SI24R1_Read_Reg ( STATUS ); //读取状态寄存器的值
SI24R1_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
if ( state & MAX_RT ) //达到最大重发次数
{
SI24R1_Write_Reg ( FLUSH_TX, 0xff ); //清除TX FIFO寄存器
return MAX_RT;
}
if ( state & TX_DS ) //发送完成
{
return TX_DS;
}
return 0XFF; //发送失败
}
void Si23R1_Wake()
{
CE = 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
XER GTSGTRYGRS
共34个文件
c:6个
lst:6个
h:6个
需积分: 0 0 下载量 122 浏览量
2023-07-06
21:38:46
上传
评论
收藏 74KB ZIP 举报
温馨提示
TGHDFHGYTRG
资源推荐
资源详情
资源评论
收起资源包目录
ERBIAO1.zip (34个子文件)
ERBIAO1
DRV_ERDING.H 113B
YAN.uvgui.pl 75KB
drv_batt.h 83B
YAN.plg 11KB
drv_batt.c 672B
drv_m1601z.c 5KB
drv_si24r2.c 7KB
drv_si24r2.OBJ 14KB
YAN.M51 34KB
MAIN.LST 3KB
YAN.uvopt 10KB
drv_m1601z.h 126B
MAIN.C 953B
STARTUP.A51 6KB
DRV_ERDING.LST 1KB
drv_si24r2.LST 12KB
YAN.uvproj 15KB
drv_batt.LST 2KB
YAN 49KB
drv_batt.OBJ 6KB
drv_huodong.h 126B
drv_huodong.LST 1KB
drv_si24r2.h 4KB
DRV_ERDING.C 353B
MAIN.__i 43B
DRV_ERDING.OBJ 5KB
drv_m1601z.LST 8KB
YAN.lnp 133B
YAN.uvgui_pl.bak 75KB
MAIN.H 281B
drv_huodong.c 294B
drv_huodong.OBJ 6KB
MAIN.OBJ 8KB
drv_m1601z.OBJ 11KB
共 34 条
- 1
资源评论
H.614
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功