STC12C5A32S2+CH376问题求助

我的项目要用STC12C5A32S2+CH376对U盘进行数据存储,现在 把EXAM7修改移到我的项目中,我用硬件SPI读写方式操作CH376,用串口调试助手显示调试信息,下载程序运行后,信息返回9A 51 14 14 84 (CH376.INC注:84/* 磁盘的扇区太大,只支持每扇区512字节 */).84?这个问题怎么解决。?、

void main (void) { UINT8 s; UINT8 month, date, hour; UINT16 adc; // Disable Watchdog timer Delay_50mS_T( 6 ); //300ms Port_IO_Init( ); // SPI_Init(); // CH376_PORT_INIT( ); /* 接口硬件初始化 */ Uart1Init(); // initialize UART1 Uart2Init(); // initialize UART2 // EA = 1; // enable global interrupts sendtoPC(FDK_text); // send data to PC Delay_50mS_T( 2 ); // 延时100毫秒 // mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ // printf( "Start\n" );

led_disp(); Delay_50mS_T( 60 ); // 延时3000毫秒 s = mInitCH376Host( ); /* 初始化CH376 */ mStopIfError( s ); /* 其它电路初始化 */

led_00(); Delay_50mS_T( 60 ); // 延时3000毫秒

//printf( "Wait Udisk/SD\n" ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) //USB_INT_SUCCESS=0x14; { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ Delay_50mS_T( 2 ); // 延时100毫秒 }

/* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ Delay_50mS_T( 4 ); // 延时200毫秒

/* 对于检测到USB设备的,最多等待10*50mS */ Delay_50mS_T( 60 ); // 延时3000毫秒

// s = CH376ReadBlock( buf ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ // if ( s == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */ // buf[ s ] = 0; //printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); // } led_00();

/* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ //printf( "Open\n" ); s = CH376FileOpen( "/MY_ADC.TXT" ); /* 打开文件,该文件在根目录下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ //printf( "File size = %ld\n", CH376GetFileSize( ) ); /* 读取当前文件长度 */ //printf( "Locate tail\n" ); s = CH376ByteLocate( 0xFFFFFFFF ); /* 移到文件的尾部 */ mStopIfError( s ); }

else if ( s == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ //printf( "Create\n" ); s = CH376FileCreate("/MY_ADC.TXT" ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */ mStopIfError( s ); }

else mStopIfError( s ); /* 打开文件时出错 */

//printf( "Write begin\n" ); //??????s = sprintf( buf, "此前文件长度= %ld 字节\xd\xa", CH376GetFileSize( ) ); /* 注意字符串长度不能溢出buf,否则加大缓冲区或者分多次写入 */ //??????s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ //??????mStopIfError( s ); while ( 1 ); .. 调试时我让程序暂时运行到这


s = mInitCH376Host( );这个函数有没有通过? 你先做测试命令,看看MCU和CH376是否通讯成功。发送0X06命令,发送0X55数据,然后读数据,正常的情况下应该返回X0AA,如果返回的数据不对,则说明SPI或者硬件有问题


你好,我认为做测试命令应该通过的,我按你们公司的EXAM7中的mInitCH376Host( );里面是发送0X65数据,返回0x9A,后面再返回51 14 , 0x51是“xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); Send_1_Uart(res); xEndCH376Cmd( );

”返回的值。我在例程加了Send_1_Uart(res); 例程里的头文件有“ #define CMD0H_DISK_INIT 0x51 /* 主机方式/不支持SD卡: 初始化USB存储器 */”

“USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */” 所以我认为初始化应该是过了的。

如果我理解有误,还望您指点。


后面还返回一个“0x14” 是我在程序执行“ while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) //USB_INT_SUCCESS=0x14; { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ Delay_50mS_T( 2 ); // 延时100毫秒 } ”的 “ /****************************************************************************************/ UINT8 CH376DiskConnect( void ) /* 检查U盘是否连接,不支持SD卡 */ { if ( Query376Interrupt( ) ) CH376GetIntStatus( ); /* 检测到中断 */ //.......................................................... Send_1_Uart(CH376SendCmdWaitInt( CMD0H_DISK_CONNECT )); //..........................................................

return( CH376SendCmdWaitInt( CMD0H_DISK_CONNECT ) ); }”的里面加 “ //.......................................................... Send_1_Uart(CH376SendCmdWaitInt( CMD0H_DISK_CONNECT )); //..........................................................”返回的值


说明一下,U盘插在上面,U盘的指示灯是亮了的。U盘是清华紫光1G的, 单片机的时钟是12MHZ,SPI的SCLK时钟是MCU时钟的四分频=3MHZ. 设置SPI模式3, DORD=0(MSB first), CPOL=1, CPHA=1,


在CH376DiskConnect( )之后,你需要做下DISK_MOUNT的命令,这个命令是初始化U盘,只有初始化U盘成功之后,后面去读U盘以及写U盘才是成功的。


用WINHEX软件 看一下U盘的扇区大小。 CH376只支持扇区大小为512字节的U盘


你好,做了DISK_MOUNT的命令,返回是0X14,说明初始化是过了


现在

void main (void) { UINT8 k,s; // UINT8 month, date, hour; // UINT16 adc; // Disable Watchdog timer Delay_50mS_T( 6 ); //300ms Port_IO_Init( ); // SPI_Init(); // CH376_PORT_INIT( ); /* 接口硬件初始化 */ Uart1Init(); // initialize UART1 Uart2Init(); // initialize UART2 EA = 1; // enable global interrupts sendtoPC(FDK_text); // send data to PC Delay_50mS_T( 2 ); // 延时100毫秒 led_disp(); Delay_50mS_T( 60 ); // 延时3000毫秒 s = mInitCH376Host( ); /* 初始化CH376 */ Send_1_Uart(s); //0x14 mStopIfError( s ); /* 其它电路初始化 */

led_00(); Delay_50mS_T( 60 ); // 延时3000毫秒

//printf( "Wait Udisk/SD\n" ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) //USB_INT_SUCCESS=0x14; { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ Delay_50mS_T( 2 ); // 延时100毫秒 } s=CH376DiskConnect( ); Send_1_Uart(s); //0x14

/* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */ Delay_50mS_T( 4 ); // 延时200毫秒

/* 对于检测到USB设备的,最多等待10*50mS */ Delay_50mS_T( 60 ); // 延时3000毫秒

for ( k = 0; k < 10; k ++ ) { /* 最长等待时间,10*50mS */ Delay_50mS_T( 1 ); // 延时200毫秒 if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ } Send_1_Uart(k); s=CH376DiskMount( ); /* 初始化磁盘并测试磁盘是否就绪 */ Send_1_Uart(s); //0x84

// s = CH376ReadBlock( buf ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ led_00();

s = CH376FileCreate("/MYADC.TXT" ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */ Send_1_Uart(s); //0xfa mStopIfError( s ); led_disp(); while ( 1 );

返回的信息是9A 51 14 14 01 14 FA 后3个字节数 01是DISK_MOUNT的命令次数 14 表明DISK_MOUNT成功 FA是s = CH376FileCreate("/MYADC.TXT" );的值

请问用WINHEX软件,在哪里有下载?


baidu一下啊


昨天用WINHEX软件看了看,我调试的U盘是2048的,用个512的就可以了。郁闷!!,搞这个花了几天。


昨天有其他事,没有继续调试,今天继续工作,为什么执行 strcpy( buf, "今天的ADC数据到此结束" ); s = CH376ByteWrite( buf, strlen( buf ), NULL ); /* 以字节为单位向文件写入数据 */ mStopIfError( s ); 结果在U盘里电脑上显示是: “今天的ADC示莸酱私崾 ”,乱码是怎么照成的?希望知道的侠人指点一下,谢谢!


可能是干扰造成的,还要测一下U盘的供电是否为5V


此前文件长度= 0 字节 05.00.2108 ADC=46364 05.00.2387 ADC=284 05.00.2664 ADC=44572 05.00.2943 ADC=20508 05.00.3221 ADC=44060 05.00.3499 ADC=63516 05.00.3778 ADC=49180 05.00.4057 ADC=25884 05.00.4335 ADC=58140 05.00.4358 ADC=38940 05.00.4637 ADC=2332 05.00.4915 ADC=2076 05.00.5192 ADC=62492 05.00.5471 ADC=29980 05.00.5750 ADC=15388 05.00.6028 ADC=39452 05.00.6307 ADC=11548 05.00.6585 ADC=48924 05.00.6864 ADC=20508 05.00.7142 ADC=43804 05.00.7420 ADC=64028 05.00.7443 ADC=35356 05.00.7722 ADC=7708 05.00.8024 ADC=50716 05.00.8303 ADC=27164 05.00.8581 ADC=60444 05.00.8892 ADC=26140 05.00.9170 ADC=45852 05.00.9449 ADC=18204 05.00.9727 ADC=46876 05.00.9750 ADC=14620 05.00.10028 ADC=38684 今天的ADC示莸酱私崾?

前面的数据正常,唯独最后一句,我觉得应该不是供电问题,我怀疑是这个“ strcpy( buf, "今天的ADC数据到此结束\xd\xa" );”的问题,但是不知为什么?


我在“strcpy( buf, "今天的ADC数据到此结束\xd\xa" );”后加一句 “sendstringtoPC(buf); // send string to PC”电脑显示仍然是 “今天的ADC示莸酱私崾 ” 希望知道的侠人指点一下,问题出在哪!


只有登录才能回复,可以选择微信账号登录