📄 wireless.c
字号:
////////////////////////////////////////////////////////////////////////////////////GRISHWORLD
#include <reg52.h>
#include <stdio.h>
#include <INTRINS.H>
#include <absacc.h>
#include <wireless.h>
//#include "hotins.h"
/*---------------------*/
#define SIZE 32
void RF905_Config(void);
void nrf905_SetTxAddr(void);
void nrf905_Init(void);
void RFStandBy(void);
void RFRXModel(void);
void RFTXModel(void);
void DelayMs(unsigned char);
void nrf905_SetData();
void nrf905_WaitSended();
void nrf905_SendData();
void nrf905_SendAgain();
void nrf905_ReadData();
void nrf905_SpiTest();
void RfRecvProc();
void io_init();
void SPI_CS_ON(void);
void SPI_CS_OFF(void);
void DELAY_us(int);
void DELAY_ms(int);
void DELAY_s(int);
void X25045_Reset_Watchdog(void);
unsigned char SpiReadWrite(unsigned char);
#define _rlca_() CY = ACC & 0x80 //产生RLC A指令
unsigned char TxBuf[SIZE],RxBuf[SIZE];
// 试验板上有14根线 以上8根 还有cd am gnd gnd +3 upclk
// nRF905板上的引脚定义
/* VCC 1
TXEN 2
TRX_CE 3
PWR 4
uCLK 5
CD 6
AM 7
DR 8
MISO 9
MOSI 10
SCK 11
CSN 12
GND 13
GND 14
*///对应单片机引脚
sfr WDT_CONTR = 0xE1 ;
sbit CSN = P2^1;
sbit SCK = P2^0;
sbit MOSI = P2^3;
sbit MISO = P2^2;
sbit DR = P2^4;
sbit PWR = P2^6;
sbit CE = P2^5;
sbit EN = P2^7;
///////////////////////////////////////
sbit X25045_CS = P1^4;
sbit X25045_SO = P1^5;
sbit X25045_SCK = P1^6;
sbit X25045_SI = P1^7;
///////////////////////////////////
sbit LED0 =P0^0;
sbit LED1 =P0^1;
sbit LED2 =P0^2;
sbit LED3 =P0^3;
int counter=0;
/* //UNUSED
sbit LED4 =P0^4;
sbit LED5 =P0^5;
sbit LED6 =P0^6;
sbit LED7 =P0^7;
*/
/* typedef union {
word w;
byte bh;
byte bl;
} WordType;
typedef union {
dword dw;
word w[2];
byte b[4];
} DwordType;
*/
void io_init(void)
{int ii;
IE = 0x00;//关闭中断
P2 = 0xff;//P2口初始化
P0 = 0xff;//P0口初始化
P1 = 0xff;//P1口初始化
P3 = 0xff;//P3口初始化
CSN= 1;
SCK = 0;
MISO = 1; //SDO
// CSN = 1;
// MOSI = P1^5;///////////////////////////未知
LED0 =0;
LED1 =1;
LED2 =1;
LED3 =1;
for(ii=0;ii<32;ii++)
{
TxBuf[ii]=0;
RxBuf[ii]=0;
}
}
////////////////////////////////////////////////////////////////////////////////END SPI BY GRISHWORLD
void main()
{
int i;
io_init();
LED0 =0;
LED1 =0;
LED2 =1;
LED3 =1;
DELAY_ms(1);
nrf905_Init();
DELAY_ms(1);
// DELAY_s(10);
// nrf905_WaitSended();
// nrf905_SendAgain();
WDT_CONTR = 0X00;
RfRecvProc();
//RFStandBy();//待机
for(;;)
{
//测试发送
// X25045_Write_Status(0x00); //WD timeout is in 1.4S
// X25045_Reset_Watchdog();
RxBuf[0]=0x0;
// for(i=0;i<32;i++)
TxBuf[i]=0x55;
DELAY_us(100);
nrf905_SendData();
DELAY_us(100);
// RFStandBy();
// RFRXModel();
// DELAY_us(100);
// nrf905_SpiTest();//测试spi 读配制寄存器 通过
//测试接收
// RFRXModel();
DELAY_ms(1);
// RfRecvProc();
if(RxBuf[0]!=0)
{
RxBuf[0]=0x0;
LED0 =0;
LED1 =1;
LED2 =1;
LED3 =1;
DELAY_ms(1);
LED0 =1;
LED1 =0;
LED2 =1;
LED3 =1;
DELAY_ms(1);
LED0 =1;
LED1 =1;
LED2 =0;
LED3 =1;
DELAY_ms(1);
LED0 =1;
LED1 =1;
LED2 =1;
LED3 =0;
DELAY_ms(1);
LED0 =0;
LED1 =1;
LED2 =1;
LED3 =1;
RFRXModel();
}
}
}
// RFRXModel();
////////////////////CONFIG nRF905
void RF905_Config(void)
{
SPI_CS_ON();
SpiReadWrite(WC); // Write config command
SpiReadWrite(CH_NO_BYTE); //中心频率低8位 //0x4c
SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0 //0x0c
SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节 //0x44
SpiReadWrite(RX_PW_32BYTE); //接收数据宽度32字节 //0x20
SpiReadWrite(TX_PW_32BYTE); //发送数据宽度32字节 //0x20
SpiReadWrite(RX_ADDRESS_0); //接收有效地址第1字节 //0x12
SpiReadWrite(RX_ADDRESS_1); //接收有效地址第2字节 //0x34
SpiReadWrite(RX_ADDRESS_2); //接收有效地址第3字节 //0x56
SpiReadWrite(RX_ADDRESS_3); //接收有效地址第4字节 //0x78
SpiReadWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz //0xD8
SPI_CS_OFF();
}
void nrf905_SetTxAddr(void)
{
SPI_CS_ON();
SpiReadWrite(WTA); //写Tx地址
SpiReadWrite(TX_ADDRESS_0);
SpiReadWrite(TX_ADDRESS_1);
SpiReadWrite(TX_ADDRESS_2);
SpiReadWrite(TX_ADDRESS_3);
SPI_CS_OFF();
}
void nrf905_Init(void)
{
RFStandBy();
DELAY_ms(3);//!!!must >3ms
RF905_Config();
RFRXModel();
}
void RFStandBy(void)//待机
{
PWR=1;
CE=0;
EN=0;
}
void RFRXModel(void)// rx
{
PWR=1;
CE=1;
EN=0;
}
void RFTXModel(void)// tx
{
PWR=1;
CE=1;
EN=1;
}
/*void DelayMs(unsigned char ms)
{
int j=0;
char i=0;
for(i=0;i<ms;i++)
{
for(j=0;j<12000;j++) //指令周期=时钟周期时 12000 指令周期=时钟周期*12时 1000
{
}
}
}
*/
void nrf905_SetData()
{unsigned char i;
SPI_CS_ON();
SpiReadWrite(WTP); //写TxPayload
for (i=0;i<SIZE;i++)
{
SpiReadWrite(TxBuf[i]);
}
SPI_CS_OFF();
}
//等待发送结束
void nrf905_WaitSended()
{
while (DR==0);//;//在发送结束时 DR=1;
}
//发送TxBuf中的数据
void nrf905_SendData()
{
//切换到发送模式
RFStandBy();
nrf905_SetTxAddr();//写发送地址
nrf905_SetData();//写数据
RFTXModel();
nrf905_WaitSended();//等待发送结束
}
//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
nrf905_SendData();
}
//读出接收到的数据
void nrf905_ReadData()
{
unsigned char i;
SPI_CS_ON();
SpiReadWrite(RRP); //读RxPayload
for (i=0;i<SIZE;i++)
{
RxBuf[i]=SpiReadWrite(0xff);//read...
}
SPI_CS_OFF();
}
//测试:通过读配置,判断SPI操作是否正确
void nrf905_SpiTest()
{
unsigned char i;
SPI_CS_ON();
SpiReadWrite(RC); //读配置
for (i=0;i<10;i++)
{
RxBuf[i]= SpiReadWrite(0xff);//read from nrf905
}
SPI_CS_OFF();
}
void RfRecvProc()
{
unsigned char i;
//if ((PIND&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
if (DR==1) //DR=1时表示数据接收对而且Crc正确
{
//已经接收到数据
RFStandBy();
nrf905_ReadData();//读出...
for (i=0;i<32;i++)
{ if (RxBuf[i]!=(i+i))
return;
}
}
//从机回送数据包,这样双方都能指示是否收到有效数据包
}
unsigned char SpiReadWrite(unsigned char val)
{
unsigned char i;
ACC = val;
for (i = 8; i > 0; i --)
{
CY = MISO;//取数据SO
_rlca_();
//存数据ACC.0读数据ACC.7同时进行,acc循环左移,acc.7移入cy(出),cy(入)移到acc.0
MOSI = CY;//送数据SI
SCK = 1;//上升沿打入数据
_nop_();
SCK = 0;//下降沿读入数据(首次为假动作)
}
return ACC;
}
void SPI_CS_ON(void)
{
CSN = 0;
}
void SPI_CS_OFF(void)
{
CSN = 1;
}
void DELAY_us(int us)
{
unsigned int i,j;
for(j=0;j<us;j++)
{
for(i=0;i<6;i++)
{
}
}
}
void DELAY_ms(int ms)
{
unsigned int j;
for(j=0;j<ms;j++)
{
DELAY_us(1000);
}
}
void DELAY_s(int s)
{
unsigned int j;
for(j=0;j<s;j++)
{
DELAY_ms(1000);
}
}
void X25045_Reset_Watchdog(void)
{ X25045_CS=1;
X25045_CS=0;
X25045_CS=1;
}
/*
if(RxBuf[counter]!=0xff)
{
LED0 =1;
LED1 =1;
LED2 =0;
LED3 =1;
DELAY_ms(3);
LED0 =1;
LED1 =0;
LED2 =1;
LED3 =1;
DELAY_ms(3);
}
else if(RxBuf[counter]==0)
{
LED0 =0;
LED1 =0;
LED2 =0;
LED3 =0;
DELAY_ms(10);
}
else
{
LED0 =0;
LED1 =0;
LED2 =0;
LED3 =0;
DELAY_ms(3);
}
LED0 =1;
LED1 =1;
LED2 =1;
LED3 =1;
DELAY_ms(3);
LED0 =1;
LED1 =0;
LED2 =1;
LED3 =0;
DELAY_ms(3);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -