|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#include"nrf2401.h"
uchar TXBUF[3]={0x01,0x02,0x03}; //数据
uchar RXBUF[3]; //接收数组
uchar TX_ADDRESS[5]={0x20,0x50,0x40,0x80,0x60}; //地址
uchar RX_ADDRESS[5]={0x20,0x50,0x40,0x80,0x60};
uchar flag = 0;
sbit k1 = P3^3;
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
void main(void)
{
P2 = 0xff;
init_2401(MODE_TX);
chakan();
if(check_add())
{
led1=0;//liang
flag=1;
}
else
{
led1=1;//mie
flag=0;
}
while(1)
{
if(k1 == 0)
{
tx_packet(TXBUF);
delay(10);
chakan();
}
check_even();
chakan();
}
}
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
void init_2401(uchar mode)
{
CE_0;
write_buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADDR_WIDTH);
write_buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADDR_WIDTH);
write_reg(WRITE_REG+EN_AA,0X01);//使能通道0自动应答模式
write_reg(WRITE_REG+EN_RXADDR,0X01); //接收地址
write_reg(WRITE_REG+SETUP_RETR,0x1a);//自动重发,500us+10次
write_reg(WRITE_REG+RF_CH,100); //
write_reg(WRITE_REG+RF_SETUP,0X07); //1Mbps + 0dBm + 增益
if(mode==0) //jieshou
{
write_reg(FLUSH_TX,0xff); //清空TX、RX数据缓冲器
write_reg(FLUSH_RX,0xff);
write_reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,上电,主接收
spi_rw(0x50);
spi_rw(0x73);
write_reg(WRITE_REG+0x1c,0x01); //使能通道0数据长度
write_reg(WRITE_REG+0x1d,0x07); //使能自动应答
}
else //fasong
{
write_reg(WRITE_REG+CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,上电,主发送
write_reg(FLUSH_TX,0xff); //清空
write_reg(FLUSH_RX,0xff);
spi_rw(0x50);
spi_rw(0x73);
write_reg(WRITE_REG+0x1c,0x01); //使能通道0数据长度
write_reg(WRITE_REG+0x1d,0x06); //不自动应答
// NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07); //使能自动应答功能
}
CE_1;
}
//spi读写总线
uchar spi_rw(uchar date)
{
uchar temp=0;
uchar i;
for(i=0;i<8;i++)
{
temp <<= 1;
if(date & 0x80)
MOSI_1;
else
MOSI_0;
date <<= 1;
SCK_1;
delay(2);
if(MISO)
temp |= 0x01;
else
temp &= ~0x01;
SCK_0;
delay(2);
}
return temp;
}
/*
**读寄存器
**reg:寄存器地址
**val:返回寄存器的值
*/
uchar read_reg(uchar reg)
{
uchar val;
CSN_0;
delay(1);
spi_rw(reg);
delay(1);
val = spi_rw(0);
CSN_1;
return val;
}
/*
**写寄存器
**reg:寄存器地址
**dat:写的数据
*/
uchar write_reg(uchar reg,uchar dat)
{
uchar val;
CSN_0;
delay(1);
val = spi_rw(reg);
delay(1);
spi_rw(dat);
delay(1);
CSN_1;
return val;
}
/*
**读寄存器的值,并且存储到*pbug指向的数组
**reg:寄存器地址 *pbuf:数组 width;数据长度
**val:返回当前此寄存器的值
*/
uchar read_buf(uchar reg,uchar *pbuf,uchar width)
{
uchar i,status;
CSN_0;
status = spi_rw(reg);
for(i=0;i<width;i++)
{
pbuf = spi_rw(0);
}
CSN_1;
delay(1);
return status;
}
/*
**写寄存器,将*pbug指向的数组的数据写到对应的寄存器中
**reg:寄存器地址 *pbuf:数组 width;数据长度
**val:返回当前此寄存器的值
*/
uchar write_buf(uchar reg,uchar *pbuf,uchar width)
{
uchar i,status;
CSN_0;
status = spi_rw(reg);
for(i=0;i<width;i++)
{
spi_rw(pbuf);
}
CSN_1;
delay(1);
return status;
}
/*
**写发送缓冲区数据,将*tx_buf所指向的数组的值写入缓存区
**tx_buf:数组
**无返回值
*/
void tx_packet(uchar *tx_buf)
{
CE_0;
write_buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADDR_WIDTH); //装地址
write_buf(WR_TX_PLOAD,tx_buf,TX_WIDTH); //装数据
CE_1;
}
/*
**读接收缓冲区数据,并将其中的值存储到*rx_buf所指向的数组
**rx_buf:数组
**无返回值
*/
void rx_packet(uchar *rx_buf)
{
CE_0;
read_buf(RD_RX_PLOAD,rx_buf,RX_WIDTH);
CE_1;
}
/*
**给应答包写数据 (发送模式没用)
**tx_buf:数据 len:长度 0xa8:给通道0的应答包写数据命令
*/
/*
void tx_packet_ack(uchar *tx_buf,uchar len)
{
CE_0;
write_buf(0xa8,tx_buf,len); //装载数据
CE_1;
} */
/*
**检测地址函数
**返回值:0或1
*/
uchar check_add(void)//检测函数
{
uchar bufl[5];
uchar i;
write_buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADDR_WIDTH); //装入地址
for(i=0;i<5;i++) //判断是否一致
{
if(bufl != TX_ADDRESS)
break;
}
if(i == 5)
return 1;
else
return 0;
}
/*
**判断中断(接收/发送/最大值/),
**最后全部写1清除
*/
void check_even(void)
{
uchar sta=0;
sta = read_reg(STATUS); //读取此时的状态寄存器
if(sta & 0x40) //接收中断
{
uchar leng;
leng = spi_rw(TX_PL_WID); //读取长度
if(leng < 33)
{
read_buf(RD_TX_PLOAD,RXBUF,TX_WIDTH);
}
else
spi_rw(FLUSH_TX); //清空TX
}
if(sta & 0x20) //发送中断
{
led2=0;//liang
delay(1000);
led2=1;
}
if(sta & 0x10) //达到发送最大值
{
led3=0;
delay(1000);
led3=1;
}
write_reg(WRITE_REG+STATUS,sta);//清除中断
}
/*
**查询状态寄存器
**调试用的
*/
void chakan()
{
read_reg(0x00); //设置寄存器
delay(1);
read_reg(0x07); //状态寄存器
delay(1);
read_reg(0x0a); //接收地址
delay(1);
read_reg(0x10); //发送地址
delay(1);
read_reg(0x11); //接收数据通道 0 有效数据宽度
delay(1);
read_reg(0x17); //FIFO寄存器
delay(1);
} |
|