沈阳航空航天大学电子信息工程学院毕业设计(论文)
i = 0;
for(i=0; i j = 250; while(--j); j = 250; while(--j); } } /** *函数:SPI_RW() *描述:根据SPI协议,写一字节数据到nRF2401,同时从nRF2401读出一字节 *参数:byte *返回值:byte */ uchar SPI_RW(uchar byte) { uchar i; for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 } return(byte); // 返回读出的一字节 } /** *函数:SPI_RW_Reg() *描述:写数据value到reg寄存器 * 参数:reg,value *返回值:static */ uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /** *函数:SPI_Write_Buf() *描述:把pBuf缓存中的数据写入到nRF2401,通常用来写入发射通道数据或接收/发送地址 *参数:reg,*pBuf,bytes *返回值:static - 41 - 沈阳航空航天大学电子信息工程学院毕业设计(论文) */ uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i *函数:TX_Send_One_Mode() *描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数 据发送结束后,发送模块自动转入接收模式等待应答信号。 *参数:*BUF *返回值:空 */ void TX_Send_One_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, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; } /** *函数:TX_Send_Two_Mode() *描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数 据发送结束后,发送模块自动转入接收模式等待应答信号 *参数:*BUF *返回值:空 */ void TX_Send_Two_Mode(uchar * BUF) { CE = 0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS2, TX_ADR_WIDTH); // 写入 - 42 - 沈阳航空航天大学电子信息工程学院毕业设计(论文) 发送地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS2, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和 // 发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; } /** *函数:Check_ACK() *描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:clear *返回值:是否接到数据 */ uchar Check_ACK(bit clear) { while(IRQ); sta = SPI_RW(NOP); // 返回状态寄存器 if(MAX_RT) if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发 SPI_RW(FLUSH_TX); SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志 IRQ = 1; if(TX_DS) return(0x00); else return(0xff); } /** *函数:CheckButtonsOne() *描述:检查按键是否按下,按下则发送一字节数据 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:空 *返回值:空 */ void CheckButtonsOne() { - 43 - 沈阳航空航天大学电子信息工程学院毕业设计(论文) TX_BUF[0] = ~DATA; // 数据送到缓存 TX_Send_One_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据,发送模式的寄存器配置 LED = ~DATA; // 数据送到LED显示 delay_ms(100); Check_ACK(1); // 等待发送完毕,清除TX FIFO delay_ms(250); delay_ms(250); LED = 0xff; // 关闭LED while(!(P3 & 0x01)); DATA = 0x00; if(!DATA) { DATA = 0x01; } } /** *函数:CheckButtonsTwo() *描述:检查按键是否按下,按下则发送一字节数据 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:空 *返回值:空 */ void CheckButtonsTwo() { TX_BUF[0] = ~DATA2; // 数据送到缓存 TX_Send_Two_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据,发送模式的寄存器配置 LED = ~DATA2; // 数据送到LED显示 delay_ms(100); Check_ACK(1); // 等待发送完毕,清除TX FIFO delay_ms(250); delay_ms(250); LED = 0xff; // 关闭LED while(!(P3 & 0x01)); DATA2 = 0x00; if(!DATA2) { DATA2 = 0x02; } } /** *函数:main() *描述:主函数 *参数:空 *返回值:空 */ void main(void) { init_io(); // 初始化IO - 44 - 沈阳航空航天大学电子信息工程学院毕业设计(论文) P3 |= 0x00; if(!(P3 & 0x01)) { delay_ms(20); if(!(P3 & 0x01)) { while(1) { if(while_flag == 0) { CheckButtonsOne(); //receive_information(); //接收信号 while_flag = 1; } else if(while_flag == 1) { while_flag = 0; } break; } } } else if(!(P3 & 0x02)) { delay_ms(20); if(!(P3 & 0x02)) { while(1) { if(while_flag == 0) { CheckButtonsTwo(); //receive_information(); //接收信号 while_flag = 1; } else if(while_flag == 1) { while_flag = 0; } break; } } } 接收端 /** *描述:nRF2401发送端发送数据 *作者:丁豫 *版本:1.0 */ #ifndef _API_DEF_ - 45 -