|
楼主 |
发表于 2009-6-24 22:23:52
|
显示全部楼层
发射程序: mcu:Mega128
#include <avr/io.h>
#include <util/delay.h>
#include "24L01.h"
#include "1602B_LCD.h"
#define uchar unsigned char
#define PLOAD_WIDTH 1
uchar rx_buf[PLOAD_WIDTH]; //接收缓冲区
uchar tx_buf[PLOAD_WIDTH]; //发送缓冲区
#define DDR_SPI DDRB
#define PORT_SPI PORTB
#define DDR_CE DDRB
#define PORT_CE PORTB
#define BIT_CE 4 // PB4
#define DD_SS 0 // PB0 , SS
#define DD_SCK 1 // PB1 , SCK
#define DD_MOSI 2 // PB2 , MOSI
#define DD_MISO 3 // PB3 , MISO
#define CSN_0 PORT_SPI &= ~(1<< DD_SS)
#define CSN_1 PORT_SPI |= 1<< DD_SS
#define CE_0 PORT_CE &= ~(1<< BIT_CE)
#define CE_1 PORT_CE |= 1<< BIT_CE
void SPI_Init()
{
DDR_SPI = (1 << DD_SS) | (1 << DD_MOSI) |(1 << DD_SCK) ;
// SS MOSI SCK 为输出, MISO为输入
SPCR = (1 << SPE) | (1 << MSTR) ; // 开启SPI 主机模式
SPSR = (0 << SPI2X); // Fsck = Fosc/2
}
uchar SPI_Write(uchar data)
{
SPSR &= ~(1 << SPIF);
SPDR = data;
while(!(SPSR & (1<<SPIF))) ;
return SPDR;
}
uchar RF_WR_Reg(uchar reg,uchar value)
{
uchar temp;
CSN_0;
temp = SPI_Write( reg ) ;
SPI_Write( value );
CSN_1;
return temp;
}
uchar RF_RE_Reg(uchar reg)
{
uchar temp;
CSN_0;
SPI_Write( reg );
temp = SPI_Write( 0 );
CSN_1;
return temp;
}
uchar RF_WR_Buff(uchar reg, uchar *pBuff, uchar bytes)
{
uchar temp,i;
CSN_0;
temp = SPI_Write( reg );
for(i=1;i<=bytes;i++)
SPI_Write( *pBuff++ );
CSN_1;
return temp;
}
uchar RF_RE_Buff(uchar reg, uchar *pBuff, uchar bytes)
{
uchar temp,i;
CSN_0;
temp = SPI_Write( reg );
for(i=1;i<=bytes;i++)
pBuff = SPI_Write( 0 );
CSN_1;
return temp;
}
void TX_Mode()
{
CE_0;
RF_WR_Buff(W_TX_PAYLOAD, tx_buf, PLOAD_WIDTH);
CE_1;
asm("nop");
CE_0;
}
void RX_Mode()
{
CE_1;
_delay_us(150);
}
void dis(uchar o)
{
uchar temp;
for (uchar i=0;i<=7;i++)
{
temp = 0;
if (((o<<i) & 0x80) == 0x80) temp = 1;
LCD_Char(1,8+i,48+temp);
}
}
void main()
{
uchar temp, c = 1;
DDRD = 0xff;
PORTD = 0x00;
DDRB = 0xbf;
//CE_0;
SPI_Init();
LCD_Init();
LCD_Clear();
LCD_Char(1,1,'Y');
RF_WR_Reg(W_REG + CONFIG , 0x53); //01010011
RF_WR_Reg(W_REG + EN_AA , 0x00); //00000000
RF_WR_Reg(W_REG + EN_RXADDR , 0x01); //00000001
RF_WR_Reg(W_REG + SETUP_RETR , 0X00);//00000111
RF_WR_Reg(W_REG + RF_SETUP , 0x0F); //00001111
RF_WR_Reg(W_REG + RX_PW_P0 , 0x01); //00000001
RX_Mode();
while (1)
{
temp = RF_RE_Reg( R_REG + STATUS );
dis(temp);
if ((RF_RE_Reg( R_REG + STATUS ) & 0x40) == 0x40)
{
CE_0; //这里讲CE降为低电平,应该进入待机模式I ,但是还能收到M16发出的数据!!
RF_RE_Buff(R_RX_PAYLOAD, rx_buf, PLOAD_WIDTH);
RF_WR_Reg(W_REG + STATUS , 0X40 ); //00000001
/*CE_1;
SPI_Write( FLUSH_RX );
CE_0;*/
LCD_Char(1,3,c/10 + 0x30);
LCD_Char(1,4,c%10 + 0x30);
LCD_Char(2,c++,48+rx_buf[1]);
if (c==17) c=0;
temp = RF_RE_Reg( R_REG + STATUS );
dis(temp);
}
}
} |
|