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

📄 udisk.c

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	switch(nComBuff.ReqData.Com)
	{
		case R_OPEN_FILE:
			nComBuff.ReqData.VeryData.FileName[MAX_PATH_LEN-1]=0;  //确保最后一个是“0”,作为字符串的尾部
			strcpy((char *)mCmdParam.Open.mPathName,(char *)nComBuff.ReqData.VeryData.FileName);
			OperReturn = CH375FileOpen( );
			if(OperReturn)
			{
				ReturnErrorCode(OperReturn);
				B_status = S_READY;				  
			}
			else
			{
				ReturnErrorCode(A_SUCCESS);
				B_status=S_OPEN;
			}					

			break;
		case R_NEW_FILE:
			ModuleNewFile(0);                          //新建文件
			break;
		case R_DEL_FILE:
			nComBuff.ReqData.VeryData.FileName[MAX_PATH_LEN-1]=0;  //确保最后一个是“0”,作为字符串的尾部
			strcpy((char *)mCmdParam.Create.mPathName,(char *)nComBuff.ReqData.VeryData.FileName);
			OperReturn = CH375FileErase( );  //删除文件并关闭
			ReturnErrorCode(OperReturn);
			B_status = S_READY;
			break;
		case R_NEW_DIR:
			ModuleNewFile(0xff);                      //新建文件夹
			break;			
		default:
			ReturnErrorCode(A_NOTOPEN);
			B_status = S_READY;
			break;
      }
}

/************************************************************************/
/* 模块按字节读取文件
需要准备的有: nComBuff.ReqData.VeryData.ReadBytes,字节数
出口数据: nComBuff.AckData.VeryData.ReadDataVer.ReadBytes,读出的实际字节数
                                                                        */
/************************************************************************/
void ModuleByteRead(void)
{
    rdcount=nComBuff.ReqData.VeryData.ReadBytes;
    if(rdcount)
    {
		if(rdcount>MAX_BYTE_IO)
      	{
			mCmdParam.ByteRead.mByteCount = MAX_BYTE_IO;    //读的字节数就是最大值
			goto readbyte1;
		}
		else
		{
			mCmdParam.ByteRead.mByteCount = rdcount;
readbyte1:			LIGHT_RD;                                        //读指示灯打开
			OperReturn = CH375ByteRead();
			OFF_RD;                                          //读指示灯熄灭
			if(OperReturn)
			{
				ReturnErrorCode(OperReturn);
			}
			else
			{
			    RETURN_SUCCESS;                             //返回成功
				CopyBytes(nComBuff.AckData.VeryData.ReadDataVer.DataBuff,  //目的地址
					mCmdParam.ByteRead.mByteBuffer,       //源地址
					mCmdParam.ByteRead.mByteCount);    //实际读出的字节数
                nComBuff.AckData.VeryData.ReadDataVer.ReadBytes = mCmdParam.ByteRead.mByteCount;
                nComBuff.AckData.FrameLen = nComBuff.AckData.VeryData.ReadDataVer.ReadBytes+5;  //整个帧的长度
				I2C_SEND_READY;                            //准备发送
			}

		}
	}
	B_status = S_OPEN;
}

/************************************************************************/
/* 模块对文件属性的读取                                                 */
/************************************************************************/
void ModuleAttrRead(void)
{
	LIGHT_RD;                                           //亮灯
	OperReturn = CH375FileQuery( );
	OFF_RD;                                             //灭灯
	if(OperReturn)
	{
		ReturnErrorCode(OperReturn);
	}
	else
	{
		nComBuff.AckData.FrameLen = FILE_ATTRI_BYTES+3;
		RETURN_SUCCESS;
		CopyBytes((uchar *) &nComBuff.AckData.VeryData.ReadFileAttrVer,
			(uchar *) &mCmdParam.Modify,
			FILE_ATTRI_BYTES);
		I2C_SEND_READY;
	}
	B_status = S_OPEN;
}

/************************************************************************/
/* 模块对文件按字节方式写入                                             */
/************************************************************************/
void ModuleByteWrite(void)
{
	rdcount = nComBuff.ReqData.VeryData.WriteDataVer.Bytes;
	if(rdcount)
	{
		if(rdcount>MAX_BYTE_IO)
		{
			mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;
			goto writebyte1;
		}
		else
		{
			mCmdParam.ByteWrite.mByteCount = rdcount;
writebyte1:			LIGHT_WR;
			CopyBytes(mCmdParam.ByteWrite.mByteBuffer,                //将请求帧的数据内容拷贝到读写结构体当中
				nComBuff.ReqData.VeryData.WriteDataVer.DataBuff,
				mCmdParam.ByteWrite.mByteCount);
			OperReturn = CH375ByteWrite( );
			OFF_WR;
			if(OperReturn)
			{
				ReturnErrorCode(OperReturn);
			}
			else
			{
                nComBuff.AckData.VeryData.RealWriteByte = mCmdParam.ByteWrite.mByteCount;
			    RETURN_SUCCESS;
                nComBuff.AckData.FrameLen = nComBuff.AckData.VeryData.RealWriteByte + 5;  //整个帧的长度
			}
		}
	}
	B_status = S_OPEN;
}

/************************************************************************/
/* 模块的扇区读取函数
在mCmdParam.ReadX.mSectorCount中放入读取的扇区数目
在mCmdParam.ReadX.mDataBuffer中                                                                     */
/************************************************************************/
void ModuleSectorRead(void)
{
    if(CH375DiskStatus == DISK_OPEN_FILE)
    {
        mCmdParam.ReadX.mSectorCount = 1;
        LIGHT_RD;
        OperReturn = CH375FileRead();
        OFF_RD;
        if(OperReturn)
        {
            ReturnErrorCode(OperReturn);
        }
        else
        {
            CopyBytes(nComBuff.AckData.VeryData.ReadDataVer.DataBuff,FILE_DATA_BUF,512);
            nComBuff.AckData.VeryData.ReadDataVer.ReadBytes = mCmdParam.ReadX.mSectorCount;
            RETURN_SUCCESS;
            nComBuff.ReqData.FrameLen = (nComBuff.AckData.VeryData.ReadDataVer.ReadBytes<<9) + 5;
        }
    }
    else
    {
        ReturnErrorCode(A_BYTEMODE);
    }
}

/************************************************************************/
/* 模块的扇区写入函数
在                                                                     */
/************************************************************************/
void ModuleSectorWrite(void)
{
    if(CH375DiskStatus == DISK_OPEN_FILE)
    {
        mCmdParam.Write.mSectorCount = nComBuff.ReqData.VeryData.WriteDataVer.Bytes;   /*把要写入的扇区数确定*/
        CopyBytes(FILE_DATA_BUF,nComBuff.ReqData.VeryData.WriteDataVer.DataBuff,512);
        LIGHT_WR;
        OperReturn = CH375FileWrite( );
        OFF_WR;
        if(OperReturn)
        {
            ReturnErrorCode(OperReturn);
        }
        else
        {
            nComBuff.AckData.VeryData.RealWriteByte = mCmdParam.Write.mSectorCount;
            RETURN_SUCCESS;
            nComBuff.AckData.FrameLen = 5;
        }
    }
    else
    {
        ReturnErrorCode(A_BYTEMODE);
    }

        
}
/************************************************************************/
/* 模块编辑文件属性函数
修改文件的属性,日期,长度,时间,
                                                                   */
/************************************************************************/

/************************************************************************/
/* 模块文件的偏移
入口:ModeLocate ,0--字节模式,!0--扇区模式
                                                                        */
/************************************************************************/
void ModuleSetOffset(uchar ModeLocate)
{
    if(ModeLocate == LOCATE_SECTOR_MODE)
    {
        mCmdParam.Locate.mSectorOffset = nComBuff.ReqData.VeryData.SetOffset;
        OperReturn = CH375FileLocate();
        if(OperReturn)
            ReturnErrorCode(OperReturn);
        else
        {
            RETURN_SUCCESS;
            nComBuff.AckData.VeryData.RealOffset = mCmdParam.Locate.mSectorOffset;
            nComBuff.AckData.FrameLen = 7;
        }
    }
    else
    {
        mCmdParam.ByteLocate.mByteOffset = nComBuff.ReqData.VeryData.SetOffset;
        OperReturn = CH375ByteLocate( );
        if(OperReturn)
            ReturnErrorCode(OperReturn);
        else
        {
            RETURN_SUCCESS;
            nComBuff.AckData.VeryData.RealOffset = mCmdParam.ByteLocate.mByteOffset;
            nComBuff.AckData.FrameLen = 7;
        }
    }
}
/************************************************************************/
/* 如果是有文件打开的状态,帧处理函数                                    */
/************************************************************************/
void StatusOpen(void)
{
	uint rdcount;
	switch(nComBuff.ReqData.Com)
	{
		case R_RD_FILE_DATA:
			ModuleByteRead();
			break;
		case R_RD_FILE_ATTR:
			ModuleAttrRead();
			break;
		case R_WR_FILE_DATA:
			ModuleByteWrite();
			break;
        case R_RD_FILE_SECTOR:
            ModuleSectorRead();
            break;
        case R_WR_FILE_SECTOR:
            ModuleSectorWrite();
            break;
		case R_CLOSEFILE:
			mCmdParam.Close.mUpdateLen = 1;                    //自动更新文件长度
			OperReturn = CH375FileClose( );
			if(OperReturn)
			{
				ReturnErrorCode(OperReturn);
			}
			else
			{
				ReturnErrorCode(A_SUCCESS);
			}
			B_status = S_READY;
			break;
		case R_SET_OFFSETBYTE:
            ModuleSetOffset(LOCATE_BYTE_MODE);
			break;
        case R_SET_OFFSETSECTOR:
            ModuleSetOffset(LOCATE_SECTOR_MODE);
            break;

		case R_MODIFY_ATTR:
			mCmdParam.Modify.mFileAttr = nComBuff.ReqData.VeryData.ModifyFileAttrVer.FileAttr;
			mCmdParam.Modify.mFileDate = nComBuff.ReqData.VeryData.ModifyFileAttrVer.FileDate;
			mCmdParam.Modify.mFileSize = nComBuff.ReqData.VeryData.ModifyFileAttrVer.FileSize;
			mCmdParam.Modify.mFileTime = nComBuff.ReqData.VeryData.ModifyFileAttrVer.FileTime;
			OperReturn = CH375FileModify();
			if(OperReturn)
			{
				ReturnErrorCode(OperReturn);
			}
			else
			{
				RETURN_SUCCESS;
				nComBuff.AckData.VeryData.ModifyFileAttrVer.FileAttr = mCmdParam.Modify.mFileAttr;
				nComBuff.AckData.VeryData.ModifyFileAttrVer.FileDate = mCmdParam.Modify.mFileDate;
				nComBuff.AckData.VeryData.ModifyFileAttrVer.FileSize = mCmdParam.Modify.mFileSize;
				nComBuff.AckData.VeryData.ModifyFileAttrVer.FileTime = mCmdParam.Modify.mFileTime;
				nComBuff.AckData.FrameLen = FILE_ATTRI_BYTES+3;
			}
			B_status = S_OPEN;
			break;
		default:
			ReturnErrorCode(A_OPEN);
			break;
	}

}

/************************************************************************
/接收到数据帧时的处理函数
*************************************************************************/	    
void RecieveFrameProcess( void )
{
	if(nComBuff.AckData.Ack == R_RESET)
        return;
    switch( B_status)
	{
		case S_NOTREADY:            // 如果是未准备好状态
			nComBuff.AckData.Ack = A_NOTREADY;
			I2C_SEND_READY;               //发送已经准备好
			nComBuff.AckData.FrameLen = 3;
            break;
		case S_READY:              //如果是准备好但未读写状态
			StatusReady();
			break;

		case S_OPEN:                                  //有文件打开的情况下
			StatusOpen();
			break;

		default:
			break;
	
	}

}

/******************************************************************************
/全局变量的初始化
******************************************************************************/
void variable(void)
{
    B_status=S_NOTREADY;
    SlaveSendLength = &nComBuff.ReqData.FrameLen;
    I2cReceiveData = (uchar*) &nComBuff;
    I2cSendData = (uchar*) &nComBuff;
    UartRx = temp;
    nComBuff.AckData.Ack = A_NOTREADY;
    nComBuff.AckData.FrameLen = 3;
}
//ICC-AVR application builder : 2007-7-15 10:41:34
// Target : M32
// Crystal: 8.0000Mhz

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0xFF;
 DDRB  = 0x03;
 PORTC = 0xFF; 
 DDRC  = 0xC0;
 PORTD = 0xFF;
 DDRD  = 0xF1;
}

//Watchdog initialize
// prescale: 512K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
}

//TIMER0 initialize - prescale:1024
// desired value: 20mSec
// actual value: 19.952mSec (0.2%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x64; //set count
 OCR0  = 0xEA;  //set compare
 TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:12
void timer0_ovf_isr(void)
{
 TCNT0 = 0x64; //reload counter value
 WDR();
 if(ys20ms)
    ys20ms--;

}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 watchdog_init();
 timer0_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x01; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
	   

	   

	   

⌨️ 快捷键说明

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