搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 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);
  }
}
}

出0入0汤圆

 楼主| 发表于 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[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 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[1]='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);
}
}

出0入0汤圆

发表于 2009-6-26 01:29:50 | 显示全部楼层
RF_WR_Reg(W_REG + CONFIG , 0x53);    //01010011
接收端要IRQ有反应,0x53改成0x33,建议你最好使用CRC校验,又不增加你的麻烦,地址最好各字节不要全部相同

出0入4汤圆

发表于 2009-6-27 15:53:40 | 显示全部楼层
RF_WR_Reg(W_REG + EN_AA , 0x00);  //00000000
crc是要加的,自动应答也加上好了

出0入0汤圆

 楼主| 发表于 2009-6-27 18:05:14 | 显示全部楼层
已经调出来了. 楼上两位谢谢了
上面这两个程序问题多多啊.

出0入0汤圆

发表于 2009-7-25 07:55:58 | 显示全部楼层
请教nhlijiaming ,俺一直就没调试通24L01模块,我把datasheet都读了N遍,您能介绍一下新手会犯的错在哪里吗?

出0入0汤圆

发表于 2009-11-2 17:05:15 | 显示全部楼层
同问。。。。

出0入0汤圆

发表于 2009-11-3 14:26:09 | 显示全部楼层
如果看05版的PDF,是写不好程序的,要看07版的,芯片上电后要等13MS左右进入POWERDOWN模式,然后CONFIG 里的第二位置1过1。5MS进入STADY-I模式,在这个模式里配置其他的寄存器才有效,最好边写边读,看你的寄存器是否写正确,

出0入0汤圆

发表于 2009-11-3 18:32:37 | 显示全部楼层
感谢radiofcx的经验!今晚再试试,已经搞了三天了,寄存器读写也正常,发射时第11脚也有1.8V电压。就是接收端没有反应。不知是不是电源问题。

出0入0汤圆

发表于 2009-12-30 18:26:24 | 显示全部楼层
第一个返回的状态可以读出来,
但指定的寄存器都读不了,
一般是什么的原因呀?
各位调试的时候有没遇到相同的问题呀?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 17:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表