搜索
bottom↓
回复: 6

请教nrf24l01,MISO一直输出高电平

[复制链接]

出0入0汤圆

发表于 2012-6-3 04:12:41 | 显示全部楼层 |阅读模式
正在弄个无线收发的nrf24l01,发现nrf24l01的MISO一直输出高电平,都是高电平的,导致读出来的数据都是0xff的,这个是否说明nrf模块烧坏的了啊?怎么判断nrf模块是否已经烧坏的了啊?请各位不吝赐教。

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-3 07:15:36 | 显示全部楼层
这种情况99%是程序问题。
系统哪有那么弱,说烧就烧。
不放心就换个模块测测,做收发实验不会就只有一个模块吧

出0入0汤圆

 楼主| 发表于 2012-6-3 13:10:26 | 显示全部楼层
换了一个模块试过了,也是这样的

出0入0汤圆

 楼主| 发表于 2012-6-3 13:10:42 | 显示全部楼层
#include "stm8s105c_s.h"
#include "define.h"

_Bool CE   @PB_ODR:1; //芯片使能
_Bool CSN  @PB_ODR:6; //片选
_Bool SCK  @PB_ODR:2;
_Bool MOSI @PB_ODR:5;

_Bool MISO @PB_IDR:3;
_Bool IRQ  @PB_IDR:4;

uchar TxBuf[TX_PLOAD_WIDTH]={0};
uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
void init_NRF24L01(void)
{
        Uart_Delay(100);
        CE=0;
        CSN=1;
        SCK=0;
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);  //本地地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);  //写接收端的地址
       
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      // Enable Auto.Ack:Pipe0
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
        //SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        // 信道工作在2.4GHZ
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //接收数据长度 32个字节  
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ
        SPI_RW_Reg(WRITE_REG +CONFIG, 0x0E);
       
}
//IO口初始化
void NRF_Gpio(void)
{
    PB_DDR  =0B01100110; //将CE CSN SCK MOSI设置为输出
    PB_CR1  =0XFF;   
    CSN=1;
    PB_CR2|=0X10;        //使能IRQ带中断
    ITC_SPR2&=0XFC;      //设置该中断优先级为1级,低于AD转换中断
    EXTI_CR1|=0X08;      //仅下降沿触发中断
    EXTI_CR1&=0XFB;
}
//delay函数
  void Uart_Delay(uint a)
{ uint i;
        for(i=0;i<a;i++);
}

/**********************************************************************
函数名:SPI_RW
输入:  uchars
输出:  uchars
功能:基本写操作函数,将8位的数输出到无线模块,同时返回当前无线模块的值
***********************************************************************/
uchar SPI_RW( uchar byte)
{   
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++)
    {
        MOSI=(byte&0x80);
        byte=(byte<<1);
        SCK=1;
        byte|=MISO;
        SCK=0;
    }
    return(byte);
}


/********************************************************************************
函数名:SPI_RW_Reg
输入:reg,value
输出:status
功能:往指定的寄存器写入数据。返回写入之前该寄存器的数据。
********************************************************************************/
uchar SPI_RW_Reg(uchar reg,uchar value)
{
    uchar status;
    CSN=0;
    status=SPI_RW(reg);
    SPI_RW(value);
    CSN=1;       
    return(status);
}

/*******************************************************************************
函数名:SPI_Read
输入:reg
输出:reg_val
功能:基本的读取无线模块的函数,输入是需要读取的寄存器的地址,输出是寄存器的数据.
      把寄存器的地址写入后,再把0写入无线模块就可以读取寄存器的数据的了
********************************************************************************/
uchar SPI_Read(uchar reg)
{
    uchar reg_val=0;       
    CSN=0;
    SPI_RW(reg);
    reg_val=SPI_RW(0);
    CSN=1;       
    return(reg_val);
}


/******************************************************************************
函数名:SPI_Read_Buf
输入:reg,*pBuf,chars
输出:status
功能:读取指定寄存器的uchars个字节数据,并且存放在pBuf[]数组中。
******************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;

   CSN = 0;                    
   status = SPI_RW(reg);         
   for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
         pBuf[byte_ctr] = SPI_RW(0);
         //*(pBuf++) = SPI_RW(0);   
   CSN = 1;                     
   return(status);         
}


/******************************************************************************
函数名:SPI_Write_Buf
输入:reg,*pBuf,uchars
输出:status
功能:往指定的寄存器中写入一组数据。
******************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;  
   CSN = 0;                  
   status = SPI_RW(reg);  
   // Uart_Delay(10);
   for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
      SPI_RW(*pBuf++);
                        //Uart_Delay(200);
   CSN = 1;               
   return(status);     
}
/***********************************************************
函数:SetRX_Mode
功能:设置为接收模式
***********************************************************/
void SetRX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); //IRQ接收完成产生中断,16CRC
        CE=1;
        Uart_Delay(130);
}
/**********************************************************
函数:nRF_TxPacket
功能:发送tx_buf数据
**********************************************************/
void nRF_TxPacket(uchar* tx_buf)
{
        CE=0;
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  //写接收端的地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_ADR_WIDTH);        //写数据
        CE=1;
                Uart_Delay(10);
}
main()
{
        NRF_Gpio();
        _asm("rim");
        init_NRF24L01();
        Uart_Delay(50);
        while (1)
{
        nRF_TxPacket(TxBuf);
        SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
        Uart_Delay(50);
}
}

出0入0汤圆

 楼主| 发表于 2012-6-3 13:16:07 | 显示全部楼层
这个是整个程序,现在MISO口不再一直保持高电平,但是寄存器读出来的数据都是0x00.

出0入0汤圆

发表于 2013-2-1 16:54:48 | 显示全部楼层
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;  
   CSN = 0;                  
   status = SPI_RW(reg);  
   // Uart_Delay(10);
   for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
      SPI_RW(*pBuf++);
                        //Uart_Delay(200);
   CSN = 1;               
   return(status);     
}
请问这个status状态寄存器返回的内容应该是什么啊?

出0入0汤圆

发表于 2013-2-1 21:02:50 | 显示全部楼层
Nestle 发表于 2013-2-1 16:54
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;  

返回的那个数没用,我测试过一次,返回的数忘了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 18:27

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

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