uint8 NrfRecStrCheck(uint8 * str, uint8 retryTime)
{
	uint8 relen = 0;
	while (retryTime--)
	{
		relen = nrf_rx(str, DATA_PACKET);
		if (relen != 0)
		{
			return relen;
		}
	}
	return relen;
}
Beispiel #2
0
int main (void)
{
	unsigned char AP;	
	unsigned char i = 0,bit;
	flag = RX;
	AP = 0;
//若为第一个节点则AP = 0,第二个节点AP = 1
	if (AP == 1)
	{
		for (i = 0; i< TX_ADR_WIDTH; i++)
		{
			TX_ADDRESS[i] = TX_AP0[i];
		}
	}
	init_uart (BAUD_SETTING);
	stdout = &mystdout;
	SPI_Init ();
	for (i = 0; i < 32; i++)
	{
		tx_buf[i] = 0xff;
	}
	while (1)
	{
		if (flag==RX)
		{
			bit = nrf_rx (TX_ADDRESS);
			if (bit)
			{
				printf ("the data are: \n");
				for (i = 0; i < 32; i++)
				{
					printf ("%4d", rx_buf[i]);
					rx_buf[i] = '\0';
					if ((i+1) % 10 == 0)
					printf ("\n");
				}
				printf ("\n");
			}
			else 
				printf ("the data error\n");
		}
		else
		{
			nrf_tx (TX_ADDRESS);
		}
		_delay_ms (1000);
	}
}
Beispiel #3
0
//查询是否有接收数据,并进行处理。rebuf 为可供使用的缓冲区
//
nrf_result_e nrf_msg_rx(com_e  *com, uint8 *rebuf)
{
    com_e   comtmp;
    uint32  len;
    uint32  tmplen;
    uint32  relen;                              //接收到的数据长度
    uint8   *buftemp;

    uint32  totallen ;                          //总需要接收包的数目(包的整数倍)
    uint16  tmpcheck;

RE_LOOP:
    buftemp = rebuf;                            //加载起始地址

    relen = nrf_rx(buftemp, DATA_PACKET);       //接收 第一个包
    if(relen == 0)
    {
        //如果是 预校验 失败,那么 肯定可以接收到数据,不会进入此处

        //只有 一开始 进入函数 第一次接收的时候,才出现接收失败

        return NRF_RESULT_RX_NO;                //没接收到数据
    }

    comtmp = (com_e)buftemp[0];
    if(((uint8)comtmp < (uint8)COM_MAX) && (buftemp[1] ==  (uint8)~comtmp) && (comtmp != COM_RETRAN) )
    {
        //校验正确,继续接收剩余 的数据

        totallen = nrf_com_totalsize[comtmp];   //总接收参数

        if(totallen > relen )                   //数据长度 超过 已接收长度
        {
            //需要继续接收
            len = totallen - relen;             //剩余接收的 长度

            //等待接收FIFO里的数据校验正确才接收
            while( !nrf_rx_fifo_check(nrf_com_size[comtmp] + 2 * COM_LEN - relen,&tmpcheck)  );   //等待接收
            if( tmpcheck !=  (uint16)((uint8)~comtmp + (comtmp<<8)))
            {
                goto RE_LOOP;                   //校验失败 ,放弃刚才接收的 第一个 包 (重新接收数据)
            }

            tmplen = relen;
            do
            {
                buftemp += tmplen;              //移动到尚未接收数据的缓冲区
                tmplen = nrf_rx(buftemp, len);  //接收数据
                //relen += tmplen;
                len -= tmplen;
            }
            while(len);
        }

        //校验尾部数据是否正确
        if(
            (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 2] ==   (uint8)~comtmp)
            &&  (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 1] ==   (uint8) comtmp)   )
        {
            *com = comtmp;                          //存储命令

            //对 命令 数据进行 处理
            switch(*com)
            {
            case COM_VAR:
                last_tab = *((uint32 *)&rebuf[COM_LEN]);                                    //读取变量编号
                if(last_tab < VAR_MAX)
                {
                    save_var((var_tab_e)last_tab, *((uint32 *)&rebuf[COM_LEN + sizeof(uint32)]));          //存储 变量
                    var_display(last_tab);                                                  //显示 变量
                }
                else
                {
                    return NRF_RESULT_RX_NOVALID;
                }
                break;
            default:
                break;
            }

            return NRF_RESULT_RX_VALID;             //接收有效数据
        }
    }

    //有接收到数据,但接收数据无效
    return NRF_RESULT_RX_NOVALID;
}
//查询是否有接收数据,并进行处理。rebuf 为可供使用的缓冲区
//
nrf_result_e nrf_msg_rx(com_e  *com, uint8 *rebuf)
{
    com_e   comtmp;
    uint32  len;
    uint32  tmplen;
    uint32  relen;                              //接收到的数据长度
    uint8   *buftemp;
    uint32  tmp;
    uint32  totallen ;                          //总需要接收包的数目(包的整数倍)
    uint16  tmpcheck;

RE_LOOP:
    buftemp = rebuf;                            //加载起始地址

    relen = nrf_rx(buftemp, DATA_PACKET);       //接收 第一个包
    if(relen == 0)
    {
        //如果是 预校验 失败,那么 肯定可以接收到数据,不会进入此处

        //只有 一开始 进入函数 第一次接收的时候,才出现接收失败

        return NRF_RESULT_RX_NO;                //没接收到数据
    }

    comtmp = (com_e)buftemp[0];
    if(((uint8)comtmp < (uint8)COM_MAX) && (buftemp[1] ==  (uint8)~comtmp) && (comtmp != COM_RETRAN) )
    {
        //校验正确,继续接收剩余 的数据

        totallen = nrf_com_totalsize[comtmp];   //总接收参数

        if(totallen > relen )                   //数据长度 超过 已接收长度
        {
            //需要继续接收
            len = totallen - relen;             //剩余接收的 长度

            //等待接收FIFO里的数据校验正确才接收
            while( !nrf_rx_fifo_check(nrf_com_size[comtmp] + 2 * COM_LEN - relen,&tmpcheck)  );   //等待接收
            if( tmpcheck !=  (uint16)((uint8)~comtmp + (comtmp<<8)))
            {
                goto RE_LOOP;                   //校验失败 ,放弃刚才接收的 第一个 包 (重新接收数据)
            }

            tmplen = relen;
            do
            {
                buftemp += tmplen;              //移动到尚未接收数据的缓冲区
                tmplen = nrf_rx(buftemp, len);  //接收数据
                //relen += tmplen;
                len -= tmplen;
            }
            while(len);
        }

        //校验尾部数据是否正确
        if(
            (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 2] ==   (uint8)~comtmp)
            &&  (rebuf[nrf_com_size[comtmp] + 2 * COM_LEN - 1] ==   (uint8) comtmp)   )
        {
            *com = comtmp;                          //存储命令

            //对 命令 数据进行 处理
            switch(*com)
            {
			case COM_ADC:
				struct FLAdc_s * adc = &Nrf_Adc;
				for (uint8 i = 0; i<sizeof(struct FLAdc_s); i++)
				{
					*((uint8 *)adc + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Mpid:
				struct Pid_s * mpid = &Nrf_MPid;
				for (uint8 i = 0; i < sizeof(struct Pid_s); i++)
				{
					*((uint8 *)mpid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Spid:
				struct Pid_s * spid = &Nrf_SPid;
				for (uint8 i = 0; i < sizeof(struct Pid_s); i++)
				{
					*((uint8 *)spid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_Speed:
				struct MotorSpeed_s * speed = &Nrf_Speed;
				for (uint8 i = 0; i < sizeof(struct MotorSpeed_s); i++)
				{
					*((uint8 *)spid + i) = *(rebuf + COM_LEN + i);
				}
				break;

			case COM_TEST:
#ifdef DEBUG
				printf("I got Test Command!\n");
#endif // DEBUG
				break;

			case COM_Ctrl:
				CarCtrl((Ctrl_e)rebuf[COM_LEN]);
				break;

            default:
				ASSERT(true);
                break;
            }

            return NRF_RESULT_RX_VALID;             //接收有效数据
        }
    }

    //有接收到数据,但接收数据无效
    return NRF_RESULT_RX_NOVALID;
}
Beispiel #5
0
/*!
 *  @brief      main函数
 *  @since      v5.0
 *  @note       测试 LED 功能是否正常
                看到的效果是LED0和LED1同时亮灭闪烁
 */
void main()
{
    uint8 buff[DATA_PACKET];
    int relen = 0, i;
    
    
    //======================================================
    //NRF Init
    Init_NRF();
    PIDSetting _pidsettings[PIDSETTING_NUM];
    DIYParameter _diyparameter[DIYPARAMETER_NUM];
    WholeSetting _wholesettings[GLOBAL_SETTING_NUM];
    
    for(i = 0; i < PIDSETTING_NUM; ++i)
    {
        _pidsettings[i].father = 0;
        _pidsettings[i].child = 0;
        _pidsettings[i].Value_P = 0;
        _pidsettings[i].Value_I = 0;
        _pidsettings[i].Value_D = 0;
    }
    for(i = 0; i < DIYPARAMETER_NUM; ++i)
    {
        _diyparameter[i].father = 0;
        _diyparameter[i].child = 0;
        _diyparameter[i].DIY_Value = 0;
    }
    for(i = 0; i < GLOBAL_SETTING_NUM; ++i)
    {
        _wholesettings[i].father = 0;
        _wholesettings[i].child = 0;
        _wholesettings[i].need_Send = 0;
    }
    //NRF_Init End
   
//    led_init(LED1);                         //初始化LED1
    
    while(1)
    {
        //FOR RECEIVE
        relen = nrf_rx(buff,DATA_PACKET);               //等待接收一个数据包,数据存储在buff里
        if(relen != 0)
        {
             NRF_Recieve(buff, _pidsettings, PIDSETTING_NUM, _diyparameter, DIYPARAMETER_NUM, _wholesettings, GLOBAL_SETTING_NUM);
       
//            //在这里设置接收到的设置参数(PID和DIY参数)
//            //========================================================
//            //舵机
//            if(_pidsettings[0].FlagValueChanged == 1)
//            {
//                /*在这里输入你的变量名——下同*/
//                SPEED_CONTROL_P = _pidsettings[0].Value_P;
//                SPEED_CONTROL_I = _pidsettings[0].Value_I;
//                SPEED_CONTROL_D = _pidsettings[0].Value_D;
//                _pidsettings[0].FlagValueChanged = 0;
//                SendPack_Echo(SendBackPID_ACK, Servo_ACK, "ACK");
//            }
//            //========================================================
//            //非直立的电机
//            if(_pidsettings[1].FlagValueChanged == 1)
//            {
//                ANGLE_CONTROL_P = _pidsettings[1].Value_P;
//                ANGLE_CONTROL_I = _pidsettings[1].Value_I;
//                ANGLE_CONTROL_D = _pidsettings[1].Value_D;
//                _pidsettings[1].FlagValueChanged = 0;
//                SendPack_Echo(SendBackPID_ACK, Nonbalance_Motor_ACK, "ACK");
//            }
//            //========================================================
//            //角度
//            if(_pidsettings[2].FlagValueChanged == 1)
//            {
//                ANGLE_CONTROL_P = _pidsettings[2].Value_P;
//                //ANGLE_CONTROL_I = _pidsettings[2].Value_I;
//                ANGLE_CONTROL_D = _pidsettings[2].Value_D;
//                _pidsettings[2].FlagValueChanged = 0;
//                SendPack_Echo(SendBackPID_ACK, Balance_Stand_ACK, "ACK");
//            }
//            //========================================================
//            //速度
//            if(_pidsettings[3].FlagValueChanged == 1)
//            {
//                SPEED_CONTROL_P = _pidsettings[3].Value_P;
//                SPEED_CONTROL_I = _pidsettings[3].Value_I;
//                SPEED_CONTROL_D = _pidsettings[3].Value_D;
//                
////                //参数
////                g_fSpeedControlOut = 0;
////                g_fSpeedControlOutNew = 0;
////                g_fSpeedControlOutOld = 0;
////                fsampleerror1 = 0;
//                _pidsettings[3].FlagValueChanged = 0;
//                SendPack_Echo(SendBackPID_ACK, Balance_Speed_ACK, "ACK");
//                
//                printf("recvi!");
//            }
//            //========================================================
//            //方向
//            if(_pidsettings[4].FlagValueChanged == 1)
//            {
//                DIRECTION_CONTROL_P = _pidsettings[4].Value_P;
//                //DIRECTION_CONTROL_I = _pidsettings[4].Value_I;
//                DIRECTION_CONTROL_D = _pidsettings[4].Value_D;
//                _pidsettings[4].FlagValueChanged = 0;
//                SendPack_Echo(SendBackPID_ACK, Balance_Direction_ACK, "ACK");
//            }
//            //////////////////////////////////////////////////////////
//            //自定义参数一
//            if (_diyparameter[0].FlagValueChanged == 1)
//            {
//                CAR_SPEED_SET = _diyparameter[0].DIY_Value;
//                _diyparameter[0].FlagValueChanged = 0;
//                SendPack_Echo(SendBackDIY_ACK, DIY_Para_1_ACK, "ACK");
//            }
//            //=======================================================
//            //自定义参数二
//            if (_diyparameter[1].FlagValueChanged == 1)
//            {
//                //diyTest = _diyparameter[1].DIY_Value;
//                //_diyparameter[1].FlagValueChanged = 0;
//                //SendPack_Echo(SendBackDIY_ACK, DIY_Para_2_ACK, "ACK");
//            }
//            //=======================================================
//            //========================================
            //对于获取下位机参数的响应,写需要回发的变量类型
            if(_wholesettings[0].need_Send == 1)
            {
                
                printf("I will send\n");
                //****************************************
                //PID参数回发
                //SendPack_PID(SendBackPID, Balance_Stand, ANGLE_CONTROL_P, 0, ANGLE_CONTROL_D, 1, 1); //直立PID
                SendPack_PID(SendBackPID, Balance_Speed, SPEED_CONTROL_P, SPEED_CONTROL_I, SPEED_CONTROL_D, 1, 1); //速度PID
                //SendPack_PID(SendBackPID, Balance_Direction, DIRECTION_CONTROL_P, 0, DIRECTION_CONTROL_D, 1, 1); //方向PID
                //****************************************
                //自定义参数
                SendPack_Short(SendBackDIY,DIY_Para_1, 10, 1, 1);
                SendPack_Short(SendBackDIY,DIY_Para_2, 100, 1, 1);
                SendPack_Short(SendBackDIY,DIY_Para_3, 10.2, 1, 1);
               
                _wholesettings[0].need_Send = 0;
            }     
          
              //========================================================
              //========================================================
              //紧急停车!!!!!!!!!!!
              if(_wholesettings[1].need_Send == 1)
              {
                  //关闭需要关闭的中断
                  //disable_irq(PORTE_IRQn);
                  
//                  //关闭输出
//                  ftm_pwm_duty(FTM0, FTM_CH0, 1000);
//                  ftm_pwm_duty(FTM0, FTM_CH1, 1000);
//                  ftm_pwm_duty(FTM0, FTM_CH2, 1000);
//                  ftm_pwm_duty(FTM0, FTM_CH3, 1000);
                  
                  SendPack_Echo(9, 1, "ACK");
              }
              //========================================================
        }
        
        //=======================================================
        //参数发送区域
        //=======================================================
        //摄像头图像
        //SendPack_Camera(Camera, Camera_1, imgbuff, CAMERA_SIZE);
        //****************************************
        //CCD图像
        //SendPack_CCD(2, 1, (uint8_t *)&CCD_BUFF[0], TSL1401_SIZE, 1, 1);
        //****************************************
        //实时参数
        //SendPack_Short(Electricity,Electricity_1, /*你的变量名*/ 0, 1, 0);
        //****************************************
        //实时参数
        SendPack_Short(RealTime,RealTime_1, (int)1, 1, 1);
        SendPack_Short(RealTime,RealTime_2, (int)2, 1, 1);
        SendPack_Short(RealTime,RealTime_3, (int)22, 1, 1);
        SendPack_Short(RealTime,RealTime_4, (int)33, 1, 1);
        SendPack_Short(RealTime,RealTime_5, (int)45, 1, 1);
        SendPack_Short(RealTime,RealTime_6, (int)33, 1, 1);
        //****************************************
        //========================================
        DELAY_MS(10);
    }
}