jiky123 发表于 2012-6-3 04:12:41

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

正在弄个无线收发的nrf24l01,发现nrf24l01的MISO一直输出高电平,都是高电平的,导致读出来的数据都是0xff的,这个是否说明nrf模块烧坏的了啊?怎么判断nrf模块是否已经烧坏的了啊?请各位不吝赐教。

syuanwang 发表于 2012-6-3 07:15:36

这种情况99%是程序问题。
系统哪有那么弱,说烧就烧。
不放心就换个模块测测,做收发实验不会就只有一个模块吧

jiky123 发表于 2012-6-3 13:10:26

换了一个模块试过了,也是这样的

jiky123 发表于 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={0};
ucharTX_ADDRESS= {0x34,0x43,0x10,0x10,0x01};        //本地地址
ucharRX_ADDRESS= {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 = 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);
}
}

jiky123 发表于 2012-6-3 13:16:07

这个是整个程序,现在MISO口不再一直保持高电平,但是寄存器读出来的数据都是0x00.

Nestle 发表于 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状态寄存器返回的内容应该是什么啊?

超超。。。 发表于 2013-2-1 21:02:50

Nestle 发表于 2013-2-1 16:54 static/image/common/back.gif
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;


返回的那个数没用,我测试过一次,返回的数忘了。
页: [1]
查看完整版本: 请教nrf24l01,MISO一直输出高电平