最近正在學(xué)習(xí)CH376S操作U盤,我試著在U盤的根目錄下新建一個(gè)TXT文件并在文件里寫入一些字符串。程序打印出來的信息顯示文件創(chuàng)建成功,字符串寫入也成功,可是插到電腦上打開優(yōu)盤發(fā)現(xiàn)創(chuàng)建的這些文件的文件名里面含有特殊的字符,而且文件打不開,如下圖所示
程序見二樓。求大神指點(diǎn)
最近正在學(xué)習(xí)CH376S操作U盤,我試著在U盤的根目錄下新建一個(gè)TXT文件并在文件里寫入一些字符串。程序打印出來的信息顯示文件創(chuàng)建成功,字符串寫入也成功,可是插到電腦上打開優(yōu)盤發(fā)現(xiàn)創(chuàng)建的這些文件的文件名里面含有特殊的字符,而且文件打不開,如下圖所示
程序見二樓。求大神指點(diǎn)
/*
?* main.c
?*
?* ?Created on: 2010-10-8
?* ? ? ?Author: Administrator
?*/
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "system.h"
#include
#include
//CH375命令定義
#define GET_IC_VER0x01//獲取CH376芯片以及固件版本
#define SET_BAUDRATE 0x02//設(shè)置串口通訊波特率
#define ENTER_SLEEP0x03//進(jìn)入低功耗睡眠掛起狀態(tài)
#define RESET_ALL 0x05//執(zhí)行硬件復(fù)位
#define CHECK_EXIST0x06//測試工作狀態(tài),按位取反
//#define GET_MAX_LUN0x0a//獲取USB存儲(chǔ)設(shè)備最大邏輯單元號(hào)
//#define SET_DISK_LUN 0x0b//設(shè)置USB存儲(chǔ)設(shè)備的當(dāng)前邏輯單元號(hào)
//#define SET_PKT_P_SEC 0x0b//設(shè)置USB存儲(chǔ)設(shè)備的每扇區(qū)數(shù)據(jù)包總數(shù)
#define SET_USB_MODE 0x15//設(shè)置USB工作模式命令
#define TEST_CONNECT 0x16//檢查USB設(shè)備的連接狀態(tài)
#define ABORT_NAK 0x17//放棄當(dāng)前NAK的重試
#define GET_STATUS 0x22//獲取中斷狀態(tài)并取消請(qǐng)求
#define RD_USB_DATA 0x27//從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊
#define WR_USB_DATA7 0x2c//向USB主機(jī)端點(diǎn)的輸出緩沖區(qū)寫入數(shù)據(jù)塊
#define DISK_INIT 0x51//初始化USB存儲(chǔ)設(shè)備
#define DISK_SIZE 0x53//獲取USB存儲(chǔ)設(shè)備的容量
#define DISK_READ 0x54 //從USB存儲(chǔ)設(shè)備讀數(shù)據(jù)塊
#define DISK_RD_G0 0x55//繼續(xù)USB存儲(chǔ)設(shè)備的讀操作
#define DISK_WRITE 0x56//向USB存儲(chǔ)設(shè)備寫數(shù)據(jù)塊
#define DISK_WR_GO 0x57//繼續(xù)USB存儲(chǔ)設(shè)備的寫操作
//#define DISK_INQUIRY 0x58//查詢USB存儲(chǔ)設(shè)備的特性
#define DISK_READY 0x59//檢查USB存儲(chǔ)設(shè)備是否就緒
//#define DISK_R_SENSE 0x5a//檢查USB存儲(chǔ)設(shè)備的錯(cuò)誤
#define SET_FILE_NAME 0x2f
#define FILE_CREATE 0x34
#define FILE_CLOSE 0x36
#define BYTE_WRITE 0x3c
#define BYTE_WR_GO 0x3d
#define WR_REQ_DATA 0x2d
//CH375中斷狀態(tài)定義
#define USB_INT_SUCCESS 0x14//USB事務(wù)或者傳輸操作成功
#define USB_INT_CONNECT 0x15 //檢查到USB設(shè)備連接事件
#define USB_INT_DISCONNECT 0x16 //檢查到USB設(shè)備斷開事件
#define USB_INT_BUF_OVER 0x17//USB傳輸?shù)臄?shù)據(jù)有誤或者數(shù)據(jù)太多緩沖區(qū)溢出
#define USB_INT_DISK_READ 0x1d//USB存儲(chǔ)設(shè)備讀操作,請(qǐng)求數(shù)據(jù)讀出
#define USB_INT_DISK_WRITE 0x1e//USB存儲(chǔ)設(shè)備寫操作,請(qǐng)求數(shù)據(jù)寫入
#define USB_INT_DISK_ERR 0x1f//USB 存儲(chǔ)設(shè)備操作失敗
//函數(shù)申明
alt_u8 init_usb(void);//CH376初始化并等待U盤插入
alt_u8 init_umem(void);//U盤存儲(chǔ)器初始化
alt_u8 umem_sec_read(alt_u32 lab);//讀取U盤一個(gè)扇區(qū)
alt_u8 umem_sec_write(alt_u32 lab);//U盤一個(gè)扇區(qū)寫入
void write_command_to_usb(alt_u8 command);//寫命令到CH376
void write_data_to_usb(alt_u8 data);//寫數(shù)據(jù)到CH376
alt_u8 read_data_from_usb(void);//從CH376讀出數(shù)據(jù)
void delayus(alt_u32 cnt);//短延時(shí)函數(shù)
alt_u8 ch375_intflag;//CH375中斷標(biāo)志位,1表示產(chǎn)生中斷
alt_u8 ch375_status;//CH375中斷狀態(tài)數(shù)據(jù)
alt_u8 URD_BUFFER[512];//U盤數(shù)據(jù)讀取緩沖(512B)
alt_u8 UWR_BUFFER[512];//U盤數(shù)據(jù)寫入緩沖(512B)
//////////////////////////////////////////////////////////////////////
//函數(shù)名:handle_usbirq_interrupts
//功 ? ? 能:CH375中斷函數(shù)
//輸 ? ? 入:無
//返 ? ? 回:無
//////////////////////////////////////////////////////////////////////
static void handle_usbirq_interrupts(void)
{
? ? //獲取中斷狀態(tài)并取消請(qǐng)求
? ? write_command_to_usb(GET_STATUS);//發(fā)送命令
? ? ch375_status = read_data_from_usb();//讀取當(dāng)前狀態(tài)
? ? ch375_intflag = 1;//中斷標(biāo)志位置位
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:main
//功 ? ? 能:主函數(shù)
//輸 ? ? 入:無
//返 ? ? 回:alt_u8
//////////////////////////////////////////////////////////////////////
alt_u8 main()
{
alt_u16 i;
init_usb();//CH375初始化并等待U盤插入
init_umem();//U盤存儲(chǔ)器初始化
while(1)
{
printf("創(chuàng)建一個(gè)TXT文件... ...\n");
write_command_to_usb(SET_FILE_NAME);
delayus(1000);
send_string_to_usb("/HOW.TXT\0",9);
delayus(1000);
write_command_to_usb(FILE_CREATE);
while(ch375_intflag != 1);
ch375_intflag = 0;
if(ch375_status == USB_INT_SUCCESS)
{
printf("成功\n");
}
else
{
printf("失敗--%d\n",ch375_status);
while(1);
}
write_command_to_usb(BYTE_WRITE);
write_data_to_usb(28);
write_data_to_usb(0);
while(ch375_intflag != 1);
ch375_intflag = 0;
if(ch375_status == USB_INT_DISK_WRITE)
? ?{
? ?write_command_to_usb(WR_REQ_DATA);
? ?delayus(1000);
? ?printf("需要寫入txt的數(shù)據(jù)量為: %d\n",read_data_from_usb());
}
else
{
? ?printf("失敗--%d\n",ch375_status);
while(1);
}
send_string_to_usb("Hello,USB!",10);
send_string_to_usb("U盤TXT文本創(chuàng)建成功",18);
write_command_to_usb(BYTE_WR_GO);
while(ch375_intflag != 1);
ch375_intflag = 0;
if(ch375_status == USB_INT_SUCCESS)
{
printf("txt文本數(shù)據(jù)寫入成功\n");
}
else
{
printf("第二次TXT文本數(shù)據(jù)寫入失敗--%d\n",ch375_status);
while(1);
}
write_command_to_usb(FILE_CLOSE);
write_data_to_usb(1);
printf("TXT文本創(chuàng)建并寫入完成!\n");
while(1);
}
//umem_sec_read(0);//讀取U盤第0扇區(qū)
/*
umem_sec_read(1000000);//讀取U盤第1000000扇區(qū)
for(i=0;i<512;i++)
{
UWR_BUFFER[i] = i;
}
umem_sec_write(1000000);//U盤第1000000扇區(qū)寫入
umem_sec_read(1000000);//讀取U盤第1000000扇區(qū)
*/
return 0;
}
void send_string_to_usb(alt_8 *str,alt_u8 str_len)
{
alt_u8 i;
//向USB主機(jī)端點(diǎn)的輸出緩沖區(qū)寫入數(shù)據(jù)塊,WR_USB_DATA7命令
write_command_to_usb(WR_USB_DATA7);
/*該命令向USB主機(jī)端點(diǎn)的輸出緩沖區(qū)或者USB 端點(diǎn)2的上傳緩沖區(qū)寫入數(shù)據(jù)塊。首先寫入的輸入
數(shù)據(jù)是數(shù)據(jù)塊長度,也就是后續(xù)數(shù)據(jù)流的字節(jié)數(shù)。數(shù)據(jù)塊長度的有效值是0 至64,如果長度不為0,
則單片機(jī)必須將后續(xù)數(shù)據(jù)逐個(gè)寫入CH375。*/
delayus(1000);
//寫入數(shù)據(jù)塊長度數(shù)據(jù)
write_data_to_usb(str_len);
//寫入固定長度數(shù)據(jù)字節(jié)
for(i=0;i
{
//寫入數(shù)據(jù)
write_data_to_usb(str[i]);
}
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:init_usb
//功 ? ? 能:CH376初始化并等待U盤插入
//輸 ? ? 入:無
//返 ? ? 回:alt_u8 1:成功,0--失敗
//////////////////////////////////////////////////////////////////////
alt_u8 init_usb(void)
{
//alt_u8 tmp;
alt_u8 temp = 0;//臨時(shí)變量
//初始化全局變量
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
ch375_status = 0;//清除 CH375中斷寄存器
//初始化CH376控制端口
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,1);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_CS_BASE,1);
//使能CH376中斷信號(hào)
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_USB_INT_BASE,1);
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ù)
//設(shè)置USB工作模式
write_command_to_usb(SET_USB_MODE);//送命令
delayus(200);
write_data_to_usb(0x06);//切換到已啟用的USB設(shè)備方式,外部固件模式
delayus(200);
/*
模式代碼為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總線;
*/
//CH375芯片讀寫測試
printf("CH375芯片讀寫測試……\n");
//讀取并打印固件版本號(hào)
write_command_to_usb(GET_IC_VER);//發(fā)送命令
temp = read_data_from_usb()-0x40;//讀取版本信息
printf("固件版本號(hào)為:0x%x\n",temp);//打印版本信息
//測試工作狀態(tài),按位取反
write_command_to_usb(CHECK_EXIST);//發(fā)送命令
write_data_to_usb(0xaa);//寫入數(shù)據(jù)0xaa
temp = read_data_from_usb();//讀取寫入數(shù)據(jù)取反結(jié)果,即0xaa取反應(yīng)為0x55
if(temp == 0x55) printf("測試工作狀態(tài):成功\n");//打印測試結(jié)果
else
{
printf("測試工作狀態(tài):失敗\n");
return(0);
}
printf("等待USB設(shè)備連接事件……\n");//打印事件
do{//查詢當(dāng)前USB設(shè)備的連接狀態(tài)
write_command_to_usb(TEST_CONNECT);
temp = read_data_from_usb();//讀取USB設(shè)備的連接狀態(tài)
delayus(600000);
} while(temp != 0x15);//檢測到USB設(shè)備連接事件
printf("檢測到USB設(shè)備連接事件:檢查到U盤插入\n");//打印事件
return(1);
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:init_umen
//功 ? ? 能:U盤存儲(chǔ)器初始化
//輸 ? ? 入:無
//返 ? ? 回:alt_u8 1:成功,0--失敗
//////////////////////////////////////////////////////////////////////
alt_u8 init_umem(void)
{
alt_u8 i;
alt_u8 mem[8];//U盤存儲(chǔ)量
//初始化USB存儲(chǔ)設(shè)備
printf("\n初始化USB存儲(chǔ)設(shè)備……\n");//打印事件
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
write_command_to_usb(DISK_INIT);//發(fā)送命令
while(ch375_intflag != 1);//等待中斷產(chǎn)生
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
if(ch375_status == USB_INT_SUCCESS) printf("初始化USB存儲(chǔ)設(shè)備:成功\n");
else
{
printf("初始化USB存儲(chǔ)設(shè)備:失敗——0x%x\n",ch375_status);
while(1);
}
//檢查USB存儲(chǔ)設(shè)備是否就緒
printf("等待USB存儲(chǔ)設(shè)備就緒……\n");//打印事件
do{
delayus(10000);
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
write_command_to_usb(DISK_READY);//發(fā)送命令
while(ch375_intflag != 1);//等待中斷產(chǎn)生
} while(ch375_status != USB_INT_SUCCESS);
printf("USB存儲(chǔ)設(shè)備已經(jīng)就緒\n");//打印事件
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
//獲取USB存儲(chǔ)設(shè)備的容量
printf("獲取USB存儲(chǔ)設(shè)備的容量……\n");//打印事件
write_command_to_usb(DISK_SIZE);//發(fā)送命令
while(ch375_intflag != 1);//等待中斷產(chǎn)生
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
if(ch375_status == USB_INT_SUCCESS)
{
printf("獲取USB存儲(chǔ)設(shè)備的容量:成功\n");
write_command_to_usb(RD_USB_DATA);//發(fā)送命令
//讀取并打印USB存儲(chǔ)設(shè)備容量
read_data_from_usb();//讀取第一個(gè)字節(jié),即后續(xù)數(shù)據(jù)長度,為8
for(i=0;i<8;i++)//連續(xù)讀取8個(gè)字節(jié)數(shù)據(jù)
{
mem[i] = read_data_from_usb();
}
printf("\t總扇區(qū)數(shù)為:%d\n",((mem[0]<<24)+(mem[1]<<16)+(mem[2]<<8)+mem[3]));
printf("\t每個(gè)扇區(qū)字節(jié)數(shù)為:%dB\n",((mem[4]<<24)+(mem[5]<<16)+(mem[6]<<8)+mem[7]));
printf("\t總存儲(chǔ)量為:%dMB\n",((((mem[0]<<24)+(mem[1]<<16)+(mem[2]<<8)+mem[3]))>>12)*((((mem[4]<<24)+(mem[5]<<16)+(mem[6]<<8)+mem[7]))>>8));
return(1);
}
else
{
printf("獲取USB存儲(chǔ)設(shè)備的容量:失敗——0x%x\n",ch375_status);
return(0);
}
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:umem_sec_read
//功 ? ? 能:讀取U盤一個(gè)扇區(qū)
//輸 ? ? 入:alt_u32 lab:LAB地址,即扇區(qū)號(hào)(此外使用了全局?jǐn)?shù)組URD_BUFFER)
//返 ? ? 回:alt_u8 1:成功,0--失敗
//////////////////////////////////////////////////////////////////////
alt_u8 umem_sec_read(alt_u32 lab)
{
alt_u8 i;
alt_u16 cnt = 0;
alt_u8 temp = 0;//臨時(shí)變量
//從USB存儲(chǔ)設(shè)備讀數(shù)據(jù)塊
printf("\n從U盤讀取第%d扇區(qū)數(shù)據(jù)塊……\n",lab);//打印事件
write_command_to_usb(DISK_READ);//發(fā)送命令
write_data_to_usb(lab);//起始地址:LAB地址的最低字節(jié)0x00
write_data_to_usb(lab>>8);//起始地址:LAB地址的較低字節(jié)0x00
write_data_to_usb(lab>>16);//起始地址:LAB地址的較高字節(jié)0x00
write_data_to_usb(lab>>24);//起始地址:LAB地址的最高字節(jié)0x00
write_data_to_usb(0x01);//數(shù)據(jù)長度:扇區(qū)數(shù)0x01
while(1)//執(zhí)行數(shù)據(jù)讀取操作
{
while(ch375_intflag != 1);//等待中斷產(chǎn)生
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
if(ch375_status == USB_INT_DISK_READ)//USB存儲(chǔ)設(shè)備讀操作,請(qǐng)求數(shù)據(jù)讀出
{
write_command_to_usb(RD_USB_DATA);//發(fā)送讀取數(shù)據(jù)命令
temp = read_data_from_usb();//讀取第一個(gè)字節(jié),即后續(xù)數(shù)據(jù)長度,應(yīng)為64
for(i=0;i
{
URD_BUFFER[cnt++] = read_data_from_usb();
printf("0x%2x,",URD_BUFFER[cnt-1]);
if((i==15) || (i==31) || (i==47) || (i==63)) printf("\n");//每16個(gè)數(shù)據(jù)換行
}
write_command_to_usb(DISK_RD_G0);//發(fā)送繼續(xù)USB存儲(chǔ)設(shè)備的讀操作命令
}
else if(ch375_status == USB_INT_SUCCESS)
{
printf("讀取U盤第%d扇區(qū)數(shù)據(jù):成功\n",lab);
break;
}
else
{
printf("讀取U盤第%d扇區(qū)數(shù)據(jù):失敗——0x%x\n",lab,ch375_status);
return(0);
}
}
return(1);
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:umem_sec_write
//功 ? ? 能:U盤一個(gè)扇區(qū)寫入
//輸 ? ? 入:alt_u32 lab:LAB地址,即扇區(qū)號(hào)(此外使用了全局?jǐn)?shù)組UWR_BUFFER)
//返 ? ? 回:alt_u8 1:成功,0--失敗
//////////////////////////////////////////////////////////////////////
alt_u8 umem_sec_write(alt_u32 lab)
{
alt_u8 i;
alt_u16 cnt = 0;
//從USB存儲(chǔ)設(shè)備讀數(shù)據(jù)塊
printf("\n向U盤寫入第%d扇區(qū)數(shù)據(jù)塊……\n",lab);//打印事件
write_command_to_usb(DISK_WRITE);//發(fā)送命令
write_data_to_usb(lab);//起始地址:LAB地址的最低字節(jié)0x00
write_data_to_usb(lab>>8);//起始地址:LAB地址的較低字節(jié)0x00
write_data_to_usb(lab>>16);//起始地址:LAB地址的較高字節(jié)0x00
write_data_to_usb(lab>>24);//起始地址:LAB地址的最高字節(jié)0x00
write_data_to_usb(0x01);//數(shù)據(jù)長度:扇區(qū)數(shù)0x01
while(1)//執(zhí)行數(shù)據(jù)寫入操作
{
while(ch375_intflag != 1);//等待中斷產(chǎn)生
ch375_intflag = 0;//清除CH375中斷標(biāo)志位
if(ch375_status == USB_INT_DISK_WRITE)//USB存儲(chǔ)設(shè)備讀操作,請(qǐng)求數(shù)據(jù)寫入
{
write_command_to_usb(WR_USB_DATA7);//發(fā)送寫入數(shù)據(jù)命令
write_data_to_usb(64);//寫入第一個(gè)字節(jié),即后續(xù)數(shù)據(jù)長度,為64
for(i=0;i<64;i++)//連續(xù)寫入64個(gè)字節(jié)數(shù)據(jù)
{
write_data_to_usb(UWR_BUFFER[cnt++]);
}
write_command_to_usb(DISK_WR_GO);//發(fā)送繼續(xù)USB存儲(chǔ)設(shè)備的讀操作命令
}
else if(ch375_status == USB_INT_SUCCESS)
{
printf("寫入U(xiǎn)盤第%d扇區(qū)數(shù)據(jù):成功\n",lab);
break;
}
else
{
printf("寫入U(xiǎn)盤第%d扇區(qū)數(shù)據(jù):失敗——0x%x\n",lab,ch375_status);
return(0);
}
}
return(1);
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:write_command_to_usb
//功 ? ? 能:寫命令到CH375
//輸 ? ? 入:alt_u8 command----寫入命令
//返 ? ? 回:無
//////////////////////////////////////////////////////////////////////
void write_command_to_usb(alt_u8 command)
{
//命令操作 A0=1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_A0_BASE,1);
//設(shè)置USB_DB為輸出
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_USB_DB_BASE,0xff);
//送命令到USB_DB
IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_DB_BASE,command);
//拉低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(10);
//拉高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ù)名:write_data_to_usb
//功 ? ? 能:寫數(shù)據(jù)到CH376
//輸 ? ? 入:alt_u8 data----寫入數(shù)據(jù)
//返 ? ? 回:無
//////////////////////////////////////////////////////////////////////
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,0xff);
//送數(shù)據(jù)到USB_DB
IOWR_ALTERA_AVALON_PIO_DATA(PIO_USB_DB_BASE,data);
//拉低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(10);
//拉高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ù)名:read_data_from_usb
//功 ? ? 能:從CH376讀出數(shù)據(jù)
//輸 ? ? 入:無
//返 ? ? 回:alt_u8----讀出數(shù)據(jù)
//////////////////////////////////////////////////////////////////////
alt_u8 read_data_from_usb(void)
{
alt_u8 data = 0;//返回?cái)?shù)據(jù)變量定義
//數(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);
//拉低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(10);
//讀取數(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é)束
delayus(1);
return data;
}
//////////////////////////////////////////////////////////////////////
//函數(shù)名:delayus
//功 ? ? 能:短延時(shí)函數(shù)
//輸 ? ? 入:alt_u32 cnt----延時(shí)值
//返 ? ? 回:void
//////////////////////////////////////////////////////////////////////
void delayus(alt_u32 cnt)
{
int i;
for(i=0;i
}
你好:
????你程序里的send_string_to_usb("/HOW.TXT\0",9);這個(gè)函數(shù)就寫錯(cuò)了,使用SET_FILE_NAME命令后面跟隨的直接是文件名字符串,不需要長度等。具體實(shí)現(xiàn)參考我們提供的例程中的FILE_SYS.c文件中CH376SetFileName( name )這個(gè)函數(shù)。
非常感謝幫助,已經(jīng)修改了程序,可以正常工作了