⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51_nrf905_code.txt

📁 51_nrf905 spi通信编程 从底层到应用
💻 TXT
字号:
无线nrf905(PTR8000模块)源程序+原理图DDB+图片这个东东移植到ARM上也是非常不错的. 转载:
原文:
环境:ICCAVR MEGA16L+11.0592M 
讯通的PTR8000和PTR8000+模块,内部芯片是nrf905 
SPI方式操作,有详细注析 
1天调通,当时是SPI相位方式照马老师的设成了01模式,结果读出的全是00,郁闷了好久:) 
目录中PTR8000是源程序,ddb是原理图 
nrf905.c中的头文件定义是抄HotPower的,特此感谢! 

#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char

//配置口定义//
sbit TXEN = P1^7;    //1号端口的7号引脚连的TXEN即传输模式使能
sbit TRX_CE = P1^6;  //1号端口的6号引脚连的TRXCE
sbit PWR = P1^5;     //1号端口的5号引脚连的PWR
//SPI口定义//
sbit MISO = P1^2;   
sbit MOSI = P1^3;    
sbit SCK = P1^1;     
sbit CSN = P1^0;     
sbit P2_0 = P2^0;    
//状态输出口//
sbit DR = P1^4;
sbit LCD = P3^2;

//RF寄存器配置//
unsigned char idata RFConf[11]=
{
0x00, //配置命令//                             
0x6C, //CH_NO,配置频段在433.2MHZ
0x0E, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x03,0x03, //接收发送有效数据长度为3字节
0xE7,0xE7,0xE7,0xE7, //接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};

uchar TxRxBuffer[5];
bit lcdbit;
///////////延时/////////////////
void Delay(uint x)     //时钟延时函数
{
uint i;
for(i=0;i<x;i++){
_nop_();
}
}
////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char b)
{
    unsigned char i=8;
    while (i--)
    {
         Delay(10);          //延时10秒
         SCK=0;              //当SCK下降沿时
         MOSI=(bit)(b&0x80); //将b的最高位移入MOSI数据线
         b<<=1 ;             //b左移一位
         Delay(10);          //延时10秒
         SCK=1;              //SCK上升沿
         Delay(10);          //延时10秒
         SCK=0;              //SCK下降沿
     }
     SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
     register unsigned char i=8;
     unsigned char ddata=0;
     while (i--)
     {
          ddata<<=1 ;      //ddata左移一位
          SCK=0;           //SCK下降沿
         _nop_();
         _nop_();          //延时
         ddata|=MISO;      //将来自MISO的一位数据保存在ddata的最低位
         SCK=1 ;           //上升沿
         _nop_();
         _nop_();          //延时
     }
     SCK=0;                //下降沿
     return ddata;         //返回从MISO移入的一个字符
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
    uchar i;
    i=0;
    while(DR)
    {
        TxRxBuffer = SpiRead();
        i++;
    }
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{
   TXEN=1;
   CSN=0;
   SpiWrite(0x22); //写发送地址,后面跟4字节地址//
   SpiWrite(0xE7);
   SpiWrite(0xE7);
   SpiWrite(0xE7);
   SpiWrite(0xE7);
   CSN=1;
   _nop_();
   _nop_();
   CSN=0;
   SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
   SpiWrite(0x01);
   SpiWrite(0x02);
   SpiWrite(0x03);
   CSN=1;
   _nop_();
   _nop_();
   TRX_CE=1; //使能发射模式//
   Delay(50); //等带发送完成//
   TRX_CE=0;
   while(!DR);
}
////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{
   TXEN=0;
   TRX_CE=1;
   while(1)
   {
       if(DR)
       {
          TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI口操作
          CSN=0;
          SpiWrite(0x24);
          RxPacket();
          CSN=1;
          temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
          if(temp==0x06)
          { 
             lcdbit=!lcdbit;
             LCD=lcdbit; //如果接收的数据正确
          }
          break;
       }
    }
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
   uchar i;
   LCD=0;
   Delay(10000);
   LCD=1;
   lcdbit=1;
   CSN=1;
   SCK=0;
   PWR=1;
   TRX_CE=0;
   TXEN=0;
   _nop_();
   CSN=0;
   for(i=0;i<11;i++)
   {
      SpiWrite(RFConf);
   }
   CSN=1;
   PWR=1;
   TRX_CE=1;
   TXEN=0;
   Delay(1000);
}

void main(void)
{
   uchar i;
   Ini_System();
   PWR=0;
   while(1)
   {
       Wait_Rec_Packet(); //等待接收完成
    // for(i=0;i<2;i++)
    // Delay(65530);
       TxPacket();
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -