nhlijiaming 发表于 2009-6-24 22:21:40

24L01模块发射接收成功了的麻烦来看一看,我接收的程序哪里错了?

在jasum的帮助下,发射程序写完了(有发送数据出去. 但具体发送的数据对不对,就不知道了........还有,为什么每次上电后,都要复位一下M16才能正常发射?)
   发射用的是M16 , 接收的是M128. 用的是硬件SPI,
寄存器设置:没有CRC校验 没有自动应答 地址宽度为5字节 射频通道2 2Mbps 0dBm 开启低噪声放大器增益 发送/接收地址: 0xE7E7E7E7E7(通道0默认) 接收数据通道0有效数据宽度:1字节(我每次发送一个字母"L",设置成1字节对吧?)
   现在的问题是,偶尔能收到信号,但从RX FIFO读出的数据却为0x00(是根本没有读出来,还是什么问题?) CD载波检测过,接收到的信号的确是M16发出的,那,为什么接收到的有效数据不是"L",而是0x00?
   接收程序在一楼,发射程序在二楼,大家帮忙看看! 1602lcd只是调试用的,大家可以忽略掉...

nhlijiaming 发表于 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;   //接收缓冲区
uchar tx_buf;   //发送缓冲区

#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);
   if (c==17) c=0;
   temp = RF_RE_Reg( R_REG + STATUS );
   dis(temp);
}
}
}

nhlijiaming 发表于 2009-6-24 22:24:41

发射程序: mcu: Mega16
#include <avr/io.h>
#include <util/delay.h>
#include "24L01.h"

#define uchar unsigned char

#define PLOAD_WIDTH 1
uchar rx_buf;   //接收缓冲区
uchar tx_buf;   //发送缓冲区

#define DDR_SPI DDRB
#define PORT_SPI PORTB
#define DDR_CE DDRB
#define PORT_CE PORTB
#define BIT_CE 3// PB3
#define DD_SS 4   // PB4 , SS
#define DD_MOSI 5 // PB5 , MOSI
#define DD_MISO 6 // PB6 , MISO
#define DD_SCK 7// PB7 , SCK

#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 main()
{
uchar c=0,i=0;
DDRA = 0xff;
PORTA = 0xff;
DDRB = 0xbf;
CE_0;
SPI_Init();

RF_WR_Reg(W_REG + CONFIG , 0x72);//01110010
RF_WR_Reg(W_REG + EN_AA , 0x00);//00000000
RF_WR_Reg(W_REG + EN_RXADDR , 0x00); //00000000
RF_WR_Reg(W_REG + SETUP_RETR , 0X00);//00000111
RF_WR_Reg(W_REG + RF_SETUP , 0x0f);//00001111

while (1)
{
PORTA=0x0;
tx_buf='L';
c++;
if (c == 25) c=0;
TX_Mode();
for(i=1;i<=25;i++) _delay_ms(60000);
PORTA=0xff;
for(i=1;i<=25;i++) _delay_ms(60000);
}
}

jasum 发表于 2009-6-26 01:29:50

RF_WR_Reg(W_REG + CONFIG , 0x53);    //01010011
接收端要IRQ有反应,0x53改成0x33,建议你最好使用CRC校验,又不增加你的麻烦,地址最好各字节不要全部相同

xaofen 发表于 2009-6-27 15:53:40

RF_WR_Reg(W_REG + EN_AA , 0x00);//00000000
crc是要加的,自动应答也加上好了

nhlijiaming 发表于 2009-6-27 18:05:14

已经调出来了. 楼上两位谢谢了
上面这两个程序问题多多啊.

nil0 发表于 2009-7-25 07:55:58

请教nhlijiaming ,俺一直就没调试通24L01模块,我把datasheet都读了N遍,您能介绍一下新手会犯的错在哪里吗?

CoolBird007 发表于 2009-11-2 17:05:15

同问。。。。

radiofcx 发表于 2009-11-3 14:26:09

如果看05版的PDF,是写不好程序的,要看07版的,芯片上电后要等13MS左右进入POWERDOWN模式,然后CONFIG 里的第二位置1过1。5MS进入STADY-I模式,在这个模式里配置其他的寄存器才有效,最好边写边读,看你的寄存器是否写正确,

CoolBird007 发表于 2009-11-3 18:32:37

感谢radiofcx的经验!今晚再试试,已经搞了三天了,寄存器读写也正常,发射时第11脚也有1.8V电压。就是接收端没有反应。不知是不是电源问题。

569350810 发表于 2009-12-30 18:26:24

第一个返回的状态可以读出来,
但指定的寄存器都读不了,
一般是什么的原因呀?
各位调试的时候有没遇到相同的问题呀?
页: [1]
查看完整版本: 24L01模块发射接收成功了的麻烦来看一看,我接收的程序哪里错了?