CSN_OUT = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status byte for(byte_ctr=0;byte_ctr pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01 CSN_OUT = 1; // Set CSN high again return(status); // return nRF24L01 status byte } //寄存器 批量写 函数 uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) { uchar status,byte_ctr; CSN_OUT = 0; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status byte Delay_us(1); for(byte_ctr=0; byte_ctr CSN_OUT = 1; // Set CSN high again return(status); // return nRF24L01 status byte } //接收模式 void RX_Mode(void) { CE_OUT = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 CE_OUT = 1; // 拉高CE启动接收设备 } //发送模式 26 //void TX_Mode(uchar * BUF) void TX_Mode() { CE_OUT = 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_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03); 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); // 数据传输率2Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 // SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO CE_OUT = 1; } void TX_Data(uchar *BUF) { SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO //Delay_us(100); // // while(IRQ_IN); status=SPI_RW_Reg(WRITE_REG+STATUS,0xff); } while(1) { PORTD_PCR4 |= PORT_PCR_IRQC(9); //开行中断 while(1) { 27 if( (GPIOC_PDIR&0X10)==0x10) { if( (system_time > 4000) && ( (GPIOC_PDIR&0X80)==0x80)) //第4个拨码开关 { check_end_line=1; //开始检测起跑线,终点线 } else { check_end_line=0; //不用检测起跑线,终点线 End_Flag = 0;//不停车 StartDelay=0; } if(SPEED_PID_FLAG == 1 && start_flag != 0 ) //等待延时结束和软启动结束信号,启动PID //控制速度 //if(start_flag != 0 ) //等待延时结束和软启动结束信号,启动PID //控制速度 { if(Rx_stop == 0) { ZMotorPWM=0; FMotorPWM=0; } else if(Rx_stop == 2) //退车 { SteerPWM=Center; ZMotorPWM=0; FMotorPWM=1700; } else if(Rx_stop == 1) { if( (GPIOC_PDIR&0X80)!=0x80 )//|| system_time < 1600) { End_Flag = 0; StartDelay=0; StartFlag = 0; } //清除停车标志,无需停车 if(End_Flag != 0) { SV_Mc = 0; SV_McN = 0; 28 if(speed > 10) { if(end_line_stop_delay == 0) { end_line_stop_delay = system_time; } if( (end_line_stop_delay != 0) && (system_time - end_line_stop_delay > (260 - speed)/100*10/2) ) { StopControl_end_line(3 - speed/10); } } else { STC = 0; FMotorPWM = 0;//滑行 ZMotorPWM = 0; } } else { if(speed_class == 1) { SpeedControl_PID_XLL_ZS1(); } else if(speed_class == 2) { SpeedControl_PID_XLL_ZS2(); } else if(speed_class == 3) { SpeedControl_PID_XLL_ZS3(); } else if(speed_class == 4) { SpeedControl_PID_XLL_ZS4(); } ///////以下的4档带定时 else if(speed_class == 5) { SpeedControl_PID_XLL_ZS1(); } 29 else if(speed_class == 6) { SpeedControl_PID_XLL_ZS2(); } else if(speed_class == 7) { SpeedControl_PID_XLL_ZS3(); } else if(speed_class == 8) { SpeedControl_PID_XLL_ZS4(); } } } SPEED_PID_FLAG=0; } Get_Speed_Class(); //读取控制档,控制方案 if(start_flag == 0 && StartFlag == 0) { if(speed_class <= 4) //前4档(1,2,3,4)无定时 { GO_GO(); //等待延时结束和软启动结束信号,启动PID } else { GO_GO_PIT(); //后面4档(5,6,7,8)带定时 } } if((process_count > save_count) ) //如果处理行大于存储行,就开始提取黑线,因为是倒序存储,所以也要倒序处理:从近处开始存储和处理start_flag=1;&& (start_flag != 0) { Process(); //light_change(Light_Run_PORT,Light_Run4);//指示灯的亮、暗状态切换 } 30 } else { Get_Speed_Class(); //读取控制档,控制方案 check_end_line=0; end_line_stop_delay = 0; End_Flag = 0;//不停车 Rx_stop = 1; StartDelay=0; SaiDaoType = 0; stop_control_flag=0; stop_time=0; stop_delay_time=0; StartFlag = 0; system_time //系统时间初始化清零,3秒启动 start_flag=0; //回正&停车 SteerPWM=Center; ZMotorPWM=0; FMotorPWM=0; //开始键盘检测 JianPan_Use(); //清楚和初始化变量 Clear_and_Set_Value( ); //uart_speed();//有线串口发送速度值,调PID } } //while 2 } //while 1 } 31 = 0;