📄 ch375ev0.c
字号:
{
ShowNumber(j,160+col, DATA_BUFFER[mLength]); //显示
j+=4;
if(j>37)
{
j=0;
col+=16;
}
}
mLength--;
mBufferPoint++;
}
CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */
}
else break; /* 返回错误状态 */
}
if ( mBlockCount == 0 ) {
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
}
// if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */
mClearError( ); /* 清除U盘错误以便重试 */
return( mIntStatus ); /* 操作失败 */
}
/* 将缓冲区中的多个扇区的数据块写入U盘 */
unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
/* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
{
unsigned char mIntStatus;
unsigned char *mBufferPoint;
unsigned int mBlockCount,j=0,col=0;
unsigned char mLength;
CH375_WR_CMD_PORT( CMD_DISK_WRITE ); /* 向USB存储器写数据块 */
CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */
CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */
mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */
for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
if ( mIntStatus == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375缓冲区写入数据块 */
mLength = CH375_BLOCK_SIZE;
CH375_WR_DAT_PORT( mLength ); /* 后续数据的长度 */
while ( mLength ) { //根据长度写入数据
CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入
/* if( 160+col < 240 )
{
ShowNumber(j,160+col,*mBufferPoint); //显示 *mBufferPoint
j+=4;
if(j>37)
{
j=0;
col+=16;
}
}*/
mBufferPoint++;
mLength--;
}
/* do { //对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快
CH375_WR_DAT_PORT( DATA_BUFFER[mLength] );
mBufferPoint++;
} while ( --mLength );*/
CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */
}
else break; /* 返回错误状态 */
}
if ( mBlockCount == 0 ) {
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
}
// if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */
mClearError( ); /* 清除U盘错误以便重试 */
return( mIntStatus ); /* 操作失败 */
}
struct _HD_MBR_DPT {
unsigned char PartState;
unsigned char StartHead;
unsigned int StartSec;
unsigned char PartType;
unsigned char EndHead;
unsigned int EndSec;
unsigned long StartSector;
unsigned long TotalSector;
};
/* 为printf和getkey输入输出初始化串口 */
void mInitSTDIO( )
{
/* SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xf3; // 24MHz晶振, 9600bps//
TR1 = 1;
TI = 1;*/
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x67; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x1C; //1c
}
main() {
unsigned char c, mIntStatus;
unsigned int i=0;
//-------------------------------------------------------
init_devices();
//-----------------------------------------------------------------------------
CH375_PORT_INIT(); //首先将串口初始化为9600 因为CH375默认的波特率是9600
SET_BAUDRATE(); //设置CH375的串口通讯波特率 57600
CH375_PORT_INIT_57600();//重新调整波特率 单片机串口波特率57600
//-----------------------------------------------------------------------------
initLCDM(); //初始化LCD
CleanScreen();
//Welcome_interface(); //显示欢迎界面
//-------------------------------------------------------
LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */
mDelaymS( 100 ); /* 延时100毫秒 */
LED_OUT_INACT( );
//mInitSTDIO( );
// printf( "Start\n" );
ShowText(10,5,"开始");
c = mCH375Init( ); /* 初始化CH375 */
//if ( c );// printf( "Error @CH375Init\n" );
/* {
ShowText(10,21,"初始化错误!");
while ( 1 )
{
LED_OUT_ACT( ); //LED闪烁
mDelaymS( 80 );
LED_OUT_INACT( );
mDelaymS( 80 );
}
} */
//printf( "Insert USB disk\n" );
ShowText(10,21,"等待插入U盘......");
do { /* 等待U盘连接 */
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
} while ( mIntStatus != USB_INT_CONNECT ); /* U盘没有连接或者已经拔出 */
mDelaymS( 200 ); /* 延时等待U盘进入正常工作状态 */
//printf( "InitDisk\n" );
ShowText(10,37,"已插入U盘......");
loop:
c = mInitDisk( ); /* 初始化U盘,实际是识别U盘的类型,不影响U盘中的数据,在所有读写操作之前必须进行此步骤 */
if ( c )// printf( "Error @InitDisk, %02X\n", c );
{
ShowText(10,53,"初始化U盘错误");
while ( 1 )
{
LED_OUT_ACT( ); /* LED闪烁 */
mDelaymS( 80 );
LED_OUT_INACT( );
mDelaymS( 80 );
}
}
for(i=0;i<100;i++)
{
DATA_BUFFER[i]=168;
}
/* 检查U盘是否准备好,大多数U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
// do {
// mDelaymS( 100 );
// printf( "Disk Ready ?\n" );
// i = CH375DiskReady( ); /* 查询磁盘是否准备好,如果省掉这个子程序可以节约将近1KB的程序代码 */
// } while ( i != ERR_SUCCESS );
/* CH375DiskReady 在CH375的U盘文件子程序库中,因为代码较多,所以此处省去 */
//printf( "ReadSector 0# to buffer\n" );
ShowText(10,53,"读扇区......");
c = mWriteSector( 2, 1 );
c = mReadSector( 2, 1 );
//---------------------------------------------------
if ( c )//printf( "Error @ReadSector, %02X\n", c );
{
ShowText(10,69,"读取U盘失败!");
while ( 1 )
{
LED_OUT_ACT(); /* LED闪烁 */
mDelaymS( 80 );
LED_OUT_INACT();
mDelaymS( 80 );
}
}
else
{
ShowText(10,69,"读取U盘扇区成功!");
}
//---------------------------------------------------
/* if ( DATA_BUFFER[0x01FF] == 0xAA )
{ // 磁盘分区有效
//printf( "WriteSector 1# from buffer\n" );
ShowText(10,69,"磁盘分区有效");
c = mWriteSector( 1, 1 );
if ( c )// printf( "Error @WriteSector, %02X\n", c );
memset( DATA_BUFFER, 0, sizeof(DATA_BUFFER) ); // 清空数据缓冲区,代替原来的分区信息
//printf( "WriteSector 0# for clear\n" );
c = mWriteSector( 0, 1 );
if ( c ); //printf( "Error @WriteSector, %02X\n", c );
}
else {
//printf( "ReadSector 1# to buffer\n" );
// c = mReadSector( 1, 1 );
if ( c )// printf( "Error @ReadSector, %02X\n", c );
//printf( "WriteSector 0# from buffer\n" );
c = mWriteSector( 0, 1 );
if ( c ); //printf( "Error @WriteSector, %02X\n", c );
}*/
//printf( "Stop\n" );
while ( 1 ) {
mIntStatus = mWaitInterrupt( ); // 等待中断并获取状态
if ( mIntStatus == USB_INT_DISCONNECT )
{ // U盘没有连接或者已经拔出 //
//printf( "Out\n" );
ShowText(10,85,"U盘已拨出!");
}
else if ( mIntStatus == USB_INT_CONNECT )
{ // U盘已经连接//
//printf( "In\n" );
ShowText(10,101,"U盘插入!");
LED_OUT_ACT();
CleanScreen();
goto loop;
}
}
}
void CH375_PORT_INIT_57600() /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x10; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x1C; //1c
}
void CH375_PORT_INIT() /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x67; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x1C; //1c
}
void SET_BAUDRATE() //设置CH375的串口通讯波特率
{
CH375_WR_CMD_PORT( CMD_SET_BAUDRATE ); //发送设置波特率的命令
CH375_WR_DAT_PORT(0x03);CH375_WR_DAT_PORT(0x98); //57600Bps
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -