请教nrf24l01,MISO一直输出高电平
正在弄个无线收发的nrf24l01,发现nrf24l01的MISO一直输出高电平,都是高电平的,导致读出来的数据都是0xff的,这个是否说明nrf模块烧坏的了啊?怎么判断nrf模块是否已经烧坏的了啊?请各位不吝赐教。 这种情况99%是程序问题。系统哪有那么弱,说烧就烧。
不放心就换个模块测测,做收发实验不会就只有一个模块吧 换了一个模块试过了,也是这样的
#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);
}
} 这个是整个程序,现在MISO口不再一直保持高电平,但是寄存器读出来的数据都是0x00.
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状态寄存器返回的内容应该是什么啊? 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]