NRF24L01模块 IRQ一直为高电平,求大神帮忙
按照手册,IRQ变低电平有三种情况,为什么我的一直为高。
void TX_Mode(uchar * BUF)
{
CE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, TX_ADR_WIDTH); //写接收地址
SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); //写数据到TX FIFO
SPI_Write_Reg(WRITE_REG + EN_AA, 0x01); // 通道0自动应答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能通道0接收
SPI_Write_Reg(WRITE_REG + STATUS, 0x0e); //状态寄存器复位
SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0x05); // 自动重发延时,次数
SPI_Write_Reg(WRITE_REG + RF_CH, 93); //射频通道
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //传输速率2Mbps,发射功率0dBm
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x0e); // CRC使能,发送模式,上电
CE = 1;
}
void CHECKFASONG(uchar DATA)
{
TX_BUF[0] = DATA;
TX_Mode(TX_BUF);
Check_ACK();
}
uchar Check_ACK()
{
while(IRQ);
sta = SPI_RW( NOP );
if(MAX_RT)
SPI_RW(FLUSH_TX);
SPI_Write_Reg(WRITE_REG + STATUS, sta);
IRQ = 1;
if(TX_DS)
return(0x00);
else
return(0xff);
}
我理解的是NRF模块存在三种情况时(1.接收到ACK信号,2.达到最大重发次数,3.用于接收端,接收到数据),自动给IRQ引脚置零,不知道理解有误么,请大神们指点下。
SPI_Write_Buf(WRITE_REG+TX_ADDR,buff1,5);
SPI_Read_Buf(READ_REG+TX_ADDR,buff2,5);
开机时写了上面两个语句进行判断,发现读出的 buff2 不等于 写入的 buff1,不知道是硬件的原因还是SPI时序的问题,已经换了三个NRF24L01模块了,都是这样。
SPI时序? ? 单片机频率为22MHZ,所以加入了for循环用于分频,不知道是否有错误
uchar SPI_RW(uchar byte)
{
? ? ? ? uchar i,j;
? ?? ? ? ? for(i=0; i<8; i++)? ?? ???
? ?? ? ? ? {
? ?? ? ? ?? ?? ?? ?MOSI = (byte & 0x80);? ?
? ?? ?? ?? ?? ? byte <<= 1;? ?? ?? ?? ?? ???? ? ? ? ? ? ? ?
? ?? ?? ?? ?? ? SCK = 1;? ?? ?? ?? ?? ?? ?
? ?? ?? ?? ?? ? for(j=1;j<200;j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? _nop_();
? ? ? ? ? ? ? ? }
? ? ? ?? ?? ?? ?byte |= MISO;? ?? ? ? ? ? ?? ???? ? ? ? ? ? ? ?
? ?? ?? ?? ?? ? SCK = 0;? ?? ?? ?? ?? ? ? ?? ?
? ?? ?? ?? ?? ? for(j=1;j<8;j++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ?? ?? ???_nop_();
? ? ? ? ? ? ? ? }
? ?? ? ? ? }
? ?? ???return(byte);? ?? ?? ???? ? ? ?
}
问题解决了么?
问题解决了么?