本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
51_nrf905 spi通信编程 从底层到应用
-
- 无线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();
- }
- }
复制代码 |