📄 main.c
字号:
//CLR(PORTB,TRXCE);
TRX_CE_clr;
}
//->ShockBurst Send
void nrf905_TxSend()
{
//SET(PORTB,TRXCE);
TRX_CE_set;
DelayUs(20);//>10us
//CLR(PORTB,TRXCE);//只发送一次
TRX_CE_clr;
}
//->ShockBurst Recv
void nrf905_RxOn()
{
//SET(PORTB,PWR);
PWR_UP_set;
//CLR(PORTB,TX_EN);//maybe first
TX_EN_clr;
//SET(PORTB,TRXCE);
TRX_CE_set;
}
uchar nrf905_SpiRW(uchar val)
{
uchar temp;
uchar m;
temp = 0;
for(m=0;m<8;m++)
{
SPI_UCLK_clr;
if(val&(1<<(7-m))) //write
SPI_SIMO_set;
else
SPI_SIMO_clr;
if(SPI_SOMI) //read
temp |= (1<<(7-m));
else
temp &= ~(1<<(7-m));
SPI_UCLK_set;
}
SPI_UCLK_clr;
return temp;
}
//切换模式
void ChangeMode(uchar num)
{
if(num==PowerDown)
{
PWR_UP_clr; /* 配置为掉电模式 */
TX_EN_clr;
TRX_CE_clr;
}
if(num==Standby)
{
TRX_CE_clr;
TX_EN_clr;
PW_UP_set;
}
if(num==RXMode)
{
/* TRX_EN=0; /**/
TX_EN_clr;
PW_UP_set;
DelayUs(1);
DelayUs(1);
TRX_CE_set;
}
if(num==TXMode)
{
TX_EN_set;
PW_UP_set;
TRX_CE_clr;
}
if(num==TXData)
{
TRX_CE_set;
Delayus(20);
TRX_CE_clr; /* ?? Make a 20us Pulse as nRF905 Datasheet */
}
}
void nrf905_SpiTest();
//初始化nrf905
void nrf905_Init()
{
uchar error;
error = 0;
SPI_UCLK_clr;
SPI_CSN_set;
////////////////////////////////////////////
//nrf905_StandBy();
ChangeMode(Standby);
DelayMs(5);//!!!must >3ms
nrf905_Config();
nrf905_SpiTest();//test...
if(RxBuf[0]!=CH_NO_BYTE) error++;
if(RxBuf[1]!=(PA_PWR_10dBm | HFREQ_PLL_433MHz)) error++;
if(RxBuf[2]!=(TX_AFW_4BYTE | RX_AFW_4BYTE)) error++;
if(RxBuf[3]!=RX_PW_4BYTE) error++;
if(RxBuf[4]!=TX_PW_32BYTE) error++;
if(RxBuf[5]!=0x12) error++;
if(RxBuf[6]!=0x34) error++;
if(RxBuf[7]!=0x56) error++;
if(RxBuf[8]!=0x78) error++;
if(RxBuf[9]!=(CRC16_EN | XOF_16MHz)) error++;
if(error !=0x00) LED1_clr;
else
{
P1OUT ^= BIT3;
P1OUT ^= BIT4;
DelayMs(500);
P1OUT ^= BIT3;
P1OUT ^= BIT4;
}
//nrf905_RxOn();
ChangeMode(RXMODE);
DelayUs(650);
}
//测试:通过读配置,判断SPI操作是否正确
void nrf905_SpiTest()
{
uchar i;
//CLR(PORTB,CSN);
SPI_UCLK_clr;
SPI_CSN_clr;
nrf905_SpiRW(RC); //读配置
for (i=0;i<10;i++)
{
RxBuf[i]= nrf905_SpiRW(0);//read from nrf905
}
//SET(PORTB,CSN);
SPI_CSN_set;
}
//写Tx地址
void nrf905_SetTxAddr()
{
//CLR(PORTB,CSN);
SPI_UCLK_clr;
SPI_CSN_clr;
nrf905_SpiRW(WTA); //写Tx地址
nrf905_SpiRW(TX_ADDRESS_0);
nrf905_SpiRW(TX_ADDRESS_1);
nrf905_SpiRW(TX_ADDRESS_2);
nrf905_SpiRW(TX_ADDRESS_3);
//SET(PORTB,CSN);
SPI_CSN_set;
}
//写Tx数据
void nrf905_SetData()
{
uchar i;
//CLR(PORTB,CSN);
SPI_UCLK_clr;
SPI_CSN_clr;
nrf905_SpiRW(WTP); //写TxPayload
for (i=0;i<TXSIZE;i++)
{
nrf905_SpiRW(TxBuf[i]);
}
//SET(PORTB,CSN);
SPI_CSN_set;
}
//等待发送结束
void nrf905_WaitSended()
{
//while ((PIND&(1<<DR))==0);
while(DR == 0)
{
;
}
}
//发送TxBuf中的数据
void nrf905_SendData()
{
//nrf905_TxOn();//切换到发送模式
ChangeMode(TXMODE);
DelayMs(4);
nrf905_SetTxAddr();//写发送地址
nrf905_SetData();//写数据
//nrf905_TxSend();//启动发送
ChangeMode(TXDATA);
nrf905_WaitSended();//等待发送结束
//ChangeMode(RXMODE); //转为接收状态
DelayUs(650);
}
//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
nrf905_TxOn();
nrf905_TxSend();
nrf905_WaitSended();
}
//读出接收到的数据
void nrf905_ReadData()
{
uchar i;
//CLR(PORTB,CSN);
SPI_UCLK_clr;
SPI_CSN_clr;
nrf905_SpiRW(RRP); //读RxPayload
for (i=0;i<RXSIZE;i++)
{
RxBuf[i]=nrf905_SpiRW(0xff);//read...
}
//SET(PORTB,CSN);
SPI_CSN_set;
}
/////////////////////////////////////////////////
void main( void )
{
// Stop watchdog timer to prevent time out reset
uchar m;
CpuInit();
LED1_set;
LED2_set;
DelayMs(500);
nrf905_Init();
for(;;)
{
while( (P4IN & BIT0) == 0x00) //等待接收完毕
{
//if((P4IN & BIT1) == BIT1)//AM
//LED2_clr;
;
}
P1OUT ^= BIT3; //灯闪烁,以示该次接收正确
P1OUT ^= BIT4;
//nrf905_StandBy();
/* ChangeMode(Standby);*/
nrf905_ReadData();
TxBuf[0]=0x7E;
TxBuf[1]=RxBuf[1];
for(m=2;m<TXSIZE;m++)
{
TxBuf[m]=m;
}
DelayMs(2);
nrf905_SendData(); //发送4个字节
//nrf905_RxOn(); //转为接受状态
ChangeMode(RXMODE);
DelayMs(1);
}
}
////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -