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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
     *   初始化驱动
     */
    ucDevice = 0;
    GdpData.ulSectorIndex = 0;
    GdpData.uiNSectors    = 0;
    GdpData.pvRsvdForLow  = &ucDevice;
    GdpData.pucBuf        = 0;
    usRet = ataCommand(DISK_DRIVE_OPEN,&GdpData);                       /*  初始化驱动                  */ 

    if ((usRet == DISK_READ_NOT_OK)                                     /*  驱动返回出错                */
      ||(usRet == DISK_WRITE_NOT_OK)
      ||(usRet == DISK_INIT_NOT_OK)
      ||(usRet == DISK_FALSE)
      ||(usRet == BAD_DISK_COMMAND) ) {
        while (1);  
    }
    
    /*
     *   检查设备是否存在
     */
    ucDevice = 0;
    GdpData.ulSectorIndex = 0;
    GdpData.uiNSectors    = 0;
    GdpData.pvRsvdForLow  = &ucDevice;
    GdpData.pucBuf        = 0;
    usRet = ataCommand(DISK_CHECK_DEVICE,&GdpData);                     /*  初始化驱动                  */ 

    if ((usRet == DISK_READ_NOT_OK)                                     /*  驱动返回出错                */
      ||(usRet == DISK_WRITE_NOT_OK)
      ||(usRet == DISK_INIT_NOT_OK)
      ||(usRet == DISK_FALSE)
      ||(usRet == BAD_DISK_COMMAND) ) {
        while (1);  
    }
        
    /*
     *   初始化设备
     */ 
    ucDevice = 0;
    GdpData.ulSectorIndex = 0;
    GdpData.uiNSectors    = 0;
    GdpData.pvRsvdForLow  = &ucDevice;
    GdpData.pucBuf        = 0;
    usRet = ataCommand(DISK_DEVICE_OPEN,&GdpData);                      /*  初始化驱动                  */ 

    if ((usRet == DISK_READ_NOT_OK)                                     /*  驱动返回出错                */
      ||(usRet == DISK_WRITE_NOT_OK)
      ||(usRet == DISK_INIT_NOT_OK)
      ||(usRet == DISK_FALSE)
      ||(usRet == BAD_DISK_COMMAND) ) {
        while (1);  
    }
    
    /*
     *   查看设备是否就绪
     */
    ucDevice = 0;
    GdpData.ulSectorIndex = 0;
    GdpData.uiNSectors    = 0;
    GdpData.pvRsvdForLow  = &ucDevice;
    GdpData.pucBuf        = 0;
    usRet = ataCommand(DISK_CHECK_DEVICE,&GdpData);                     /*  初始化驱动                  */ 

    if ((usRet == DISK_READ_NOT_OK)                                     /*  驱动返回出错                */
      ||(usRet == DISK_WRITE_NOT_OK)
      ||(usRet == DISK_INIT_NOT_OK)
      ||(usRet == DISK_FALSE)
      ||(usRet == BAD_DISK_COMMAND) ) {
        while (1);  
    }
    mbox_Protocol = OSMboxCreate(NULL);                               	/*	创建协议内容消息邮箱		*/ 
 	while(1){
 	    CFProtocol= OSMboxPend (mbox_Protocol,0,&err);               	/*	等待消息邮箱				*/
 	  	switch(CFProtocol->CommandCode)
	        {
	        	case 0xE0:												/*	立即待机					*/   
	        		ucDevice = 0;
    				GdpData.ulSectorIndex = 0;
   					GdpData.uiNSectors    = 0;
    				GdpData.pvRsvdForLow  = &ucDevice;
    				GdpData.pucBuf        = 0;
    				usRet = ataCommand(DISK_DEVICE_CLOSE,&GdpData);     /*	关闭设备					*/                           
					if ((  usRet == DISK_FALSE)
        				||(usRet == BAD_DISK_COMMAND) ) {
       					CFProtocol->RetData=FALSE;	   
    				}
	        		break;
	        	case 0xE1:												/*	立即空闲					*/
	        		ucDevice = 0;
    				GdpData.ulSectorIndex = 0;
   					GdpData.uiNSectors    = 0;
    				GdpData.pvRsvdForLow  = &ucDevice;
    				GdpData.pucBuf        = 0;
    				usRet = ataCommand(DISK_DEVICE_OPEN,&GdpData);     	/*	打开设备					*/                            
					if ((  usRet == DISK_FALSE)
        				||(usRet == BAD_DISK_COMMAND) ) {
       					CFProtocol->RetData=FALSE;	   
    				}
	        		break;
	        	case 0x20:												/*	读扇区						*/
	         		ucDevice = 0;
        			GdpData.ulSectorIndex = CFProtocol->SectorNumber;
        			GdpData.uiNSectors    = CFProtocol->SectorCount;
        			GdpData.pvRsvdForLow  = &ucDevice;
        			GdpData.pucBuf        = GucRData;
        			usRet = ataCommand(DISK_MULT_READ,&GdpData);   	 	/* 读扇区数据                  */ 
        			if ((usRet == DISK_READ_NOT_OK)                                 
          				||(usRet == DISK_WRITE_NOT_OK)
          				||(usRet == DISK_INIT_NOT_OK)
          				||(usRet == DISK_FALSE)
          				||(usRet == BAD_DISK_COMMAND) ) {
            			CFProtocol->RetData=FALSE; 
        			} else CFProtocol->RetData=TRUE;
        			if(CFProtocol->SectorCount==0)
	        			CFProtocol->SectorCount =256;	            	/* 如果扇区数为0,即操作256个扇区*/
	        		CFProtocol->ReceiveData = 512*CFProtocol->SectorCount;		
	        	    for(i=0; i<CFProtocol->ReceiveData;i += 256){
	        		     uartWrite (UART0,(uint8*)&GucRData[i],256,NULL);/*	传输数据到PC 				*/
	        		     OSTimeDly(OS_TICKS_PER_SEC/100);
	        		}
	        		break;
	        	case 0x30:												/*	写扇区						*/
	        		if(CFProtocol->SectorCount==0)						/*	如果扇区号为0即写256个扇区	*/
	        			CFProtocol->ReceiveData = 512*256;				/*	需要收到的数据字节总数		*/
	        		else
	        			CFProtocol->ReceiveData = 512*CFProtocol->SectorCount;
	        			 
	        		for(i=0; i<CFProtocol->ReceiveData;i += 14) {
	        		  OSSemPend(poeUart0ReviceSem,0,&err);
	        		  OS_ENTER_CRITICAL();
	        		  uiNUM=uartFifoStatus(UART0,RX_FIFO);
	        		  uartRead (UART0,(uint8*)&GucWData[i],14,NULL);
	        		  if(uiNUM<14) {
	        		     uartRead (UART0,(uint8*)&GucWData[i],14,NULL);
	        		  break;
	        		  }
	        		  OS_EXIT_CRITICAL();	
	        		}	
					
					ucDevice = 0;
        			GdpData.ulSectorIndex = CFProtocol->SectorNumber;
        			GdpData.uiNSectors    = CFProtocol->SectorCount;
        			GdpData.pvRsvdForLow  = &ucDevice;
        			GdpData.pucBuf        = GucWData;
        			usRet = ataCommand(DISK_MULT_WRITE,&GdpData);       /*  写扇区数据                  */ 
       				if ((usRet == DISK_READ_NOT_OK)                       
			          ||(usRet == DISK_WRITE_NOT_OK)
			          ||(usRet == DISK_INIT_NOT_OK)
			          ||(usRet == DISK_FALSE)
			          ||(usRet == BAD_DISK_COMMAND) ) {
			           CFProtocol->RetData=FALSE;   
			        } else CFProtocol->RetData=TRUE;  
	        		break;
	           case 0xEC:												/*	获取设备识别信息			*/
	        		ucDevice = 0;
	    			CFProtocol->RetData = ATA_IdentifyDrive(ucDevice,GucWData);	/*	获取设备识别信息	*/
					if(CFProtocol->RetData)
	        		  SendDriveInfo((PCF_IDENTIFY_DATA)GucWData);		/*	传输数据到PC				*/
	        		break;
	        	default:
	        		CFProtocol->RetData = FALSE;
	        		break;        
	        }
	        RetStateToPC(CFProtocol->RetData);							/*	向PC返回指令执行状态		*/
		OSTimeDly(OS_TICKS_PER_SEC);
	}
}
/*******************************************************************************************
** Function name: Uart0
** Descriptions:  无
** Input:         无
** Output:        无 
*******************************************************************************************/


void Uart0	(void *pdata)
{   
    INT8U  err;
    int16 uiNUM;
    uint8 temp=0;
  	uint16	i,j;				
	CFPROTOCOL CFProtocol;
  
  	pdata = pdata;	
	
	PINSEL0 |= ((0x01 << 4) | (0x01 << 6));								/*  设置P0.2和P0.3连接到UART0   */
    uartInit (UART0, cUartArg, NULL);                                   /*  初始化串口0                 */           
    SetVICIRQ (6, 5, (uint32)uart0Isr); 
    uartWrite (UART0,(uint8*)cUartArg,sizeof(cUartArg),NULL);           /*  向PC机报告串口设置          */  
	        
	poeUart0ReviceSem = OSSemCreate(0);        							/*  创建发送中断信号量			*/
	while(1)
	{	
	
	    OSSemPend(poeUart0ReviceSem,0,&err);							/*  等待接收中断信号量的同步	*/
	    uiNUM=uartFifoStatus(UART0,RX_FIFO);                            /*	读取接收FIFO数据个数		*/
	    uartRead  (UART0,(uint8*)&temp,1,NULL);							/*	读取首字符					*/
        if (temp != 'Z') {                     							/*	判断首字符是否‘Z’			*/
            uartFifoFlush(UART0,RX_FIFO); 								/*  清空接收队列				*/
            continue;
        }
		for (i=0;i<uiNUM-1;i++) {                                       /*	接收接下来的uiNUM-1个数据	*/
		   uartRead(UART0,(uint8*)&CFProtocol.buff[i],1,NULL); 
		}
		if((CFProtocol.buff[0]!='L')									/*	判断协议头					*/
		    ||(CFProtocol.buff[1]!='G')
		    ||(CFProtocol.buff[2]!=':')) {
		          i=0;
		          uartFifoFlush(UART0,RX_FIFO); 						/*  清空接收队列				*/
		          break;
		  }
		OSSemPend(poeUart0ReviceSem,0,&err);							/*  协议没有接收完,继续		*/
		for (j=i;j<15;j++) {											/*  接收剩下的数据				*/
		   uartRead(UART0,(uint8*)&CFProtocol.buff[j],1,NULL); 
		}
		uartFifoFlush(UART0,RX_FIFO);
		if (i > 3){ 													/*  协议有效					*/
																		/*	提取指令代码				*/
			CFProtocol.CommandCode =  (ASCII_TO_HEX(CFProtocol.buff[3])<<4)
			                          |ASCII_TO_HEX(CFProtocol.buff[4]); 		
																		/*	提取扇区号					*/
		   	CFProtocol.SectorNumber =  (ASCII_TO_HEX(CFProtocol.buff[5])<<28)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[6])<<24)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[7])<<20)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[8])<<16)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[9])<<12)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[10])<<8)
		   	                          |(ASCII_TO_HEX(CFProtocol.buff[11])<<4)
		   	                          | ASCII_TO_HEX(CFProtocol.buff[12]);
	      																/*	提取扇区数					*/
	      	CFProtocol.SectorCount =  ( ASCII_TO_HEX(CFProtocol.buff[13])<<4)
	      							  | ASCII_TO_HEX(CFProtocol.buff[14]);		 
	      	OSMboxPost (mbox_Protocol,&CFProtocol);						/*	发送消息邮箱,传递协议内容	*/
	 	 }		    
		OSTimeDly(OS_TICKS_PER_SEC/10);			
	}	
	    
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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