fpga與CH376讀寫(xiě)u盤(pán),怎么老是失敗?

我用fpga和CH376芯片讀寫(xiě)u盤(pán),但是如下操作,總是失敗 write_command_to_usb(CHECK_EXIST); //發(fā)送命令 write_data_to_usb(0xaa); //寫(xiě)入數(shù)據(jù)0xaa delayus(1); temp = read_data_from_usb(); //讀取寫(xiě)入數(shù)據(jù)取反結(jié)果,即0xaa取反應(yīng)為0x55 if(temp == 0x55) printf("測(cè)試工作狀態(tài):成功\n"); //打印測(cè)試結(jié)果 else { printf("測(cè)試工作狀態(tài):失敗\n"); printf("固件版本號(hào)為:0x%x\n",temp); return(0); } 得到的固件版本號(hào)為:0xaa。不知為什么,求教?。。。。。。。。。。?/p>

1.獲取固件版本號(hào)的命令是0x01,不是CHECK_EXIST 2.0xaa不是CH376返回給你的, 應(yīng)該是前面發(fā)送的命令和數(shù)據(jù)CH376沒(méi)有響應(yīng) 3.檢查你的硬件連接,以及接口的讀寫(xiě)時(shí)序


哦,是的,我說(shuō)錯(cuò)了!獲取固件版本號(hào)的命令確實(shí)是0x01,我也發(fā)了。但是返回的就是0x01-0x40的值,也就是0xc1,也就是 write_data_to_usb什么就返回什么。我的初始化程序和讀寫(xiě)命令數(shù)據(jù)程序: alt_u8 init_usb(void) { //alt_u8 tmp; alt_u8 temp = 0; //臨時(shí)變量

//初始化全局變量 ch375_intflag = 0; //清除CH375中斷標(biāo)志位 ch375_status = 0; //清除 CH375中斷寄存器 //初始化CH375控制端口 IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_RD_BASE,1); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_WR_BASE,1); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,1); IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0xff); //使能CH375中斷信號(hào) IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_USB_INT_BASE,0x1); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_USB_INT_BASE,0); alt_irq_register(PIO_USB_INT_IRQ,PIO_USB_INT_BASE,handle_usbirq_interrupts); //注冊(cè)中斷函數(shù) //CH375硬件復(fù)位 write_command_to_usb(RESET_ALL); //送命令 delayus(40000); //delay 60ms

//設(shè)置USB工作模式 write_command_to_usb(SET_USB_MODE); //送命令 write_data_to_usb(0x06); //切換到已啟用的USB設(shè)備方式,外部固件模式; /* 模式代碼為00H時(shí)切換到未啟用的USB設(shè)備方式(上電或復(fù)位后的默認(rèn)方式); 模式代碼為01H時(shí)切換到已啟用的USB設(shè)備方式,外部固件模式; 模式代碼為02H時(shí)切換到已啟用的USB設(shè)備方式,內(nèi)置固件模式; 模式代碼為04H時(shí)切換到未啟用的USB主機(jī)方式; 模式代碼為05H時(shí)切換到已啟用的USB主機(jī)方式,不產(chǎn)生SOF包; 模式代碼為06H時(shí)切換到已啟用的USB主機(jī)方式,自動(dòng)產(chǎn)生SOF包; 模式代碼為07H時(shí)切換到已啟用的USB主機(jī)方式,復(fù)位USB總線; */ delayus(5); //>10us

//CH375芯片讀寫(xiě)測(cè)試 printf("CH375芯片讀寫(xiě)測(cè)試……\n"); //temp = read_data_from_usb(); //printf("固件版本號(hào)為:0x%x\n",temp); //讀取并打印固件版本號(hào) write_command_to_usb(GET_IC_VER); //發(fā)送命令 temp = read_data_from_usb(); //讀取版本信息-0x40 printf("固件版本號(hào)為:0x%x\n",temp); //打印版本信息

//測(cè)試工作狀態(tài),按位取反 write_command_to_usb(CHECK_EXIST); //發(fā)送命令 write_data_to_usb(0xbb); //寫(xiě)入數(shù)據(jù)0xaa delayus(1); temp = read_data_from_usb(); //讀取寫(xiě)入數(shù)據(jù)取反結(jié)果,即0xaa取反應(yīng)為0x55 if(temp == 0x55) printf("測(cè)試工作狀態(tài):成功\n"); //打印測(cè)試結(jié)果 else { printf("測(cè)試工作狀態(tài):失敗\n"); printf("固件版本號(hào)為:0x%x\n",temp); return(0); } return(1); }

////////////////////////////////////////////////////////////////////// //函數(shù)名:write_command_to_usb //功 能:寫(xiě)命令到CH375 //輸 入:alt_u8 command----寫(xiě)入命令 //返 回:無(wú) ////////////////////////////////////////////////////////////////////// void write_command_to_usb(alt_u8 command) { //延時(shí)>1.5us delayus(1); //命令操作 A0=1 //IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,1); //設(shè)置USB_DB為輸出 IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0x00); //送命令到USB_DB IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_DB_BASE,command); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,1); //拉低USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); //拉低USB_WR IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_WR_BASE,0); //延時(shí) //IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); delayus(1); //拉高USB_WR IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_WR_BASE,1); //拉高USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,1); //延時(shí)>1.5us //IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); //IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0xff); delayus(2); }

////////////////////////////////////////////////////////////////////// //函數(shù)名:write_data_to_usb //功 能:寫(xiě)數(shù)據(jù)到CH376 //輸 入:alt_u8 data----寫(xiě)入數(shù)據(jù) //返 回:無(wú) ////////////////////////////////////////////////////////////////////// void write_data_to_usb(alt_u8 data) { //數(shù)據(jù)操作 A0=0 //IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); //設(shè)置USB_DB為輸出 IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0x00); //送數(shù)據(jù)到USB_DB IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_DB_BASE,data); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); //拉低USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); //拉低USB_WR IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_WR_BASE,0); //延時(shí) //delayus(5); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); //拉高USB_WR IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_WR_BASE,1); //拉高USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,1); //延時(shí)>600ns IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0xff); delayus(1); }

////////////////////////////////////////////////////////////////////// //函數(shù)名:read_data_from_usb //功 能:從CH376讀出數(shù)據(jù) //輸 入:無(wú) //返 回:alt_u8----讀出數(shù)據(jù) ////////////////////////////////////////////////////////////////////// alt_u8 read_data_from_usb(void) { alt_u8 data = 0; //返回?cái)?shù)據(jù)變量定義 delayus(1); //數(shù)據(jù)操作 A0=0 IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); //設(shè)置USB_DB為輸入 IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0xff); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,0); //拉低USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); //拉低USB_RD IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_RD_BASE,0); //延時(shí)>30ns數(shù)據(jù)輸出有效,可以讀取 delayus(5); IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,0); //讀取數(shù)據(jù) data = IORD_ALTERA_AVALON_PIO_DATA(PIO_USB_DB_BASE); //拉高USB_RD IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_RD_BASE,1); //拉高USB_CS IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,1); //延時(shí),讀取結(jié)束>600ns delayus(1);

return data; }

////////////////////////////////////////////////////////////////////// //函數(shù)名:delayus //功 能:短延時(shí)函數(shù)(延時(shí)時(shí)間為(2+2*i)us) //輸 入:alt_u32 cnt----延時(shí)值 //返 回:void ////////////////////////////////////////////////////////////////////// void delayus(alt_u32 cnt) { alt_u32 i =0; while(i < cnt) { i++; } } 硬件上,只要把CH376連到fpga的通用I/O引腳就可以吧?其他還有什么要注意的請(qǐng)您指教!


先檢查硬件是否有問(wèn)題,以在郵件中恢復(fù)


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

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