|
发表于 2009-1-16 13:51:48
|
显示全部楼层
上班不能聊QQ的。给你发个最简单的单发送和接收功能的程序吧,你试试。
(2401tx.c)
#include <io.h>
#define SIG_OUT PORTA
#define SIG_IN PINA
#define SIG_DIR DDRA
#define CLK BIT0
#define DR1 BIT1
#define PWR BIT2
#define DATA BIT3
#define CS BIT4
#define CE BIT5
#define nRF_CE_0 (SIG_OUT &= ~CE)
#define nRF_CE_1 (SIG_OUT |= CE)
#define nRF_CS_0 (SIG_OUT &= ~CS)
#define nRF_CS_1 (SIG_OUT |= CS)
#define nRF_DATA_0 (SIG_OUT &= ~DATA)
#define nRF_DATA_1 (SIG_OUT |= DATA)
#define nRF_CLK_0 (SIG_OUT &= ~CLK)
#define nRF_CLK_1 (SIG_OUT |= CLK)
#define nRF_PWR_0 (SIG_OUT &= ~PWR)
#define nRF_PWR_1 (SIG_OUT |= PWR)
#define nRF_DATA (SIG_IN&DATA)
#define nRF_DR1 (SIG_IN&DR1)
#define nRF_DATA_IN (SIG_DIR &= ~DATA)
#define nRF_DATA_OUT (SIG_DIR |= DATA)
const unsigned int set_word[9] = {
0x8E08, 0x1C10, 0x1000, 0x0000,
0x0000, 0x0000, 0xE77E, 0xE763,
0xEF14
};
void init_sys();
void init_2401();
unsigned int spi_read();
void spi_byte(unsigned char data);
void spi_word(unsigned int data);
void transmit_data(unsigned int data);
int main()
{
init_sys();
init_2401();
while(1)
{
transmit_data(0x0806);
unsigned int i;
for (i=0; i<0x8000; i++);
}
}
void init_sys()
{
SIG_OUT = 0x00;
SIG_DIR = CE + CS + CLK + PWR + DATA;
}
void init_2401()
{
unsigned char i;
nRF_PWR_1;
nRF_CS_1;
for(i=0; i<9; i++)
spi_word(set_word);
nRF_CS_0;
}
unsigned int spi_read()
{
unsigned char i;
unsigned int data = 0;
nRF_DATA_IN;
for (i=0; i<16; i++)
{
nRF_CLK_0;
data <<= 1;
if (nRF_DATA)
data |= 0x0001;
nRF_CLK_1;
}
nRF_CLK_0;
return data;
}
void spi_byte(unsigned char data)
{
unsigned char i;
for (i=0; i<8; i++)
{
nRF_CLK_0;
if (data&0x80)
nRF_DATA_1;
else
nRF_DATA_0;
data <<= 1;
nRF_CLK_1;
}
nRF_CLK_0;
}
void spi_word(unsigned int data)
{
unsigned char i;
nRF_DATA_OUT;
for (i=0; i<16; i++)
{
nRF_CLK_0;
if (data&0x8000)
nRF_DATA_1;
else
nRF_DATA_0;
data <<= 1;
nRF_CLK_1;
}
nRF_CLK_0;
}
void transmit_data(unsigned int data)
{
nRF_CE_1;
spi_byte(0xE7);
spi_word(0x7EE7);
spi_word(data);
nRF_CE_0;
}
(2401rx.c)
#include <io.h>
#define SIG_OUT PORTA
#define SIG_IN PINA
#define SIG_DIR DDRA
#define CLK BIT0
#define DR1 BIT1
#define PWR BIT2
#define DATA BIT3
#define CS BIT4
#define CE BIT5
#define nRF_CE_0 (SIG_OUT &= ~CE)
#define nRF_CE_1 (SIG_OUT |= CE)
#define nRF_CS_0 (SIG_OUT &= ~CS)
#define nRF_CS_1 (SIG_OUT |= CS)
#define nRF_DATA_0 (SIG_OUT &= ~DATA)
#define nRF_DATA_1 (SIG_OUT |= DATA)
#define nRF_CLK_0 (SIG_OUT &= ~CLK)
#define nRF_CLK_1 (SIG_OUT |= CLK)
#define nRF_PWR_0 (SIG_OUT &= ~PWR)
#define nRF_PWR_1 (SIG_OUT |= PWR)
#define nRF_DATA (SIG_IN&DATA)
#define nRF_DR1 (SIG_IN&DR1)
#define nRF_DATA_IN (SIG_DIR &= ~DATA)
#define nRF_DATA_OUT (SIG_DIR |= DATA)
const unsigned int set_word[9] = {
0x8E08, 0x1C10, 0x1000, 0x0000,
0x0000, 0x0000, 0xE77E, 0xE763,
0xEF15
};
unsigned int data_buf[16];
void init_sys();
void init_2401();
unsigned int spi_read();
void spi_word(unsigned int data);
int main()
{
init_sys();
init_2401();
while(1)
{
if (nRF_DR1)
{
data_buf[0] = spi_read();
data_buf[0] = 0;
}
}
}
void init_sys()
{
SIG_OUT = 0x00;
SIG_DIR = CE + CS + CLK + PWR;
}
void init_2401()
{
unsigned int i;
nRF_PWR_1;
nRF_DATA_OUT;
nRF_CS_1;
for(i=0; i<9; i++)
spi_word(set_word);
nRF_CS_0;
nRF_DATA_IN;
nRF_CE_1;
}
unsigned int spi_read()
{
unsigned char i;
unsigned int data = 0;
nRF_DATA_IN;
for (i=0; i<16; i++)
{
nRF_CLK_0;
data <<= 1;
if (nRF_DATA)
data |= 0x0001;
nRF_CLK_1;
}
nRF_CLK_0;
return data;
}
void spi_word(unsigned int data)
{
unsigned char i;
nRF_DATA_OUT;
for (i=0; i<16; i++)
{
nRF_CLK_0;
if (data&0x8000)
nRF_DATA_1;
else
nRF_DATA_0;
data <<= 1;
nRF_CLK_1;
}
nRF_CLK_0;
}
附加一个2401的简单中文和英文数据手册说明,中文里面有简单的讲解配置字,详细的还是看英文的ds吧。
点击此处下载 ourdev_589986.pdf(文件大小:240K) (原文件名:2.4GHz 射频收发芯片nRF2401 及其应用.pdf)
点击此处下载 ourdev_589987.pdf(文件大小:249K) (原文件名:nRF2401A_rev1_0.pdf)
2401看明白配置字,用还是挺方便的。跟读写存储器一样。 |
|