ch375調(diào)試問題

各位前輩: 我在調(diào)試CH375時(shí)遇到以下問題: 設(shè)置好內(nèi)置固件模式后,安裝驅(qū)動(dòng)程序正常,USB設(shè)備枚舉成功,用調(diào)試工具傳數(shù)據(jù)時(shí),程序也能進(jìn)入中斷,準(zhǔn)備中斷程序中看一下時(shí)否能正確接收數(shù)據(jù),以為很順利,可是發(fā)現(xiàn)問題了,用CH375_RD_DAT_PORT()讀數(shù)據(jù)時(shí),發(fā)現(xiàn)總是返回0xff,程序的都檢查了好多次,還是這樣,非常郁悶,為什么寫命令和數(shù)據(jù)都能成功,可是讀的時(shí)候不行了呢? 請(qǐng)那位好心我?guī)蛶臀野?拜謝!

/******************************************* CH375B驅(qū)動(dòng)程序V0.1 MCU:ATmega128L OSC:8MHz *******************************************/ #include "CH375INC.H" #include /******************************************* INT:pin26(PD1) CH375_CS:pin39(PC4),對(duì)于USB設(shè)備可以將此引腳接地 CH375_A0:pin40(PC5) CH375_WR:pin12(PB2) CH375_RD:pin13(PB3) ********************************************/

#define CH375_WR PORTB.2 #define CH375_RD PORTB.3 #define CH375_CS PORTC.4 #define CH375_A0 PORTC.5 #define CH375_DQ PORTA #define CH375_DQ1 PINA

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ DDRA = 0xff; DDRB |= 0x06; DDRC |= 0x30; delay_us(2); CH375_DQ = cmd; CH375_A0 = 1; //選擇CH375的命令口 CH375_RD = 1; CH375_CS = 0; //使能ch375 CH375_WR = 0; #asm("NOP"); //CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; // DDRA = 0x00; //將數(shù)據(jù)端口置為輸入 // PORTA = 0xff; //使能內(nèi)部上拉電阻 delay_us(2); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ DDRA = 0xff; DDRB |= 0x06; DDRC |= 0x30; delay_us(1); CH375_DQ = dat; CH375_A0 = 0; CH375_RD = 1; CH375_CS = 0; CH375_WR = 0; #asm("NOP"); //CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖 CH375_WR = 1; CH375_CS = 1; // DDRA = 0x00; // PORTA = 0xFF; //使能內(nèi)部上拉電阻 delay_us(1); }

unsigned char CH375_RD_DAT_PORT(void) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ unsigned char dat = 0; DDRA = 0x00; //將數(shù)據(jù)端口設(shè)置為輸入 DDRB |= 0x06; DDRC |= 0x30; CH375_A0 = 0; CH375_WR = 1; CH375_CS = 0; CH375_RD = 0; dat = PINA; CH375_RD = 1; CH375_CS = 1; return dat; }

void CH375_INIT() { unsigned char i; unsigned char str[10]; lcd_init(); /* 測(cè)試CH375是否正常工作,可選操作,通常不需要 */ CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //測(cè)試CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //寫入測(cè)試數(shù)據(jù) i = CH375_RD_DAT_PORT(); //返回?cái)?shù)據(jù)應(yīng)該是測(cè)試數(shù)據(jù)取反 sprintf(str,"#######%x",i); print_str(1,0,str); if(i != ~0x55) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(50); //延時(shí)50ms } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ delay_us(20); if(CH375_RD_DAT_PORT() == CMD_RET_SUCCESS) { sprintf(str,"枚舉成功!"); print_str(1,0,str); } /*******************外部中斷1初始化*************************/ EIMSK = 0x02; //使用外部中斷1 EICRA &= 0xf3; //低電平觸發(fā) #asm("sei"); //開全局中斷使能 }

[b]文字[/b][size=6]文字[/size][b]文字[/b]

是在什么中斷狀態(tài)下,調(diào)用CH375_RD_DAT_PORT()讀數(shù)據(jù)的?從程序中沒看出來(lái),一般是下傳中斷,才可以去讀數(shù)據(jù)


USB從機(jī)問題已經(jīng)解決,問題出在控制信號(hào)上引腳上,程序中引腳沒有和硬件對(duì)應(yīng)好! /////////////////////////////////////////////////////////////////////////////////

現(xiàn)在開始調(diào)試USB主機(jī),用的U盤是愛國(guó)者,64M的,調(diào)試過(guò)程遇到下面的問題: 1.初始化U盤后,插上U盤,ch375的ACK引腳成低電平指示燈亮,U盤指示燈亮,請(qǐng)問是不是說(shuō)明U盤已經(jīng)連接成功? 2.再識(shí)別U盤,就是讀U盤扇區(qū)ReadSector(0,1,diskbuff);diskbuff[0]讀到的數(shù)據(jù)是0x1d,請(qǐng)問WCH的工程師 if(diskbuff[0]==0xeb||diskbuff[0]==0xe9) 這句話是什么意思?望指教!! 3.DeviceInfo.StartSector = LSwapINT32(diskbuff[454],diskbuff[455],diskbuff[456],diskbuff[457]); 執(zhí)行完這句話后,StartSector 變成0x0000,也就是說(shuō)從diskbuff[454]到diskbuff[457]這四個(gè)字節(jié)數(shù)據(jù)都是0 了,這又是什么意思呢?不吝嗇 //********************************************************************* //讀取U盤扇區(qū): //addr_start 為起始扇區(qū)地址 //sector_cntcnt 為要讀取的扇區(qū)數(shù) //read_buf 為讀取數(shù)據(jù)的緩沖區(qū) //********************************************************************* uchar ReadSector(uint32 addr_start,uchar sector_cnt,uchar *read_buf) { uchar status; uint16 blockcnt; CH375_WR_CMD_PORT(CMD_DISK_READ); //從USB存儲(chǔ)器讀數(shù)塊 CH375_WR_DAT_PORT((uchar)addr_start); //寫入起始扇區(qū)地址 CH375_WR_DAT_PORT((uchar)(addr_start>>8)); CH375_WR_DAT_PORT((uchar)(addr_start>>16)); CH375_WR_DAT_PORT((uchar)(addr_start>>24)); CH375_WR_DAT_PORT(sector_cnt); //寫入扇區(qū)數(shù) for(blockcnt=(uint16)sector_cnt*8;blockcnt!=0;blockcnt--) { status = WaitInterrupt(); //等待中斷并獲取狀態(tài) if(status == USB_INT_DISK_READ) { CH375_WR_DAT_PORT(CMD_RD_USB_DATA); //從CH375緩沖區(qū)讀取數(shù)據(jù)塊 status = CH375_RD_DAT_PORT(); //讀取數(shù)據(jù)塊的長(zhǎng)度 while(status--) //讀取U盤數(shù)據(jù)到單片機(jī)緩沖區(qū) { *(read_buf++) = CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(CMD_DISK_RD_GO);//繼續(xù)執(zhí)行USB存儲(chǔ)器的讀操作 } else break; } if(blockcnt==0) { status = WaitInterrupt(); if(status == USB_INT_SUCCESS) { return 0; //操作成功,返回0 } } return status; //返回錯(cuò)誤狀態(tài) } /************************************************************************** 初始化U盤 **************************************************************************/ uchar InitDisk() { uchar status; CH375_WR_CMD_PORT(CMD_GET_STATUS); //獲取設(shè)備狀態(tài) status = CH375_RD_DAT_PORT(); if(status == USB_INT_DISCONNECT) //若U盤拔出,程序退出 { return status; } CH375_WR_CMD_PORT(CMD_DISK_INIT); //初始化USB存儲(chǔ)器 status = WaitInterrupt(); //等待中斷并獲取狀態(tài) if(status != USB_INT_SUCCESS) { return status; } CH375_WR_CMD_PORT(CMD_DISK_SIZE); //獲取USB存儲(chǔ)器容量 status = WaitInterrupt(); //等待中斷并獲取狀態(tài) if(status != USB_INT_SUCCESS) { delay_ms(250); CH375_WR_CMD_PORT(CMD_DISK_SIZE); //出錯(cuò)重試 status = WaitInterrupt(); } if(status != USB_INT_SUCCESS) { return status; } return 0; //初始化成功 } /************************************************************************** 識(shí)別U盤 **************************************************************************/ uchar IdentifyDisk() { uchar status; unsigned int ReservedSectorsNum; DeviceInfo.BPB_BytesPerSec=512; //每扇區(qū)字節(jié)數(shù)據(jù)暫假設(shè)為512 //DeviceInfo.BPB_BytesPerSec status = ReadSector(0,1,diskbuff); if(status!=0) { return status; } if(diskbuff[0]==0xeb||diskbuff[0]==0xe9) { DeviceInfo.StartSector = 0; } else { sprintf(str,"%04x",diskbuff[0]); print_str(2,0,str); DeviceInfo.StartSector = LSwapINT32(diskbuff[454],diskbuff[455],diskbuff[456],diskbuff[457]); status = ReadSector(DeviceInfo.StartSector,1,diskbuff); if(status != 0) { return status; } sprintf(str,"%04x",DeviceInfo.StartSector); print_str(2,2,str); } sprintf(str,"%x",diskbuff[82]); print_str(2,4,str); DeviceInfo.BPB_BytesPerSec=LSwapINT16(diskbuff[11],diskbuff[12]); //每扇區(qū)字節(jié)數(shù) DeviceInfo.BPB_SecPerClus=diskbuff[13]; //每簇扇區(qū)數(shù) ReservedSectorsNum=LSwapINT16(diskbuff[14],diskbuff[15]); //保留區(qū)扇區(qū)個(gè)數(shù) DeviceInfo.BPB_NumFATs=diskbuff[16]; //FAT表占用扇區(qū)數(shù) if(diskbuff[82]=='F'&&diskbuff[83]=='A'&&diskbuff[84]=='T'&&diskbuff[85]=='3'&&diskbuff[86]=='2') { DeviceInfo.BPB_TotSec32=LSwapINT32(diskbuff[32],diskbuff[33],diskbuff[34],diskbuff[35]); DeviceInfo.BPB_FATSz32=LSwapINT32(diskbuff[36],diskbuff[37],diskbuff[38],diskbuff[39]); DeviceInfo.RootStartCluster=LSwapINT32(diskbuff[44],diskbuff[45],diskbuff[46],diskbuff[47]); DeviceInfo.FatStartSector=DeviceInfo.StartSector+ReservedSectorsNum; DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz32; DeviceInfo.TotCluster=(DeviceInfo.BPB_TotSec32-DeviceInfo.FirstDataSector+1)/DeviceInfo.BPB_SecPerClus+1; // DirStartCluster32=DeviceInfo.RootStartCluster; DeviceInfo.FAT=1; //FAT16=0,FAT32=1; sprintf(str,"Disk Enum success!"); print_str(2,0,str); } else { DeviceInfo.BPB_RootEntCnt=LSwapINT16(diskbuff[17],diskbuff[18]); DeviceInfo.BPB_RootEntCnt=(DeviceInfo.BPB_RootEntCnt)*32/DeviceInfo.BPB_BytesPerSec; DeviceInfo.BPB_TotSec16=LSwapINT16(diskbuff[19],diskbuff[20]); DeviceInfo.BPB_FATSz16=LSwapINT16(diskbuff[22],diskbuff[23]); DeviceInfo.FatStartSector=DeviceInfo.StartSector+ReservedSectorsNum; DeviceInfo.RootStartSector=DeviceInfo.StartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz16+ReservedSectorsNum; DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+DeviceInfo.BPB_NumFATs*DeviceInfo.BPB_FATSz16+DeviceInfo.BPB_RootEntCnt; DeviceInfo.FAT=0; } return 0; }


if(diskbuff[0]==0xeb||diskbuff[0]==0xe9) 一般來(lái)說(shuō)DBR的數(shù)據(jù)也就是邏輯盤的第0號(hào)扇區(qū)的數(shù)據(jù)開始就是0XEB,0XE9,您可以下載WINHEX這個(gè)軟件去看看就知道了.網(wǎng)上很容易下載到. 第2個(gè)問題: 對(duì)有MBR的U盤來(lái)說(shuō),這是來(lái)計(jì)算從磁盤開始到本分區(qū)的扇區(qū)數(shù),相對(duì)扇區(qū)數(shù)( 從該磁盤的開始到該分區(qū)的開始的位移量,以扇區(qū)來(lái)計(jì)算


謝謝,讀寫扇區(qū)問題已經(jīng)解決了,

請(qǐng)問如果我想支持讀寫FAT32格式的文件該如果操作,看了一下,似乎非學(xué)復(fù)雜!

對(duì)了,我沒有用沁恒提供的庫(kù),底層的驅(qū)動(dòng)都是通過(guò)實(shí)例文檔自己寫的,不知道你沒有好的方法來(lái)讀寫U盤文件


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频