📄 24e1.c
字号:
/*=================================================================================================
Copyright (C), 2005, RCG Tech. Co., Ltd.
File name: 24E1.C
Author: Zhangui Duan Version: v1.3 Date: 2005-3-30
Description:
此程序文件主要是完成无线数据的基本发送和传输。
1,nRF24E1的初始化控制
2,nRF24E1的数据发射与数据接收
3,串口数据打印
4,延时程序
5,在主程序main.c中调用这里面的函数
6,收发速度为250Kbps(最小),发射功率为0dBm(最大),目的是保证发送距离最远
Other Description:
由 Keil C51 V7.05 编译通过
Function List:
1. 对nRF2401子系统进行数据读写操作
unsigned char SpiReadWrite(unsigned char b);
2, 配置接收器
void Init_Receiver(void);
3, 接收数据块
void Receiver(unsigned char *rxbuf);
4, 发送数据块
void Transmitter(unsigned char txbuf[]);
History:
1. Date: 2005-6-12
Author:Zhangui Duan
Modification: 由于卡号要与普通的IC卡兼容,将卡号设置为4个字节,所以发送的有效数据宽度
由原来的48位改为56位(1字节前置码+4字节卡号+1字节卡参数值+1字节校验字节)
===============================================================================================*/
#include "24E1.h"
#define DATAT_W 0x70 //发送有效数据宽度:DATA2_W:112位,DATA1_W:112位
#define DATAR_W 0x80 //接收有效数据宽度:DATA2_W:128位,DATA1_W:128位
#define RATE_POWER 0x4f //收发速度为250Kbps,发射功率为0dBm
unsigned char TxBuf[TNUM];
unsigned char RxBuf[RNUM];
unsigned char TRCOUNT;
unsigned char TIME;
RFConfig tconf =
{
15,
DATAT_W, DATAT_W,//发送有效数据宽度:DATA2_W:112位,DATA1_W:112位
0x00, 0x00, 0x00, 0x00, 0x00,//ADDR2地址宽度
0x00,0xaa, 0xbb, 0x12, 0x34, //ADDR1地址宽度
0x83, RATE_POWER, //250Kbps,0dBm
0x04
};
RFConfig rconf =
{
15,
DATAR_W, DATAR_W, //接收有效数据宽度:DATA2_W:112位,DATA1_W:112位
0x00, 0x00, 0x00, 0x00, 0x00,//ADDR2地址宽度
0x00, 0xaa, 0xbb, 0x12, 0x34,//ADDR1地址宽度
0x83, RATE_POWER,//250Kbps,0dBm
0x05
};
/***************************************************************************************
Function: WriteRTC
Description: RTC定时时钟初始化
Calls:
Called By:
void main(void)
Input:
Output:
Return:
Others:
***************************************************************************************/
void WriteRTC(unsigned int w)
{
while(REGX_CTRL & 0x10) // Wait for the interface to be ready
;
REGX_MSB = w >> 8;
REGX_LSB = w & 0xff;
REGX_CTRL = 0x0a;
while(REGX_CTRL & 0x10) // Wait for the interface to be ready
;
}
/***************************************************************************************
Function: SpiReadWrite
Description: 对nRF2401子系统进行数据读写操作
Calls:
Called By:
void Init_Receiver(void)
void Transmitter(unsigned char txbuf[])
Input: b
发送的时候是要发送的单个数据,接收的时候初始化值
Output:
Return: SPI_DATA
接收数据时是接收的数据
Others:
***************************************************************************************/
unsigned char SpiReadWrite(unsigned char b)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = b; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
;
return SPI_DATA;
}
/***************************************************************************************
Function: Transmitter
Description: 发送数据块
Calls: Delay100us();
SpiReadWrite();
Called By:
void main(void)
Input: txbuf[]
要发送的数据串
Output:
Return:
Others:
***************************************************************************************/
void Transmitter(unsigned char *txbuf)
{
unsigned char i;
CS = 1; //开配置方式
CE = 0;
Delay100us(0);
for(i=0;i<tconf.n;i++)
{
SpiReadWrite(tconf.buf[i]);//发送器配置字
}
CS = 0; //关配置方式
CE = 1; //nRF2401开始工作
Delay100us(0);
for(i=0;i<ADDR_COUNT;i++) //发送接收节点地址到nRF2401
SpiReadWrite(tconf.buf[ADDR_INDEX+i]);
for (i=0;i<TNUM;i++)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = txbuf[i]; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
;
// PutChar(txbuf[i]); //送串口显示
}
CE = 0; //激活ShockBurst发送
//Delay100us(3); // Wait ~300us
}
/***************************************************************************************
Function: Init_Receiver
Description: 配置接收器的接收地址,接收数据长度,接收地址,
Calls: Delay100us();
SpiReadWrite();
Called By:
void main(void)
Input:
Output:
Return:
Others:
***************************************************************************************/
void Init_Receiver(void)
{
unsigned char b;
CE = 0;
CS = 1; //打开配置方式
Delay100us(0);
for(b=0;b<rconf.n;b++)
{
SpiReadWrite(rconf.buf[b]);//发送接收器配置字
}
CS = 0; //关配置方式
CE = 1; //使能收发功能
}
/***************************************************************************************
Function: Receiver
Description: 接收数据块
Calls: Delay100us();
SpiReadWrite();
Called By:
void main(void)
Input: *rxbuf
存储接收数据的数组的首地址
Output: 接收的数据存放在数据接收数组中
Return:
Others: 在调用此函数之前一定得调用函数Init_Receiver()
进行接收初始化配置
***************************************************************************************/
void Receiver(unsigned char *rxbuf)
{
unsigned char rnum;
// Delay100us(30);
while(DR1==1)
{
CS = 0; //关配置方式
CE = 0; //关收发功能
for(rnum=0;rnum<RNUM;rnum++){
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = 0; // Write dummy byte to SPI data register
while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished receiving
;
rxbuf[TRCOUNT] = SPI_DATA;
//PutChar(rxbuf[TRCOUNT]);
TRCOUNT++;
if(TRCOUNT==RNUM)TRCOUNT=0;
Delay100us(3);
}
}
//CS = 0; //关配置方式
// CE = 0; //关收发功能
}
/*
char GetChar(void)
{
while(!RI)
;
RI = 0;
return SBUF;
}
*/
/*
void PutChar(char c)
{
while(!TI)
;
TI = 0;
SBUF = c;
}
*/
void PutChar(char c)
{
SBUF = c;
while(TI==0);
TI = 0;
}
void Delayms(volatile unsigned char n)
{
unsigned char j;
while(n--)
for(j=0;j<10;j++)
Delay100us(10);
}
void Delay100us(volatile unsigned int n)
{
unsigned char i;
while(n--)
for(i=0;i<35;i++)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -