📄 main.c
字号:
#include "reg2407A.h"
typedef unsigned int uint;
typedef unsigned char uchar;
#define WC 0X0000 //Write configuration register command
#define RC 0X1000 //Read configuration register command
#define WTP 0X2000 //Write Tx Payload command
#define RTP 0X2100 //Read Tx Payload command
#define WTA 0X2200 //Write Tx Address command
#define RTA 0X2300 //Read Tx Address command
#define RRP 0X2400 //Read Rx Payload command
#define SPI_TLK_ENA 0x0002
#define SPI_TLK_DIS 0xFFFD
/* global variable */
// the data sent via SPI to NRF905
uint TxBuf[6] ={0x0000,0x0001,0x0001,0x0001,0x0001,0x0001};
// the configure written to NRF905
uint RxTxConf[10] ={0x7600, 0x2E00, 0x4400, 0x0600, 0x0600, 0x0E700,
0x0E700, 0x0E700, 0x0E800, 0x5800};
// the data received from NRF905
uint RxBuf[6] ={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
uint RxData;
uint RC_config[10];
uint RTx_Payload[6] = {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
uint DRflag=0, AMflag=0, CDflag=0;
/*********************************************************************
初始化函数定义区
*********************************************************************/
/*禁止全局中断*/
void inline disable()
{
asm(" setc INTM");
}
/* 使能全局中断*/
void inline enable()
{
asm(" clrc INTM");
}
/* 延时程序, 100us */
void delay(uint t)
{
uint n, f;
for(n = 0; n < t; n ++)
{
for(f = 0; f < 1000; f ++)
{
asm (" nop");
asm (" nop");
asm (" nop");
asm (" nop");
asm (" nop");
}
}
}
/*系统初始化*/
void initial()
{
asm(" setc SXM"); //符号位扩展
asm(" clrc OVM"); //累加器中结果正常溢出
asm(" clrc CNF"); //B0被配置为数据存储空间
SCSR1 = 0X81FE; //CLKIN = 10M, CLKOUT = 4 * CLKIN = 40M
WDCR = 0X0E8; //禁止看门狗
IMR = 0X0017; //允许INT1、INT2、INT3、INT5中断
IFR = 0X0FFFF;
WSGR = 0X00;
}
// intialize the nrf905
void NRF905_IO_Initial( void )
{
uchar i;
// set IOPB
MCRA &= 0x7EFF; // PB1, PB2, PB3, PB7 out; 0111 1110 1111 1111
PBDATDIR |= 0x8E00; // output is 0; 1000 1110 0000 0000
// set IOPC
MCRB |= 0x001C; // PC2, PC3, PC4 SPI relation; 0000 0000 0001 1100
MCRB &= 0x0FFDF; // PC5 in; 1111 1111 1101 1111
PCDATDIR &= 0x0DFFF; // 1101 1111 1111 1111
// set IOPE
MCRC &= 0x0FF9F; // PE5, PE6 in; 1111 1111 1001 1111
PEDATDIR &= 0x9FFF; // 1001 1111 1111 1111
// standby mode and program mode
PBDATDIR |= 0x0080; // CSN=1
PBDATDIR |= 0x0008; // PWR=1 0000 0000 0000 1000
PBDATDIR &= 0x0FFFB; // TRX_CE=0 1111 1111 1111 1011
PBDATDIR &= 0x0FFFD; // TXEN=0 1111 1111 1111 1101
delay(30); // 3ms
for(i=0; i<10; i++) {
RC_config[i] = 0;
}
}
// initialize the SPI module
void SPI_Initial( void )
{
SPICCR = 0x0007; // 0000 0000 0000 0111 数据长度为8 char bits,
// 在SPICLK的上升沿发送数据,
// PTR在下降沿接收数据
SPICTL = 0x000E; //0000 0000 0000 1110 有延时的上
// 升沿 使能主动模式,
// 一般的时钟方式,
// 使能TALK(允许发送),
// 禁止SPI中断
SPIBRR = 0x0009; // 波特率为4M,CLKOIUT=40M
SPIPRI = 0x0040; // 0100 0000
SPICCR |= 0x0080; // 使SPI退出复位状态
}
// write data via SPI bus
void SPI_Write(uint data)
{
uint flag;
SPITXBUF = data;
while(1) {
flag = SPISTS & 0x40; // flag=SPI的中断标志
// 如果SPI的中断标志为1,则证明SPI已经发送成功,
// 则停止等待
if(flag == 0x40)
break;
}
SPIRXBUF = SPIRXBUF; // 虚读SPIRXBUF寄存器,
// 以清除SPI中断标志
return;
}
// read data from SPI bus
uchar SPI_Read(void)
{
uint flag;
SPITXBUF = 0x0FF00; //start SPI
while(1)
{
flag =(SPISTS & 0x40);
if( flag == 0x40 ) break;
}
RxData = SPIRXBUF & 0x00FF;
return RxData;
}
// set the NRF905 as Standby mode
void SetSt_ByMode()
{
PBDATDIR |= 0x0008; // PWR=1; 0000 0000 0000 1000
PBDATDIR &= 0x0FFFB; // TRX_CE=0; 1111 1111 1111 1011
delay(10);
}
// set the NRF905 as Send mode
void SetTxMode(void)
{
PBDATDIR |= 0x0008; // PWR=1; 0000 0000 0000 1000
PBDATDIR |= 0x0004; // TRX_CE=1; 0000 0000 0000 0100
PBDATDIR |= 0x0002; // TXEN=1; 0000 0000 0000 0010
delay(10);
}
// set the NRF905 as Receive mode, begin to receive data
void SetRxMode(void)
{
PBDATDIR |= 0x0008; // PWR=1; 0000 0000 0000 1000
PBDATDIR |= 0x0004; // TRX_CE=1; 0000 0000 0000 0100
PBDATDIR &= 0x0FFFD; // TXEN=0; 1111 1111 1111 1101
delay(10);
}
// setting NRF905, writting the configure register
void Config905(void)
{
uchar i;
// standby mode and write cofigure
SetSt_ByMode();
PBDATDIR &= 0x0FF7F; // CSN=0; 1111 1111 0111 1111
SPI_Write(WC);
for(i=0;i<10;i++) {
SPI_Write(RxTxConf[i]);
}
PBDATDIR|=0x0080; // CSN=1; 0000 0000 1000 0000
}
// read the cofigure register
void RConfig()
{
uchar i;
SetSt_ByMode(); // standymode
PBDATDIR &=0x0FF7F; // CSN=0
SPI_Write(RC);
for(i=0; i<10; i++) {
SPI_Read();
RC_config[i] = RxData;
}
PBDATDIR |= 0x0080; // CSN=1
}
// send packet via NRF905
void TxPacket()
{
uchar i;
SetSt_ByMode();
// write data
PBDATDIR &= 0x0FF7F; // CSN=0
SPI_Write(WTP);
for(i=0; i<6; i++) {
SPI_Write(TxBuf[i]);
}
PBDATDIR|=0x0080; // CSN=1
delay(10);
// write address
PBDATDIR &= 0x0FF7F; // CSN=0
SPI_Write(WTA);
for(i=0; i<4; i++) {
SPI_Write(RxTxConf[i+5]);
}
PBDATDIR |= 0x0080; // CSN=1
// SetTxMode(); // Tx mode, send data
PBDATDIR |= 0x0004; // TRX_CE=1
delay(10);//
}
// read Tx Payload
void RTxPayload()
{
uchar i=0;
SetSt_ByMode();
PBDATDIR &=0x0FF7F; // CSN=0
SPI_Write(RTP);
for(i=0; i<6; i++) {
SPI_Read();
RTx_Payload[i] = RxData;
}
PBDATDIR|=0x0080; // CSN=1
}
// receive the packet
void RxPacket(void)
{
uchar i;
SetSt_ByMode();
PBDATDIR &=0x0FF7F; // CSN=0
SPI_Write(RRP);
for(i=0; i<6; i++) {
RxBuf[i] = SPI_Read();
RxBuf[i] &= 0x00FF;
}
PBDATDIR|=0x0080; // CSN=1
}
void main( void )
{
uchar i, ReadFlag; // i -- counter, ReadFlag -- receive complete
disable();
initial();
NRF905_IO_Initial();
SPI_Initial();
Config905();
RConfig();
enable();
while(1) {
CDflag = 0;
AMflag = 0;
DRflag = 0;
ReadFlag = 0;
TxBuf[0] = 0x0008; // check comm
TxPacket();
delay(120);
RTxPayload();
// set Rx mode, wait for data coming
SetRxMode();
do {
CDflag = ( ( PCDATDIR & 0x0020 ) >> 5 ) & 0x0001;
AMflag = ( ( PEDATDIR & 0x0020 ) >> 5 ) & 0x0001;
DRflag = ( ( PEDATDIR & 0x0040 ) >> 6 ) & 0x0001;
ReadFlag = CDflag & AMflag & DRflag;
} while( !ReadFlag );
RxPacket();
}
}
/*防止其它干扰因素导致程序进入中断*/
void interrupt nothing()
{
enable();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -