金牌会员
- 积分
- 1886
- 威望
- 755
- 贡献
- 903
- 兑换币
- 62
- 注册时间
- 2011-10-23
- 在线时间
- 114 小时
|
7#
楼主 |
发表于 2012-3-19 10:34:50
|
只看该作者
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
/* for define the head file*/
//头文件的宏定义的相关信息 来自于官方方式。
//#include "Includes.h" //头文件包含 来自于官方的数据 应该准确。
/****************************************************************************
SPI的初始化设置
***************************************************************************/
#define uchar unsigned char /* the dode of the C51's application */
#define uint unsigned int
// ===========spi的各种命令代码===========================================
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
/****************************************************************************/
#define TX_EN PORTA_PA0
#define TRX_CE PORTA_PA1
#define PWR_UP PORTA_PA2
#define CD PORTA_PA3
#define AM PORTA_PA4
#define DR PORTA_PA5
//#define MISO PTM_PTM2
//#define MOSI PTM_PTM4
//#define SCK PTM_PTM5
//#define SS PTM_PTM3
//#define CSN PTH_PTH0
#define CSN PORTA_PA6
#define LED2 PORTA_PA7
// int i=0;
uchar TxBuf[6];
//uchar RxBuf[6];
uchar num;
/*void PLL_init(void) //倍频到88M
{
CLKSEL=0X00; // disengage PLL to system
SYNR =0xc0 | 0x0a;
REFDV=0x80 | 0x01; //llclock=2*osc*(1+SYNR)/(1+REFDV)=96MHz;
REFDV=1;
POSTDIV=0x00;
_asm(nop); // BUS CLOCK=48M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
} */
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
RFConfig RxTxConf =
{
10,
0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
// 905配置初始化数据
//0x4c:频率433mhz s
// 0x20, 0x20:收发32字节
// 0xcc, 0xcc, 0xcc,0xcc:spi写入的地址
/*****************************************************************************/
/*****************************************************************************/
void keyscan(void); // initialize 232 uart
void Config905(void); // Config nRF905 module配置NRF905模式
void SetTxMode(void); // Set nRF905 in Tx mode
void TxPacket(void); // Send data by nRF905
void SpiWrite(uchar); // Write data to nRF905
void Delay(uchar n); // Delay 100us
void SPI_Init(void);//initial of the SPI
/*****************************************************************************/
//主函数
/*****************************************************************************/
void main()
{
DDRA_DDRA0=1;//TX_EN 输出控制端口
DDRA_DDRA1=1;//TRX_CE
DDRA_DDRA2=1;//PWR_UP
DDRA_DDRA3=0;//CD
DDRA_DDRA4=0;//AM
DDRA_DDRA5=0;//DR 输入端口
//DDRM_DDRM2=0;//MISO
//DDRM_DDRM4=1;//MOSI
//DDRM_DDRM5=1;//SCK
//DDRM_DDRM3=1;//CSN
DDRA_DDRA6=1;//LED1
DDRA_DDRA7=1;//LED2
//DDRH_DDRH0=1;//CSN
DDRB=0x0f;
//=========RF905初始化 ===============================================
CSN=1; // Spi disable
//SCK=0; // Spi clock line init high h
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode spi编程模式
TX_EN=0; // set radio in Rx mode
/*****************************************************************************/
SPI_Init();//SPI initial
for(;;)
{
Config905(); // Config nRF905 module
keyscan(); //scan the key board
if(num==1)
{
TxBuf[0] =1;
SetTxMode();
//TxPacket();
Delay(2);
num=0;
}
if(num==2)
{
TxBuf[0] =2;
SetTxMode();
//TxPacket();
Delay(2);
num=0;
}
if(num==3)
{
TxBuf[0] =3;
SetTxMode();
// TxPacket();
Delay(2);
num=0;
}
if(num==4)
{
TxBuf[0] =4;
}
// SetTxMode();
TxPacket();// Set Tx Mode*/
TxBuf[0] =0;// T发送数据包
} //for end
} //the end of main function
/*****************************************************************************/
//延时子程序
/*****************************************************************************/
void Delay(uchar n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<2670;j++); //busclk:16MHz--1ms
}
/*****************************************************************************/
//function Config905();
/*****************************************************************************/
void Config905(void)
{
uchar i;
CSN=0;
// Spi enable for write a spi command
SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字相当于i<10道理
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1;// Disable Spi
}
/*****************************************************************************
//function SPI initial function
*****************************************************************************/
void SPI_Init(void)
{
MODRR |= 0x10; //define the M port
//SPI0CR1=0x04;
(void)SPI0SR;
(void)SPI0DR;
SPI0BR=0x47; //it is said its should be 67//BR=busclk/((SPPR + 1)· 2^(SPR + 1))=16000/(5*8)=400k
SPI0CR1=0xf2; //0b01011100ss\为主机输出 高位先传 d2 52 f2 都行的
SPI0CR2=0x00; //0b00000010 before was 0x12
}
/****************************************************************************
SPI写函数
****************************************************************************/
void SpiWrite(uchar byte)
{
//(void)SPI0SR;
SPI0DRL = byte;
Delay(3);
while(!(SPI0SR_SPTEF));//wait until the data is all sent off
//while(!(SPI0SR_SPIF));
//i=~i;
//(void)SPI0DRL; // just now open enable
//return;
}
/*****************************************************************************/
//function TxPacket();
/*****************************************************************************/
void TxPacket(void)
{
uchar i;
PWR_UP=1; //上电
TX_EN=1; //发送使能
TRX_CE=0; // Set TRX_CE low 进入spi编程模式
CSN=0; // Spi enable for write a spi command spi使能
SpiWrite(WTA); // Write address command 写入“写地址命令”
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]); //发送地址配置数如0x3C等,是第五个开始的
}
CSN=1; // Spi disable
Delay(1);
CSN=0; // Spi enable for write a spi command
SpiWrite(WTP); // Write payload command 写入“写数据命令”
for (i=0;i<4;i++) //写入“写地址命令”
{
SpiWrite(TxBuf[i]); // Write 32 bytes Tx data
}
CSN=1; // Spi disable
TRX_CE=1; // 进入发送模式 发送数据
Delay(1);
TRX_CE=0; // Set TRX_CE low 进入spi编程模式
}
/*****************************************************************************/
//SetTxMode();
/*****************************************************************************/
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=1;
Delay(2); // delay for mode change(>=650us)
}
/*****************************************************************************/
//function SendData_595 ();
/*****************************************************************************/
void keyscan(void)
{
unsigned char keytemp;
PORTB|=0xfe;
keytemp=PORTB&0xff;
if(keytemp!=0xff)
{
Delay(2);
keytemp=PORTB&0xff;
if(keytemp!=0xff)
// keyflag=1;//有按键标志
switch(keytemp)
{
case 0xee:num=1;break;//按键1
case 0xde:num=2;break;//按键2
case 0xbe:num=3;break;//按键3
case 0x7e:num=10;break;//按键a //****************************
default : break; //注意 注意我没有写完剩下的程序键盘部分的
//anjian按键5号开始自己编啊
}
}
/*PORTB=0xfd;
keytemp=PORTB&0xff;
if(keytemp!=0xff)
{
Delay(10);
keytemp=PORTB&0xff;
if(keytemp!=0xff)
//keyflag=1;
switch(keytemp)
{ case 0xed:num=4;break;//按键4
case 0xdd:num=5;break;//按键5
case 0xbd:num=6;break;//按键6
case 0x7d:num=11;break;//按键b
}
}
PORTB=0xfb;
keytemp=PORTB&0xff;
if(keytemp!=0xff)
{
Delay(10);
keytemp=PORTB&0xff;
if(keytemp!=0xff)
//keyfalg=1;
switch(keytemp)
{ case 0xeb:num=7;break;//按键7
case 0xdb:num=8;break;//按键8
case 0xbb:num=9;break;//按键9
case 0x7b:num=12;break;//按键c
}
}
PORTB=0xf7;
keytemp=PORTB&0xff;
if(keytemp!=0xff)
{
Delay(5);
keytemp=PORTB&0xff;
if(keytemp!=0xff)
//keyfalg=1;
switch(keytemp)
{ case 0xe7:num=14;break;//按键'*'
case 0xd7:num=0;break;//按键0
case 0xb7:num=15;break;//按键9'#'
case 0x77:num=13;break;//按键d
}
}
*/
}
|
|