📄 udisk.c
字号:
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 + -