|
发表于 2011-8-12 19:48:14
|
显示全部楼层
在一个博客文章看到的分享一下,这几天也在搞这个。
#include <iom16.h>
#include <macros.h>
#include"delay.h"
#include"lcd_init.h"
#pragma interrupt_handler timer0_ovf_isr:10
#define uint unsigned int
#define uchar unsigned char
#define DATA7 (DATA_BUF&BIT(7))!= 0
#define DATA0 (DATA_BUF&BIT(0))!= 0
//---------------------------------------------------配置口定义---------------------------------------------------
#define TXEN_1 (PORTB|=BIT(0))
#define TXEN_0 (PORTB&=~BIT(0))
#define TRX_CE_1 (PORTB|=BIT(1))
#define TRX_CE_0 (PORTB&=~BIT(1))
#define PWR_1 (PORTB|=BIT(2))
#define PWR_0 (PORTB&=~BIT(2))
#define MISO (PINB&BIT(3))
#define MOSI_1 (PORTB|=BIT(4))
#define MOSI_0 (PORTB&=~BIT(4))
#define SCK_1 (PORTB|=BIT(5))
#define SCK_0 (PORTB&=~BIT(5))
#define CSN_1 (PORTB|=BIT(6))
#define CSN_0 (PORTB&=~BIT(6))
//---------------------------------------------------NRF905状态IO----------------------------------------------------
#define AM PINA&BIT(0)
#define DR PINA&BIT(1)
#define CD PINA&BIT(2)
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
unsigned char DATA_BUF;
uint cnt=0,miao=0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
unsigned char TxRxBuf[5]=
{
0x00
};
unsigned char TxRxBuf1[]={"fuck u!"};
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在430MHZ
0x0c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
//------------------------------------------------延时------------------------------------------------------------
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
unsigned char j;
for (j=0;j<8;j++)
{
DATA_BUF=DATA_BUF<<1;
SCK_1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BIT(0);
}
else
{
DATA_BUF&=~BIT(0);
}
SCK_0;
}
return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
MOSI_1;
}
else
{
MOSI_0;
}
SCK_1;
DATA_BUF=DATA_BUF<<1;
SCK_0;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
CSN_1; // Spi disable
SCK_0; // Spi clock line init low
DDRA=0XFF;
PORTA=0XFF;
DDRA=0X00;
PWR_1; // nRF905 power on
TRX_CE_0; // Set nRF905 in standby mode
TXEN_0; // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
uchar i;
CSN_0; // Spi enable for write a spi command
//SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<11;i++) // Write configration words 写放配置字
{
SpiWrite(RFConf);
}
CSN_1; // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
uchar i;
//Config905();
CSN_0;
SpiWrite(WTP); // Write payload command
for (i=0;i<4;i++)
{
SpiWrite(TxRxBuf); // Write 32 bytes Tx data
}// Spi enable for write a spi command
CSN_1;
delay_ms(1); // Spi disable
CSN_0; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(TxAddress);
}
CSN_1; // Spi disable
TRX_CE_1; // Set TRX_CE high,start Tx data transmission
delay_ms(1); // // while (DR!=1);
TRX_CE_0; // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
delay_ms(1); // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
TXEN_0;
TRX_CE_1;
delay_ms(1); // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready
{
DDRB=((0<<PB0)|(0<<PB1));//先置为输入读状态
if(DR==1 && PINB&BIT(1)==1 && PINB&BIT(0)==0)
{
// Delay(50) ;
return 1;
}
else
{
return 0;
}
DDRB=((1<<PB0)|(1<<PB1));//重置为输出
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)
{
uchar i;
delay_ms(1);
// TRX_CE=0; // Set nRF905 in standby mode
delay_ms(100);
TRX_CE_0;
CSN_0; // Spi enable for write a spi command
delay_ms(1);
SpiWrite(RRP);
for (i = 0 ;i < 4 ;i++)
{
TxRxBuf=SpiRead(); // Read data and save to buffer
}
CSN_1;
delay_ms(10);
TRX_CE_1;
}
//--------------------------------------------------------数据接收------------------------------------------------
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while (CheckDR()==0);
delay_ms(10);
RxPacket();
}
unsigned char CheckCD(void) //Pin->检查是否已存在同频率载波
{
if (CD==1)
{
return 1;
}
else
{
return 0;
}
}
void timer0_init(void)
{
TCNT0 = 0x83; //1ms
TCCR0 = 0x03; //64
TIMSK = 0x01;
}
void timer0_ovf_isr(void)
{
TCNT0 = 0x83;
cnt++;
if(cnt==1000)
{
miao++;
cnt=0;
if(miao>59)
{
miao=0;
}
}
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
uchar i;
DDRB=0XF7;
DDRA=0X00;
timer0_init();
SREG=0X80;
nRF905Init();
Config905();
LCD_init();
while(1)
{
TxRxBuf[0]=miao/10;
TxRxBuf[1]=miao%10;
TxRxBuf[2]=cnt/100;
TxRxBuf[3]=cnt/10%10;
TxRxBuf[4]=cnt%10;
LCD_write_char(0,0,num1[TxRxBuf[0]]);
LCD_write_char(1,0,num1[TxRxBuf[1]]);
LCD_write_char(2,0,':');
LCD_write_char(3,0,num1[TxRxBuf[2]]);
LCD_write_char(4,0,num1[TxRxBuf[3]]);
LCD_write_char(5,0,num1[TxRxBuf[4]]);
LCD_write_string(0,1,TxRxBuf1);
SetTxMode();// Set nRF905 in Tx mode
TxPacket(TxRxBuf);// Send data by nRF905
//TxPacket(TxRxBuf1);
}
}
接收:
#include <iom16.h>
#include <macros.h>
#include"delay.h"
#include"lcd_init.h"
//---------------------------------------------------配置口定义---------------------------------------------------
#define DATA7 (DATA_BUF&BIT(7))!= 0
#define DATA0 (DATA_BUF&BIT(0))!= 0
#define uint unsigned int
#define uchar unsigned char
#define TXEN_1 (PORTB|=BIT(0))
#define TXEN_0 (PORTB&=~BIT(0))
#define TRX_CE_1 (PORTB|=BIT(1))
#define TRX_CE_0 (PORTB&=~BIT(1))
#define PWR_1 (PORTB|=BIT(2))
#define PWR_0 (PORTB&=~BIT(2))
#define MISO (PINB&BIT(3))
#define MOSI_1 (PORTB|=BIT(4))
#define MOSI_0 (PORTB&=~BIT(4))
#define SCK_1 (PORTB|=BIT(5))
#define SCK_0 (PORTB&=~BIT(5))
#define CSN_1 (PORTB|=BIT(6))
#define CSN_0 (PORTB&=~BIT(6))
//---------------------------------------------------NRF905状态IO----------------------------------------------------
#define AM PINA&BIT(0)
#define DR PINA&BIT(1)
#define CD PINA&BIT(2)
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
unsigned char DATA_BUF;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
unsigned char TxRxBuf[5];
unsigned char TxRxBuf1[];
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在430MHZ
0x0c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
unsigned char j;
for (j=0;j<8;j++)
{
DATA_BUF=DATA_BUF<<1;
SCK_1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BIT(0);
}
else
{
DATA_BUF&=~BIT(0);
}
SCK_0;
}
return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
MOSI_1;
}
else
{
MOSI_0;
}
SCK_1;
DATA_BUF=DATA_BUF<<1;
SCK_0;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
CSN_1; // Spi disable
SCK_0; // Spi clock line init low
DDRA=0XFF;
PORTA=0XFF;
DDRA=0X00;
PWR_1; // nRF905 power on
TRX_CE_0; // Set nRF905 in standby mode
TXEN_0; // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
uchar i;
CSN_0; // Spi enable for write a spi command
//SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<11;i++) // Write configration words 写放配置字
{
SpiWrite(RFConf);
}
CSN_1; // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
uchar i;
//Config905();
CSN_0;
SpiWrite(WTP); // Write payload command
for (i=0;i<4;i++)
{
SpiWrite(TxRxBuf); // Write 32 bytes Tx data
}// Spi enable for write a spi command
CSN_1;
delay_ms(1); // Spi disable
CSN_0; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(TxAddress);
}
CSN_1; // Spi disable
TRX_CE_1; // Set TRX_CE high,start Tx data transmission
delay_ms(1); // // while (DR!=1);
TRX_CE_0; // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
TRX_CE_0;
TXEN_1;
delay_ms(1); // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
TXEN_0;
TRX_CE_1;
delay_ms(1); // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready
{
DDRB=((0<<PB0)|(0<<PB1));//先置为输入读状态
if(DR==1 && PINB&BIT(1)==1 && PINB&BIT(0)==0)
{
// Delay(50) ;
return 1;
}
else
{
return 0;
}
DDRB=((1<<PB0)|(1<<PB1));//重置为输出
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)
{
uchar i;
delay_ms(1);
// TRX_CE=0; // Set nRF905 in standby mode
delay_ms(100);
TRX_CE_0;
CSN_0; // Spi enable for write a spi command
delay_ms(1);
SpiWrite(RRP);
for (i = 0 ;i < 4 ;i++)
{
TxRxBuf=SpiRead(); // Read data and save to buffer
}
CSN_1;
delay_ms(10);
TRX_CE_1;
}
//--------------------------------------------------------数据接收------------------------------------------------
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
//while (CheckDR()==0);
delay_ms(10);
RxPacket();
delay_ms(10);
}
unsigned char CheckCD(void) //Pin->检查是否已存在同频率载波
{
if (CD==1)
{
return 1;
}
else
{
return 0;
}
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
uchar i;
DDRB=0XF7;
DDRA=0X00;
DDRC=0XfF;
nRF905Init();
Config905();
LCD_init();
while(1)
{
RX();
LCD_write_char(0,0,num1[TxRxBuf[0]]);
w_12864(1,num1[TxRxBuf[1]]);
w_12864(1,':');
w_12864(1,num1[TxRxBuf[2]]);
w_12864(1,num1[TxRxBuf[3]]);
w_12864(1,num1[TxRxBuf[4]]);
//LCD_write_string(0,1,TxRxBuf1);
//CSN_1;
delay_ms(1);
}
} |
|