我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 640|回复: 1

nrf2401伪双工

[复制链接]

该用户从未签到

3

主题

2

回帖

0

积分

一级逆天

积分
0

终身成就奖

QQ
发表于 2016-11-16 21:50:42 | 显示全部楼层 |阅读模式
#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);
}
回复

使用道具 举报

  • TA的每日心情
    开心
    昨天 12:15
  • 签到天数: 127 天

    [LV.7]常住居民III

    32

    主题

    1万

    回帖

    3万

    积分

    三级逆天

    积分
    34411

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2016-11-17 08:19:22 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表