📄 24e1.c
字号:
/*============================================================================================
Copyright (C), 2005, RegalCyber Tech. Co., Ltd.
File name: 24E1.C
Author: Zhangui Duan Version: v1.2 Date: 2005-3-30
Description:
此程序文件主要是完成无线数据的基本发送和传输。
1,nRF24E1的初始化控制
2,nRF24E1的数据发射与数据接收
3,串口数据打印
4,延时程序
5,在主程序main.c中调用这里面的函数
6,收发速度为1Mbps(最大),发送功率为-20dBm(最小)目的是缩短发送距离
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个字节,所以接收的有效数据宽度
由原来的40位改为48位(1字节前置码+4字节卡号+1字节校验字节)
============================================================================================*/
#include <24e1.h>
#include "delay.h"
// #define FAR 1 //远距离发射
#define DATAT_W 0x60 //发送有效数据宽度:DATA2_W:48位,DATA1_W:48位
#define DATAR_W 0x70 //接收有效数据宽度:DATA2_W:48位,DATA1_W:48位
#ifdef FAR
#define RATE_POWER 0x4f //收发速度为250Kbps,发射功率为0dBm
#else
#define RATE_POWER 0x4c //收发速度为250Kbps,发射功率为-20dBm
#endif
unsigned char TxBuf[TNUM];//发送缓冲区
unsigned char RxBuf[RNUM];//接收缓冲区
unsigned char TRCOUNT; //发送数据计数器
unsigned char tconfbuf[2],rconfbuf[2];//发送和接收配置字的最后两个字节
//发送数据格式配置
RFConfig code tconf =
{
13,
DATAT_W, DATAT_W,//发送有效数据宽度:DATA2_W:48位,DATA1_W:48位
0x00, 0x00, 0x00, 0x00, 0x00,//ADDR2地址宽度
0x00,0xaa, 0xbb, 0x12, 0x34, //ADDR1地址宽度
0x83//, RATE_POWER,//250Kbps,0dBm
// 0x04
};
//接收数据格式配置
RFConfig code rconf =
{
13,
DATAR_W, DATAR_W, //接收有效数据宽度:DATA2_W:48位,DATA1_W:48位
0x00, 0x00, 0x00, 0x00, 0x00,//ADDR2地址宽度
0x00, 0xaa, 0xbb, 0x12, 0x34,//ADDR1地址宽度
0x83//, RATE_POWER, //250Kbps,0dBm
//0x05
};
/*********************************************************************************************
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: 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]);//发送接收器配置字
}
SpiReadWrite(rconfbuf[0]);
SpiReadWrite(rconfbuf[1]);
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;
while(DR1==1)
{
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);
}
}
}
/*********************************************************************************************
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; //开配置方式
Delay100us(0);
for(i=0;i<tconf.n;i++)
{
SpiReadWrite(tconf.buf[i]);//发送发送器配置字
}
SpiReadWrite(tconfbuf[0]);
SpiReadWrite(tconfbuf[1]);
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 has finished transmitting
;
//PutChar(txbuf[i]); //送串口显示
}
CE = 0; //激活ShockBurst发送
Delay100us(3); // Wait ~300us
}
void PutChar(char c)
{
while(!TI);
SBUF = c;
TI = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -