初中生
最后登录1970-1-1
在线时间 小时
注册时间2014-5-11
|
楼主 |
发表于 2014-5-16 18:42:57
|
显示全部楼层
void NRF_TX_Mode(void)
{
NRF_CE_LOW();
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x00); //使能通道0的自动应答
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址
SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); //设置RF通道为CHANAL
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断
/*CE拉高,进入发送模式*/
NRF_CE_HIGH();
Delay(0xffff); //CE要拉高一段时间才进入发送模式
}
先失能通道0自动应答、失能接收通道0、失能自动重发,调的发送端。
/*检测NRF模块与MCU的连接*/
status = NRF_Check();
/*判断连接状态*/
if(status == SUCCESS)
LED1( ON );
else
printf("\r\n NRF与MCU连接失败,请重新检查接线。\r\n");
LED1被点亮,说明连接正常吧。
死循环里的程序
while(1)
{
NRF_TX_Mode();
/*开始发送数据*/
status = NRF_Tx_Dat(txbuf);
/*判断发送状态*/
switch(status)
{
case MAX_RT:
printf("\r\n 主机端 没接收到应答信号,发送次数超过限定值,发送失败。 \r\n");
break;
case ERROR:
printf("\r\n 未知原因导致发送失败。 \r\n");
break;
case TX_DS:
LED2(ON);
break;
}
}
发送这个u8 txbuf[4]={0,1,2,3}; //发送缓冲
LED2被点亮。
u8 NRF_Tx_Dat(u8 *txbuf)
{
u8 state;
/*ce为低,进入待机模式1*/
NRF_CE_LOW();
/*写数据到TX BUF 最大 32个字节*/
SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);
/*CE为高,txbuf非空,发送数据包 */
NRF_CE_HIGH();
/*等待发送完成中断 */
while(NRF_Read_IRQ()!=0);
/*读取状态寄存器的值 */
state = SPI_NRF_ReadReg(STATUS);
if(state == 0x2e)LED3(ON);
//LED3(ON);
/*清除TX_DS或MAX_RT中断标志*/
SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,0xff);
SPI_NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器
/*判断中断类型*/
if(state&MAX_RT) //达到最大重发次数
{
return MAX_RT;
}
else if(state&TX_DS) //发送完成
{
return TX_DS;
}
else
return ERROR; //其他原因发送失败
}
这里还检测了状态寄存器里的值,是0x2e,点亮LED3.
最后是三个LED都被点亮了,可以说明发送成功吧? |
|