nrf24l01通信读取寄存器都为0
我先把SPI输入输出短路,可以收到发送的数据,又用GPIO模拟SPI发送,nrf24l01是可以发送数据的,可是用硬件SPI控制nrf24l01就出现问题,给nrf寄存器写值时,可以返回一些值,这应该说明SPI是通的吧?但是一用SPI_Read读取写入的值就发现,就返回0x00,这到底是怎么回事啊??各位大神帮帮忙!!
部分程序如下:
//****************************************************************************************
//*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
Delay_us(1200); //1.2ms???
CE=0; // chip enable
CSN=1; // Spi disable
//SCK=0; // Spi clock line init high
//check=SPI_Read(READ_REG+STATUS);
st=SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
check=SPI_Read(READ_REG+STATUS);
st=SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址,频道0
check=SPI_Read_Buf(READ_REG+RX_ADDR_P0, RX_ADDRESS1, RX_ADR_WIDTH);
// SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 频道0自动 禁止ACK应答,debug
// SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 禁止接收地址只有频道0,debug
// SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //设置重发时间间隔:500us+86us,最大自动重发次数:10次
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发,debug
st=SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致
check=SPI_Read(READ_REG+RF_CH);
st=SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB
check=SPI_Read(READ_REG+RF_SETUP);
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0;
Delay_us(1); // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0x0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication
return(reg_val); // return register value
}
//****************************************************************************************************/
//*功能:NRF24L01读写寄存器函数
//写数据value到reg寄存器
//****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;
Delay_us(1); // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
st=SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status uchar
}
//****************************************************************************************************/
//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
//*功能: 用于读数据,reg:为寄存器地址pBuf:为待读出数据地址,uchars:读出数据的个数
//****************************************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uchar status,uchar_ctr;
CSN = 0;
Delay_us(1); // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
{
pBuf[uchar_ctr] = SPI_RW(0);
Delay_us(1);
}
CSN = 1;
return(status); // return nRF24L01 status uchar
}
//*********************************************************************************************************
//*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
//*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写数据个数
//*********************************************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uchar status,uchar_ctr;
CSN = 0;
Delay_us(1); //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
{
st=SPI_RW(*pBuf++);
// Delay_us(1);
}
CSN = 1; //关闭SPI
return(status); //
}
void InitSpi(void)
{
// Initialize SPI-A:
//configure control register
SpiaRegs.SPICCR.all= 0x07; //进入初始状态,数据在上升沿输出,自测禁止,8位数据模式
//configure operation register
SpiaRegs.SPICTL.all= 0x06; //clock开始为低电平,master,enable transmit,disable interrupt
//set SPI BaudRate
SpiaRegs.SPIBRR =0x0; //baudrate=LSPCLK/4=4.6875MHZ
SpiaRegs.SPICCR.all= 0x87; //退出初始状态,准备发送
//tbd...
}
unsigned int Spi_TxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1)
{
i=0;
bufflag0++;
}
else
{
i=1;
bufflag1++;
}
return(i);
}
unsigned int Spi_RxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.INT_FLAG==1)
{
i=1;
}
else
{
i=0;
}
return(i);
}
uchar SPI_RW(uchar uuchar)
{
if(Spi_TxReady()==1) //TxBuff未满,SPITXBUF不用初始化为0?
{
SpiaRegs.SPITXBUF=(((unsigned char)uuchar<<8)+0x00); //数据写入SPI发送缓冲区
//spitxbuf++;
}
while(Spi_TxReady()!=1);
// GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
while(Spi_RxReady()!=1); //RXBUFF已接受完一个字
// while(Spi_RxReady()==1)
// {
out=SpiaRegs.SPIDAT;
uuchar=(out&0xff);
// }
return(uuchar); // return read uchar
} nrf24l01 spi
[解决办法]
看看两种实现的SPI的模式是否正确