找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

51_nrf905 spi通信编程 从底层到应用

[复制链接]
admin 发表于 2010-6-14 22:47:07 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
51_nrf905 spi通信编程 从底层到应用


  1. 无线nrf905(PTR8000模块)源程序+原理图DDB+图片这个东东移植到ARM上也是非常不错的. 转载:
  2. 原文:
  3. 环境:ICCAVR MEGA16L+11.0592M
  4. 讯通的PTR8000和PTR8000+模块,内部芯片是nrf905
  5. SPI方式操作,有详细注析
  6. 1天调通,当时是SPI相位方式照马老师的设成了01模式,结果读出的全是00,郁闷了好久:)
  7. 目录中PTR8000是源程序,ddb是原理图
  8. nrf905.c中的头文件定义是抄HotPower的,特此感谢!
  9. #include <reg52.h>
  10. #include <ABSACC.h>
  11. #include <intrins.h>
  12. #include <stdio.h>
  13. #define uint unsigned int
  14. #define uchar unsigned char
  15. //配置口定义//
  16. sbit TXEN = P1^7;    //1号端口的7号引脚连的TXEN即传输模式使能
  17. sbit TRX_CE = P1^6;  //1号端口的6号引脚连的TRXCE
  18. sbit PWR = P1^5;     //1号端口的5号引脚连的PWR
  19. //SPI口定义//
  20. sbit MISO = P1^2;   
  21. sbit MOSI = P1^3;   
  22. sbit SCK = P1^1;     
  23. sbit CSN = P1^0;     
  24. sbit P2_0 = P2^0;   
  25. //状态输出口//
  26. sbit DR = P1^4;
  27. sbit LCD = P3^2;
  28. //RF寄存器配置//
  29. unsigned char idata RFConf[11]=
  30. {
  31. 0x00, //配置命令//                             
  32. 0x6C, //CH_NO,配置频段在433.2MHZ
  33. 0x0E, //输出功率为10db,不重发,节电为正常模式
  34. 0x44, //地址宽度设置,为4字节
  35. 0x03,0x03, //接收发送有效数据长度为3字节
  36. 0xE7,0xE7,0xE7,0xE7, //接收地址
  37. 0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
  38. };
  39. uchar TxRxBuffer[5];
  40. bit lcdbit;
  41. ///////////延时/////////////////
  42. void Delay(uint x)     //时钟延时函数
  43. {
  44. uint i;
  45. for(i=0;i<x;i++){
  46. _nop_();
  47. }
  48. }
  49. ////////////用SPI口写数据至NRF905内//////////
  50. void SpiWrite(unsigned char b)
  51. {
  52.     unsigned char i=8;
  53.     while (i--)
  54.     {
  55.          Delay(10);          //延时10秒
  56.          SCK=0;              //当SCK下降沿时
  57.          MOSI=(bit)(b&0x80); //将b的最高位移入MOSI数据线
  58.          b<<=1 ;             //b左移一位
  59.          Delay(10);          //延时10秒
  60.          SCK=1;              //SCK上升沿
  61.          Delay(10);          //延时10秒
  62.          SCK=0;              //SCK下降沿
  63.      }
  64.      SCK=0;
  65. }
  66. ///////////////from 905 read data////////////////
  67. unsigned char SpiRead(void)
  68. {
  69.      register unsigned char i=8;
  70.      unsigned char ddata=0;
  71.      while (i--)
  72.      {
  73.           ddata<<=1 ;      //ddata左移一位
  74.           SCK=0;           //SCK下降沿
  75.          _nop_();
  76.          _nop_();          //延时
  77.          ddata|=MISO;      //将来自MISO的一位数据保存在ddata的最低位
  78.          SCK=1 ;           //上升沿
  79.          _nop_();
  80.          _nop_();          //延时
  81.      }
  82.      SCK=0;                //下降沿
  83.      return ddata;         //返回从MISO移入的一个字符
  84. }
  85. ///////////////接收数据包/////////////////
  86. void RxPacket(void)
  87. {
  88.     uchar i;
  89.     i=0;
  90.     while(DR)
  91.     {
  92.         TxRxBuffer = SpiRead();
  93.         i++;
  94.     }
  95. }
  96. /*
  97. ;写发射数据命令:20H
  98. ;读发射数据命令:21H
  99. ;写发射地址命令:22H
  100. ;读发射地址命令:23H
  101. ;读接收数据命令:24H
  102. */
  103. void TxPacket(void)
  104. {
  105.    TXEN=1;
  106.    CSN=0;
  107.    SpiWrite(0x22); //写发送地址,后面跟4字节地址//
  108.    SpiWrite(0xE7);
  109.    SpiWrite(0xE7);
  110.    SpiWrite(0xE7);
  111.    SpiWrite(0xE7);
  112.    CSN=1;
  113.    _nop_();
  114.    _nop_();
  115.    CSN=0;
  116.    SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
  117.    SpiWrite(0x01);
  118.    SpiWrite(0x02);
  119.    SpiWrite(0x03);
  120.    CSN=1;
  121.    _nop_();
  122.    _nop_();
  123.    TRX_CE=1; //使能发射模式//
  124.    Delay(50); //等带发送完成//
  125.    TRX_CE=0;
  126.    while(!DR);
  127. }
  128. ////////////////等待接收数据包///////////////////
  129. uchar temp;
  130. void Wait_Rec_Packet(void)
  131. {
  132.    TXEN=0;
  133.    TRX_CE=1;
  134.    while(1)
  135.    {
  136.        if(DR)
  137.        {
  138.           TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI口操作
  139.           CSN=0;
  140.           SpiWrite(0x24);
  141.           RxPacket();
  142.           CSN=1;
  143.           temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
  144.           if(temp==0x06)
  145.           {
  146.              lcdbit=!lcdbit;
  147.              LCD=lcdbit; //如果接收的数据正确
  148.           }
  149.           break;
  150.        }
  151.     }
  152. }
  153. ////////////初始化配置寄存器////////////////
  154. void Ini_System(void)
  155. {
  156.    uchar i;
  157.    LCD=0;
  158.    Delay(10000);
  159.    LCD=1;
  160.    lcdbit=1;
  161.    CSN=1;
  162.    SCK=0;
  163.    PWR=1;
  164.    TRX_CE=0;
  165.    TXEN=0;
  166.    _nop_();
  167.    CSN=0;
  168.    for(i=0;i<11;i++)
  169.    {
  170.       SpiWrite(RFConf);
  171.    }
  172.    CSN=1;
  173.    PWR=1;
  174.    TRX_CE=1;
  175.    TXEN=0;
  176.    Delay(1000);
  177. }
  178. void main(void)
  179. {
  180.    uchar i;
  181.    Ini_System();
  182.    PWR=0;
  183.    while(1)
  184.    {
  185.        Wait_Rec_Packet(); //等待接收完成
  186.     // for(i=0;i<2;i++)
  187.     // Delay(65530);
  188.        TxPacket();
  189.    }
  190. }

复制代码
MCU小将 发表于 2011-8-18 11:09:56 | 显示全部楼层
{:e177:}有用,顶一个
薛凌 发表于 2012-3-11 15:15:10 | 显示全部楼层
好东西啊,定
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:58 , Processed in 0.053045 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表