利用atmega16+ch375b+u盘实现数据的存储功能,现在CH375LibInit()通过,CH375DiskConnect()也通过,程序死在CH375DiskReady(),不知道啥原因,谢谢各位。函数库用的大小为131k的CH375HFB.A,编译器是ICCAVR6.31A。
你编译之后生成的RAM以及代码空间是多少?我记得好像MEGA16是没办法用的,建议你换成MEGA32应该就可以了。
C:\icc\bin\imakew -f ch375b.mak iccavr -o ch375b -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @ch375b.lk -lch375 -lcatmega Device 91% full. warning: COFF no struct tag '_CMD_PARAM' found for symbol index 530 Done.
生成39KB的CH375B.hex文件. 谢谢
需要你看下你编译之后的MAP文件,来看下RAM以及FLASH有没有溢出,你告诉我HEX文件不能说明什么问题。
没有找到MAP文件,求指点。
编译之后在生成的工程文件里面就哟MAP文件的,看下CODE以及RAM暂用多少?
您说的是HEX文件所在的目录吧?没有找到MAP文件,那里面有MP文件和MAK文件。 我在计算机其他位置找到MAP文件,用记事本打开后是乱码。
应该就是MP文件,使用编译器打开就可以看到CODE以及RAM的分配了。 还有出现这种情况,查下USB口的UD+和UD-对地的电压是多少?USB口的电源是否充足
这是MP文件,看不懂啊: NOTE: AVR Code addresses are word addresses All other addresses (including ones in FLASH) are byte addresses
Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ idata 0054 0037 = 55. bytes (rel,con,rom)
Addr Global Symbol ----- -------------------------------- 0054 __idata_start 008B __idata_end
Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ text 008C 39D2 = 14802. bytes (rel,con,rom)
Addr Global Symbol ----- -------------------------------- 0046 __start 0046 __text_start 0066 _exit 0067 _SPI_Init 006C _nRF905_SetReceiveMode 0077 _nRF905_Init 0084 _SPI_Write 0088 _SPI_Read 008C _nRF905_SetConfig 00A9 _nRF905_ReadData 00CA _nRF905_ReceivePacket 010F _delay_5us 0112 _delay_650us 0121 _delay_nms 0134 _delay 014A _CH375FileEnumer 0156 _CH375FileQuery 0169 _xQueryInterrupt 0180 _xDelay100uS 0189 _xDelayAfterWrite 0192 _xFileNameEnumer 0193 _CH375LibInit 01A5 _CH375_PORT_INIT 01AE _xWriteCH375Cmd 01E8 _xWriteCH375Data 0212 _xReadCH375Data 023C _mStopIfError 0245 _ch375 02A7 _main 02DB _CH375ByteLocate 0324 _CH375ByteRead 044F _CH375ByteWrite 05FD _CH375GetVer 05FF _CH375s01 062D _CH375s04 065B _CH375s17 0675 _CH375s18 0691 _CH375s42 0698 _CH375s49 06B0 _CH375s05 06CC _CH375Reset 06E4 _CH375Init 073A _CH375DirtyBuffer 074E _CH375DiskConnect 076F _CH375s23 07A3 _CH375s06 0870 _CH375s07 0943 _CH375s08 0BA6 _CH375s09 0C10 _CH375s10 0E54 _CH375s48 0FCF _CH375s11 0FE6 _CH375s12 103B _CH375FileOpen 1487 _CH375FileClose 14EC _CH375FileErase 158F _CH375FileCreate 17EA _CH375FileModify 18BE _CH375s13 1904 _CH375s24 1914 _CH375s14 1950 _CH375s15 1992 _CH375s40 19A4 _CH375s41 19B4 _CH375DiskReady 19EF _CH375s19 1A8B _CH375s20 1AF5 _CH375s25 1B67 _CH375s43 1B77 _CH375s44 1BB5 _CH375s47 1CCA _strcpy 1CD3 push_arg4 1CD5 push_arg2 1CD8 pop_gset2 1CDB pop_gset3 1CDE pop_gset4 1CE1 pop_gset5 1CE4 push_gset5 1CE6 push_gset4 1CE8 push_gset3 1CEA push_gset2 1CEC push_gset1 1CEF pop_gset1 1CF0 pop 1D03 lsl16 1D0A lsl32 1D16 lsl8 1D1C lsr16 1D23 lsr32 1D2F __text_end
Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ data 0060 0037 = 55. bytes (rel,con,ram)
Addr Global Symbol ----- -------------------------------- 0060 __data_start 0060 _TxAddress 0064 _RFConf 006F _table 007C _black 007E _changeline 0081 _title 0085 _showflag 0087 _val 0089 _data_end 008B _titlevalue 0097 __data_end
Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ bss 0097 0272 = 626. bytes (rel,con,ram)
Addr Global Symbol ----- -------------------------------- 0097 _DISK_BASE_BUF 0097 __bss_start 0297 _mCmdParam 02B5 _ExReceiveBuffer 02B8 _ReceiveBuffer 02BB _CH375v26 02BC _CH375v25 02BE _CH375v19 02C2 _CH375v18 02C3 _CH375v17 02C7 _CH375v14 02C9 _CH375v13 02CA _CH375v12 02CB _CH375v11 02CC _CH375v09 02D0 _CH375v08 02D4 _CH375v07 02D5 _CH375v06 02D7 _CH375v04 02D9 _CH375v03 02DD _CH375v02 02E1 _CH375v01 02E5 _pDISK_BASE_BUF 02E7 _CH375vSectorSize 02E9 _CH375Version2 02EA _CH375vFdtOffset 02EC _CH375vFdtLba 02F0 _CH375vDataStart 02F4 _CH375vDiskRoot 02F8 _CH375vCurrentOffset 02FC _CH375vFileSize 0300 _CH375vStartCluster 0304 _CH375vSecPerClus 0305 _CH375vDiskFat 0306 _CH375LibConfig 0307 _CH375DiskStatus 0308 _CH375IntStatus 0309 __bss_end
Area Start End Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ vector 0000 0004 = 4. bytes (abs,ovr,rom)
Files Linked [ module(s) ]
C:\icc\lib\crtatmega.o [ crtatmega.s ] nrf905.o [ nrf905.c ] delay.o [ delay.c ] main.o [ main.c ] [ CH375BYT.s, CH375MAI.s, strcpy.s, asave.s, gpop2.s, gpop3.s, gpop4.s, gpop5.s, gpush.s, lsl16.s, lsl32.s ] [ lsl8.s, lsr16.s, lsr32.s ]
User Global Definitions
ram_end = 0x45f hwstk_size = 0x10
User Base Address Definitions
func_lit = 0x54 data = 0x60 eeprom:1.512
USB口的电源电压为5V稍多,和单片机两端电压相同。 UD+和UD-两端的对地电压为分别约是3.4和0。
ram_end = 0x45f 这个说明你的RAM超出了单片机的RAM空间,MEGA16的RAM为1K(0X400),RAM超出的话肯定不能操作。还有你编译的时候,CODE占程序空间多少?
这是便宜以后的: C:\icc\bin\imakew -f ch375b.mak iccavr -o ch375b -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @ch375b.lk -lch375 -lcatmega Device full. warning: COFF no struct tag '_CMD_PARAM' found for symbol index 530 Done.
91% 是这个数字吗?
你监视一下是不是程序死在等中断的地方了?你看一下CH375HF*.H文件中有一个QueryInterrupt是不是在这里死机了。 另外建议你换MCU,现在只是加进去库就用了91%的代码空间了。或者你换为CH376芯片
现在CH375LibInit()通过,CH375DiskConnect()也通过,说明中断应该没有问题的吧?。CH375DiskReady()和中断有关系吗? 这是中断函数: #ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */ void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */ { #ifdef CH375_INT_WIRE /* 查询中断引脚 */ while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */ #else /* 对于CH375B芯片还可以查询命令端口的位7 */ while ( xReadCH375Cmd( ) & 0x80 ); /* 查询CH375B的命令端口的位7为1说明中断引脚输出高电平则等待 */ #endif xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取当前中断状态,发出命令后至少延时2uS */ CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */ } #else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */ void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */ { while ( CH375IntStatus == 0 ); /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */ }
程序死在CH375DiskReady(),前天晚上有返回值,但不是正确值,昨天就没有返回值了。
查了查,ATmega16l的ram应该是够用的的吧?。有个朋友他用atmega16+ch375b+u盘实现数据的存储功能,也是用的库函数,已经实现了。 现在只想用atmega16+ch375b实现往U盘写东西,毕竟做了一段时间了,还有办法实现吗? 谢谢各位朋友,不胜感激。
谢谢