⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LWIP在STM32裸机上的移植
💻 C
📖 第 1 页 / 共 5 页
字号:
				TxMessage.Data[0] = (InputState[i][7]<<4)|(i-15);//高4位信号格式,低4位数据包编号
				TxMessage.Data[1] = InputState[i][8];
				for(h=2;h<8;h++)
					TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}

			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;	
			TxMessage.StdId = 0x501;
			for(h=0,i=16;i<20;i++)
			{
				TxMessage.Data[h++] = TempKeyState[i];				
				KeyDataBK[i] = TempKeyState[i];	
				if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
					KeySetBegin = 1;				
			}
			while(((CAN1->TSR>>26)& 0x07) == 0);					
			CAN_Transmit(CAN1, &TxMessage);
		}

		//刷新"效果"按键(即按下推子某个"设置"键时,若已经设置效果,则对应的"效果"键灯亮)
		if(KeySetBegin)
		{
			KeySetBegin = 0;
			KeySetDataBK = 0;

			for(i=0;i<20;i++)
			{	
				if(((TempKeyState[i]>>3)& 0x01) == 0x01)  	//是否按下"设置"按键
				{	
//					printf("TempKeyState[%d] = 0x%X\n",i,TempKeyState[i]);
							
					EfctKeyBK = 0;					//"效果"键清零
					KeySetDataBK |= 1<<i;			//哪一个"设置"键有效
								
					if(EffectAddr[i][1] == 1)		//效果一
						EfctKeyBK |= 1<<0;	
					else if(EffectAddr[i][1] == 2)	//效果二
						EfctKeyBK |= 1<<1;
					else if(EffectAddr[i][1] == 3)	//效果三
						EfctKeyBK |= 1<<2;
					else if(EffectAddr[i][1] == 4)	//效果四
						EfctKeyBK |= 1<<3;
					else
						continue;

					break;
				}
			}
		}

		//输入板卡地址
		I2C_EE_BufferRead(ReadEEPData,EEP_Input_Address,10);	
		for(i=0,h=0;i<10;i++)
		{
			if(ReadEEPData[i])
			{
				InputAddr[h] = ((ReadEEPData[i]<<8)|(ReadEEPData[i+1]))& 0x7FF;
//				printf("(0).InputAddr[%d] = 0x%X\n",h,InputAddr[h]);
				i++;
				h++;	
			}
			else
			{
				i++;
				h++;
			}
		}

		//输出板卡地址
		I2C_EE_BufferRead(ReadEEPData,EEP_Output_Address,10);	
		for(i=0,h=0;i<10;i++)
		{
			if(ReadEEPData[i])
			{
				OutputAddr[h] = ((ReadEEPData[i]<<8)|(ReadEEPData[i+1]))& 0x7FF;
//				printf("(0).OutputAddr[%d] = 0x%X\n",h,OutputAddr[h]);
				i++;
				h++;	
			}	
			else
			{	
				i++;
				h++;
			}	
		}	
		I2C_EE_ClearWrite(EEP_Tuizi_Address,48);	//清空区域(EEP_Tuizi_Input_Output_Address)
	}	
	 
	for(i=0;i<12;i++) 			//(协议二:0xAB)(默认值:-40)
		RxOutdBData[i] = 0xD8;
	 
	GPIO_ResetBits(GPIOE, GPIO_Pin_0);
	Delay(20000);
	GPIO_SetBits(GPIOE, GPIO_Pin_0);
	Delay(40000);
									
	I2C_ByteWrite(0x20,0x00,0x00);
	I2C_ByteWrite(0x20,0x01,0x88);
	I2C_ByteWrite(0x20,0x02,0x02);
	I2C_ByteWrite(0x20,0x03,0x50);
	I2C_ByteWrite(0x20,0x04,0x80);
	I2C_ByteWrite(0x20,0x05,0x85);
	I2C_ByteWrite(0x20,0x06,0x16);  
	    
	while(1)
	{
	//=============================== 远程帧 ================================//

		//推子模块初始化远程帧
		if(startflg1>0)	
		{
			if(TuiziAddr[0] != 0)
			{		
				printf("\rTuiziAddr[0] = 0x%X\n",TuiziAddr[0]);	
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 8;	
				TxMessage.StdId = TuiziAddr[0];	//0x100
				for(i=0;i<4;i++)
				{	
					TxMessage.Data[0] = (InputState[i][7]<<4)|(i+1); //高4位信号格式,低4位数据包编号
					TxMessage.Data[1] = InputState[i][8];			 //输入模块地址
					for(h=2;h<8;h++)
						TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
					while(((CAN1->TSR>>26)& 0x07) == 0);
					CAN_Transmit(CAN1, &TxMessage);
				}
				//=== 初始化上一时刻按键状态 ===//
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;	
				TxMessage.StdId = 0x101;
				for(i=0;i<4;i++)
				{	
					TxMessage.Data[i] = TempKeyState[i];				
					KeyDataBK[i] = TempKeyState[i];	
					if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
						KeySetBegin = 1;				
				}	
				while(((CAN1->TSR>>26)& 0x07) == 0);					
				CAN_Transmit(CAN1, &TxMessage);							
				
				startflg1 &= ~(1<<0);
			}	
			if(TuiziAddr[1] != 0)		//地址2推子
			{	
				printf("\rTuiziAddr[1] = 0x%X\n",TuiziAddr[1]);
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 8;
				TxMessage.StdId = TuiziAddr[1];
				for(i=4;i<8;i++)
				{	
					TxMessage.Data[0] = (InputState[i][7]<<4)|(i-3); //高4位信号格式,低4位数据包编号
					TxMessage.Data[1] = InputState[i][8];			 //输入模块地址
					for(h=2;h<8;h++)
						TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
					while(((CAN1->TSR>>26)& 0x07) == 0);
					CAN_Transmit(CAN1, &TxMessage);
				}	

				//=== 初始化上一时刻按键状态 ===//
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;	
				TxMessage.StdId = 0x201;
				for(h=0,i=4;i<8;i++)
				{					
					TxMessage.Data[h++] = TempKeyState[i];				
					KeyDataBK[i] = TempKeyState[i];	
					if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
						KeySetBegin = 1;				
				}		
				while(((CAN1->TSR>>26)& 0x07) == 0);					
				CAN_Transmit(CAN1, &TxMessage);

				startflg1 &= ~(1<<1);
			}
			if(TuiziAddr[2] != 0)		//地址3推子
			{
				printf("\rTuiziAddr[2] = 0x%X\n",TuiziAddr[2]);
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 8;
				TxMessage.StdId = TuiziAddr[2];
				for(i=8;i<12;i++)
				{
					TxMessage.Data[0] = (InputState[i][7]<<4)|(i-7); //高4位信号格式,低4位数据包编号
					TxMessage.Data[1] = InputState[i][8];
					for(h=2;h<8;h++)
						TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
					while(((CAN1->TSR>>26)& 0x07) == 0);
					CAN_Transmit(CAN1, &TxMessage);
				}

				//=== 初始化上一时刻按键状态 ===//
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;	
				TxMessage.StdId = 0x301;
				for(h=0,i=8;i<12;i++)
				{
					TxMessage.Data[h++] = TempKeyState[i];				
					KeyDataBK[i] = TempKeyState[i];
					if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
						KeySetBegin = 1;					
				}
				while(((CAN1->TSR>>26)& 0x07) == 0);					
				CAN_Transmit(CAN1, &TxMessage);

				startflg1 &= ~(1<<2);
			}
			if(TuiziAddr[3] != 0)		//地址4推子
			{
				printf("\rTuiziAddr[3] = 0x%X\n",TuiziAddr[3]);
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 8;	
				TxMessage.StdId = TuiziAddr[3];
				for(i=12;i<16;i++)
				{
					TxMessage.Data[0] = (InputState[i][7]<<4)|(i-11);//高4位信号格式,低4位数据包编号
					TxMessage.Data[1] = InputState[i][8];
					for(h=2;h<8;h++)
						TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
					while(((CAN1->TSR>>26)& 0x07) == 0);
					CAN_Transmit(CAN1, &TxMessage);
				}

				//=== 初始化上一时刻按键状态 ===//
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;	
				TxMessage.StdId = 0x401;
				for(h=0,i=12;i<16;i++)
				{
					TxMessage.Data[h++] = TempKeyState[i];				
					KeyDataBK[i] = TempKeyState[i];
					if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
						KeySetBegin = 1;					
				}
				while(((CAN1->TSR>>26)& 0x07) == 0);					
				CAN_Transmit(CAN1, &TxMessage);
				
				startflg1 &= ~(1<<3);
			}
			if(TuiziAddr[4] != 0)		//地址5推子
			{
				printf("\rTuiziAddr[4] = 0x%X\n",TuiziAddr[4]);
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 8;	
				TxMessage.StdId = TuiziAddr[4];
				for(i=16;i<20;i++)
				{
					TxMessage.Data[0] = (InputState[i][7]<<4)|(i-15);//高4位信号格式,低4位数据包编号
					TxMessage.Data[1] = InputState[i][8];
					for(h=2;h<8;h++)
						TxMessage.Data[h] = InputState[i][h-1];		 //6字节汉字码
					while(((CAN1->TSR>>26)& 0x07) == 0);
					CAN_Transmit(CAN1, &TxMessage);
				}

				//=== 初始化上一时刻按键状态 ===//
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;	
				TxMessage.StdId = 0x501;
				for(h=0,i=16;i<20;i++)
				{
					TxMessage.Data[h++] = TempKeyState[i];				
					KeyDataBK[i] = TempKeyState[i];
					if(((TempKeyState[i]>>3)& 0x01) == 0x01) //"设置"键是否有效
						KeySetBegin = 1;					
				}
				while(((CAN1->TSR>>26)& 0x07) == 0);					
				CAN_Transmit(CAN1, &TxMessage);

				startflg1 &= ~(1<<4);
			}

			//刷新"效果"按键(即按下推子某个"设置"键时,若已经设置效果,则对应的"效果"键灯亮)
			if(KeySetBegin)
			{
				KeySetBegin = 0;
				KeySetDataBK = 0;

				for(i=0;i<20;i++)
				{	
					if(((TempKeyState[i]>>3)& 0x01) == 0x01)  	//是否按下"设置"按键
					{	
//						printf("TempKeyState[%d] = 0x%X\n",i,TempKeyState[i]);
						
						EffectSetFlg = 1; 				//"效果"设置标记(发送效果)
							
						EfctKeyBK = 0;					//"效果"键清零
						KeySetDataBK |= 1<<i;			//哪一个"设置"键有效
										
						if(EffectAddr[i][1] == 1)		//效果一
							EfctKeyBK |= 1<<0;	
						else if(EffectAddr[i][1] == 2)	//效果二
							EfctKeyBK |= 1<<1;
						else if(EffectAddr[i][1] == 3)	//效果三
							EfctKeyBK |= 1<<2;
						else if(EffectAddr[i][1] == 4)	//效果四
							EfctKeyBK |= 1<<3;
						else
							continue;

						break;
					}
				}
//				if(!FaceKeyBK)FaceKeyBK |= 0x01;//若"界面"按键不亮,则"主页"按键默认亮
				if(!FaceKeyBK)
				{
					FaceKeyBK |= 0x01;				//若"界面"按键不亮,则"主页"按键默认亮
					FaceKeySet = FaceKeyBK & 0x0F;	//总控模块界面按键功能
				}
				TxMessage.RTR = CAN_RTR_DATA; 	//发送主控模块按键状态
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 4;
				TxMessage.StdId = 0x011;
				TxMessage.Data[0] = FaceKeyBK;	//FaceKeyBK | 0x01
				TxMessage.Data[1] = EfctKeyBK;
				TxMessage.Data[2] = ScenKeyBK;
				TxMessage.Data[3] = TalkKeyBK;
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);
			}
		}

		//输入模块初始化远程帧
		if(InputFlag>0)
		{	
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 1;
//			TxMessage.Data[0] = 0xFA;
			if(InputAddr[0] != 0)
			{
				printf("\rInputAddr[0] = 0x%X\n",InputAddr[0]);
				TxMessage.Data[0] = (AddVoltage[0][0]|(AddVoltage[0][1]<<1)|
									(AddVoltage[0][2]<<2)|(AddVoltage[0][3]<<3))& 0x0F;		
				TxMessage.StdId = InputAddr[0];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				InputFlag &= ~(1<<0);		//0xFE;
			}
			if(InputAddr[1] != 0)
			{
				printf("\rInputAddr[1] = 0x%X\n",InputAddr[1]);
				TxMessage.Data[0] = (AddVoltage[1][0]|(AddVoltage[1][1]<<1)|
									(AddVoltage[1][2]<<2)|(AddVoltage[1][3]<<3))& 0x0F;	
				TxMessage.StdId = InputAddr[1];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				InputFlag &= ~(1<<1);		//0xFD;
			}
			if(InputAddr[2] != 0)
			{
				printf("\rInputAddr[2] = 0x%X\n",InputAddr[2]);
				TxMessage.Data[0] = (AddVoltage[2][0]|(AddVoltage[2][1]<<1)|
									(AddVoltage[2][2]<<2)|(AddVoltage[2][3]<<3))& 0x0F;	
				TxMessage.StdId = InputAddr[2];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				InputFlag &= ~(1<<2);		//0xFB;
			}
			if(InputAddr[3] != 0)
			{
				printf("\rInputAddr[3] = 0x%X\n",InputAddr[3]);
				TxMessage.Data[0] = (AddVoltage[3][0]|(AddVoltage[3][1]<<1)|
									(AddVoltage[3][2]<<2)|(AddVoltage[3][3]<<3))& 0x0F;	
				TxMessage.StdId = InputAddr[3];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				InputFlag &= ~(1<<3);		//0xF7;
			}
			if(InputAddr[4] != 0)
			{
				printf("\rInputAddr[4] = 0x%X\n",InputAddr[4]);
				TxMessage.Data[0] = (AddVoltage[4][0]|(AddVoltage[4][1]<<1)|
									(AddVoltage[4][2]<<2)|(AddVoltage[4][3]<<3))& 0x0F;	
				TxMessage.StdId = InputAddr[4];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				InputFlag &= ~(1<<4);		//0xEF;
			}
		}

		//输出模块初始化远程帧
		if(OutputFlag>0)
		{		
			TxMessage.RTR = CAN_RTR_DATA;
			TxMessage.IDE = CAN_ID_STD;
			TxMessage.DLC = 4;
			if(OutputAddr[0] != 0)
			{
				printf("\rOutputAddr[0] = 0x%X\n",OutputAddr[0]);
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i];
				TxMessage.StdId = OutputAddr[0];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				OutputFlag &= ~(1<<0);
			}
			if(OutputAddr[1] != 0)
			{
				printf("\rOutputAddr[1] = 0x%X\n",OutputAddr[1]);
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+4];	
				TxMessage.StdId = OutputAddr[1];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				OutputFlag &= ~(1<<1);
			}
			if(OutputAddr[2] != 0)
			{
				printf("\rOutputAddr[2] = 0x%X\n",OutputAddr[2]);
				for(i=0;i<4;i++)
					TxMessage.Data[i] = OutputSet[i+8];	
				TxMessage.StdId = OutputAddr[2];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				OutputFlag &= ~(1<<2);
			}
			if(OutputAddr[3] != 0)
			{
				printf("\rOutputAddr[3] = 0x%X\n",OutputAddr[3]);
				for(i=0;i<4;i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -