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

📄 my_2000-0618.c

📁 用C8051F单片机控制AMBE2000读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
            		Length = 0;
            		CommRecvBuff[Length++] = temp;
        		}
        	else if (CommRecvFlg)	 //如果接收完包头  
				{
	            	CommRecvBuff[Length++] = temp;		 //把接收到的值传给接收缓冲器
	           		 if(Length == MaxLength)		 //接收完判断接收数据的几种状态
		     			{ // have receive a frame successfully
		                	if(CommRecvBuff[0] == 0x80)		//如果是正常数据
		                 		{
						    		Cpld2_cpu_DataFlg = 1;	   //此位在主程序里允许往 编码器里送数
								//	P3 ^=0xc0;		   // ?????
				   				}
		                	if((CommRecvBuff[0] == 0xFF) && (CommRecvBuff[1] == 0x48) && (CommRecvBuff[2] == 0x40))
		                 		{  
						  			//CmdCmx2000LoopFlg = 1;
						 			CmdCmx2000StartFlg = 1;	   //声码启动指令
									 ceshi=0;
									 
							 
				  				}
		                	if((CommRecvBuff[0] == 0xFF) && (CommRecvBuff[1] == 0x48) && (CommRecvBuff[2] == 0x41))
		                		{    
									CmdCmx2000LoopFlg= 1;	//声码自环指令
						 			//CmdCmx2000StartFlg = 1;
				  				}
		               		 CommRecvFlg = 0;
		                //TR1 = 0; // stop timer
		                	Length = 0;
		                	MaxLength = 0; 
		                //CommEnableInterrupt(FALSE); // disable UART1 interrupt
	            	   }
        		}
    	}


    EA=1;    //使能中断
        
}

void init2K(void)
{
	rx2KProcess = 0;
	tx2kProcess = 3;/*等待缓冲区数据*/
	rx2KCnt = 17;/*16个数据位+1个STRB使能位*/
	tx2KCnt = 17;/*16个数据位+1个STRB使能位*/
	rx2KCntB = 24;
	tx2KCntB = 12;
	CHAN_S_STRB = 1;/*读写选通无效*/
	CHAN_R_STRB = 1;
	timer2Init();	//T2初始化
}
void isrTimer2(void) interrupt 5	//和2000读写的函数
{

	/*产生2400读写时钟脉冲*/
	if(phase == 0)
	{
		phase = 1;
		CHAN_CLK = 1;
	}
	else
	{
	 	phase = 0;
		CHAN_CLK = 0;
	}

	if(phase == 1)/*下降沿采数*/
	{
		if(encoder_recv==0)	   //只有把接收到的信息发完才能为0
		{
			if(rx2KProcess == 0)/*Receive 16bit one by one*/
			{/*receive one bit*/
				
				switch(rx2KCnt)
				{
					case 17:
						CHAN_S_STRB = 0;/*给出STRB信号*/
						rx2KCnt--;
						break;
					case 0:
						CHAN_S_STRB = 1;/*撤销STRB信号*/
						rx2KProcess = 1;/*进入到下一个状态*/
						rx2KCntB--;/*已经接收了一个16位*/
						rx2KCnt = 17;/*重新赋值*/
						
						break;
					default:
					{
						if(CHAN_TXD == 1)
							buffer2k[24  - rx2KCntB]|= 0x0001 << (rx2KCnt - 1);	 //	rx2KCntB初值是24
						else
							buffer2k[24  - rx2KCntB] &= ~(0x0001 << (rx2KCnt - 1));
										
						rx2KCnt--;
						break;
					}	
				}
			}
		
			if(rx2KProcess == 1)/*重复接收接下来的23字*/
			{
				if(rx2KCntB == 23)/*除首次接收外,需要判断第一个16位是不是有效的*/
				{
					if(pBuffer2kHead != buffer2k[0])
					{
						rx2KCntB = 24;
					     rx2KProcess = 0;/*是无效包,继续接收*/
					 }
				}
				else
				{
					/*没接收完一帧?*/
					if(rx2KCntB > 0)
					{
						rx2KProcess = 0;/*进入接收下一个16bit状态*/
					}
					else
					{
						/*接收完一个帧,延时20ms,准备接收下一帧*/
						rx2KProcess = 2;
						/*下次延时20ms*/
				
					}
				}
			}
		
			if(rx2KProcess == 2)/*延时状态*/
			{
			//	if(++clockCntR == 500)/*计数500次,55K频率,每中断一次时间小于19us,所以1000次中断延时小于20ms*/
					rx2KProcess = 0;
					encoder_recv=1;   //从2000接收完标志位	  在发送给CPLD结束后置0
			}
		}	
	
	}

	if(phase == 1)/*上升沿给2000送数*/
	{
		/*tx process*/
		if(TX_2000_BIT==0)	   //只有在接到CPLD的值附给发送2000数据缓冲区里后
		{
			if(tx2kProcess == 0)/*发送数据 Transmit 16bit one by one*/
			{
				
				switch(tx2KCnt)
				{
					case 17:
						CHAN_R_STRB = 0;/*给出STRB信号*/
	
					//	sendBuf = *(pBuffer2kTail + 12 + (12  - tx2KCntB));
						if(sendBuf[12  - tx2KCntB] & 0x8000)
							CHAN_RXD = 1;
						else
							CHAN_RXD = 0;
						sendBuf[12  - tx2KCntB] *= 2;
	
						tx2KCnt--;
						break;
					case 0:
						CHAN_R_STRB = 1;/*撤销STRB信号*/
						tx2kProcess = 1;/*进入到下一个状态*/
						tx2KCntB--;/*已经发送了一个16位*/
						tx2KCnt = 17;/*重新赋值*/
						break;
					default:
					{
						if(sendBuf[12  - tx2KCntB] & 0x8000)
							CHAN_RXD = 1;
						else
							CHAN_RXD = 0;
						sendBuf[12  - tx2KCntB] *= 2;
						tx2KCnt--;
	
						break;
					}	
				}
				
			}
			if(tx2kProcess == 1)/*重复发送接下来的11字*/
			{
		
				if(tx2KCntB > 0)
				{
					tx2kProcess = 0;
				}
				else
				{
				
					/*发送完一个帧,延时20ms,准备接收下一帧*/
					tx2kProcess = 3;
				}
			}
			
			if(tx2kProcess == 2)/*延时状态*/
			{
				//if(++clockCntS == 500)/*计数500次,55K频率,每中断一次时间小于19us,所以1000次中断延时小于20ms*/
					tx2kProcess = 3;
					TX_2000_BIT=1;					//CPU给2000发送结束标志
					
			}
	
		
			if(tx2kProcess == 3)/*中转状态*/
			{
				tx2KCntB = 12;

				tx2kProcess = 4;/*先发送包头*/
			}	  
		
			/*tx process*/
			if(tx2kProcess == 4)/*先发包头 Transmit 16bit one by one*/
			{
				switch(tx2KCnt)
				{
					case 17:
						CHAN_R_STRB = 0;/*给出STRB信号*/
						if(PreLoad2k[12  - tx2KCntB] & 0x8000)
							CHAN_RXD = 1;
						else
							CHAN_RXD = 0;
						PreLoad2k[12  - tx2KCntB] *= 2;
	
						tx2KCnt--;
						break;
					case 0:
						CHAN_R_STRB = 1;/*撤销STRB信号*/
						tx2kProcess = 5;/*进入到下一个状态*/
						tx2KCntB--;/*已经发送了一个16位*/
						tx2KCnt = 17;/*重新赋值*/
						break;
					default:
					{
						if(PreLoad2k[12  - tx2KCntB] & 0x8000)
							CHAN_RXD = 1;
						else
							CHAN_RXD = 0;
						PreLoad2k[12  - tx2KCntB] *= 2;
	
						tx2KCnt--;
						break;
					}	
				}
			}
			if(tx2kProcess == 5)
			{
				if(tx2KCntB > 0)
				{
					tx2kProcess = 4;/*重复发送接下来的11个字的包头*/
				}
				else
				{
					/*包头发送完毕,开始发送数据*/
					tx2kProcess = 0; 
					tx2KCntB = 12;
				}
			}
		}
	}

   	TF2H = 0;// Reset Interrupt
}
void codecConf()
{
	 	#pragma asm
		MOV R6,#02H
		MOV R7,#53H
		ACALL TLV320CONFIG;

		MOV R6,#04H
		MOV R7,#08H
		ACALL TLV320CONFIG;

		MOV R6,#06H
		MOV R7,#01H
		ACALL TLV320CONFIG;

		MOV R6,#08H
		MOV R7,#0e9H
		ACALL TLV320CONFIG;
	#pragma endasm
	

	#pragma asm
TLV320CONFIG:			MOV		A,R6
						MOV		R5,#8
						MOV		R4,#8
_TLV320CONFIG_WRITE_H:	RLC		A
						JNB		CODEC_SCLK,$
						MOV		CODEC_DCSI,C
						JB		CODEC_SCLK,$
						DJNZ	R5,_TLV320CONFIG_WRITE_H
						MOV		A,R7
_TLV320CONFIG_WRITE_L:	RLC		A
						JNB		CODEC_SCLK,$
						MOV		CODEC_DCSI,C
						JB		CODEC_SCLK,$
						DJNZ	R4,_TLV320CONFIG_WRITE_L
						JNB		CODEC_SCLK,$
						SETB	CODEC_DCSI

						JB		CODEC_SCLK,$
						JNB		CODEC_SCLK,$
						JB		CODEC_SCLK,$
						JNB		CODEC_SCLK,$
						JB		CODEC_SCLK,$
						JNB		CODEC_SCLK,$
						JB		CODEC_SCLK,$
						JNB		CODEC_SCLK,$
						JB		CODEC_SCLK,$
						JNB		CODEC_SCLK,$
						JB		CODEC_SCLK,$
						RET
	#pragma endasm
}
main()
{
	CODEC_DCSI = 1;	  //给C10 写指令用
	 ceshi=1;   //测试用

	/*初始化*/
	pca0Init();/*关看门狗*/
	PORT_Init();/*初始化端口*/
	OSCILLATOR_Init();/*切换到外部晶体*/
	Interrupts_Init();
//	clkmulInit();

	 Timer_Init(); //T1初始

	/*10&2K初始化*/
	SLEEP_2K = 0; //置高激活  为休眠状态
	RST_2K = 0;
	delay();
	RST_2K = 1;
	delay();

	 codecConf();	  //配置CODEC-DCSI  CODEC-SCLK

	 UART_Init();  //串口初始化

	 LINK_INTP = 0;//在主程序里要处理
	 KEY_RESET=1;//在主程序里要处理
	  
	 InitComm();   // 和CPLD通信端口初始化
	 init2K();   //初始化和2000通信的函数的各项参数值 和 T2的初始值
	 rxRecFirst();   //检测ERF 并打开TR2
	
	 while(1)
	 {
	 	CommRecvData();		 //置接收标志位	CommRecvingFlg=1 接受有效 主要是把	Length请零
		if(CmdCmx2000StartFlg )//果CPLD传给CPU数据FF 48 40 启动码
			{ 
		 		if(Cpld2_cpu_DataFlg)	  //如果在接收完CPLD传给CPU的数据	 接收完包 0X80 的以后所有数此位为1
					{
				   		if(TX_2000_BIT)	 //	往2000传送结束才会为1
				   			{
								unsigned char i;
								sendBuf[0]=(unsigned int)CommRecvBuff[0]<<8+(unsigned int)CommRecvBuff[1];
								sendBuf[1]=(unsigned int)CommRecvBuff[2]<<8+(unsigned int)CommRecvBuff[3];
								sendBuf[2]=(unsigned int)CommRecvBuff[4]<<8+(unsigned int)CommRecvBuff[5];
								sendBuf[3]=(unsigned int)CommRecvBuff[6]<<8+(unsigned int)CommRecvBuff[7];
								sendBuf[4]=(unsigned int)CommRecvBuff[8]<<8+0x0000;
				   				for(i=0;i<8;i++)
								{
									sendBuf[4+i]=0x0000;
								}
								EA=0;
		           				Cpld2_cpu_DataFlg = 0;
								EA=1;
								TX_2000_BIT=0;  //CPU可以传递给2000
				  			}   
		       		 }
			   }
        if(encoder_recv)	//CPU从2000接收完
			{			
            	if(!CmdCmx2000LoopFlg)	//如果2000不是循环	 使用状态
					{
                		CommSend2Cpld2();	//是CPU发给CPLD数据的函数  CPU给CPLD发送数据完 encoder_recv = 0             
            		}
            	else		 //自环  调试用
					{
						unsigned char i;
						if(TX_2000_BIT)	 //	往2000传送结束才会为1
						{
	               			 for(i = 0; i < 12; i++)
							 {
							 	sendBuf[i]=buffer2k[11+i];
	                   		  }
							TX_2000_BIT=0;
						}
						encoder_recv = 0;	//这时CPU才能接2000的数据 
           			 }
       		}
    
       
     
      if(!KEY_RESET)
	  		{
   				timer1_counter = 4; //10ms x 1 = 10ms delay to debounce 
		   		 timer1_expired = 0;
		   		 TR1 = 1;
		       	while(!timer1_expired);
		    	timer1_expired = 0;
           		 if(!KEY_RESET); // soft reset
                RSTSRC = 0x10; //产生一次系统复位
       		 }
    
        if(LINK_INTP)
			{
            	timer1_counter = 4; //10ms x 1 = 10ms delay to debounce 
		   		 timer1_expired = 0;
		    	TR1 = 1;
		    	while(!timer1_expired);
		    	timer1_expired = 0;
            	if(LINK_INTP)
					{ 
							RST_2K = 0;    
            		}
        	}

		}
}


	

⌨️ 快捷键说明

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