在所设计的系统中采用了西安达泰电子有限责任公司提供的USB118AD模块,其具有标准2.0协议及支持1G以上优盘的优点,这点非常适合于本系统经常在野外应用的特点,并且随产品所提供的串行通讯程序也可以很方便的移植到所采用的DSP平台上,大大简化了本系统在数据存储方面的程序设计工作。
此测试代码是基于MSP430F147和西安达泰电子的USB118AD模块的SPI测试程序。USB118AD实现将单片机得数据直接存储到U盘。
/***************************************************/
/*SPI初始化子程序 */
/***************************************************/
void SpiInit(void)
{
// P3SEL |= SDCLK + SDDI + SDDO; //P3.1--P3.3 for spi option select
P3SEL |= 0X0e; //P3口功能设置(SPI功能选择)
P3DIR |= BIT0; //设置IO口方向(P3.0 用于SPI片选控制)
P3OUT |= BIT0;
UCB0CTL1 |= UCSWRST; //设置SPI
UCB0CTL0 = 0xA9; //10(clk edge) 1(MSB first) 0(8bit) 1(master) 00(3SPI) 1(sync)
UCB0CTL1 = 0x80; //10(SMCLK)
UCB0BR0 = 0x04; //SPICLK 8M/4=2MHz;
UCB0BR1 = 0x00;
UCB0STAT = 0X00;
UCB0CTL1 &=~ UCSWRST;
}
/*SPI读数据*/
int rd_data(void)
{
int value;
P3OUT &=~ BIT0;
UCB0TXBUF=0xff;
while((UCB0STAT&UCBUSY)==0x01);
value = UCB0RXBUF;
P3OUT |= BIT0;
return value;
}
/*SPI写数据*/
void wr_data(uchar n)
{
P3OUT &=~ BIT0;
UCB0TXBUF=n;
while((UCB0STAT&UCBUSY)==0x01);
P3OUT |= BIT0;
}
/*************************************************************************
* 发送命令
*功能:向模块发送命令
*入口参数:命令数组
*出口参数:无
**************************************************************************/
void Send_Command(uchar com[64])
{
wr_data(0xaa);
Delay(20); //10uS左右的延时
wr_data(0xbb);
for(int c=0;c<64;c++)
{
wr_data(com[c]);
}
}
/*************************************************************************
* 接收命令
*功能: 从模块接收应答命令
*入口参数:应答信号
*出口参数:应答正确与否标志
**************************************************************************/
uchar Receive_Command(int rec)
{
do
{
rd[0] = rd_data();
}
while(rd[0]==0xff);
for(int idata=1;idata<64;idata++)
{rd[idata] = rd_data();}
if(rd[0] == rec&& rd[1]==0x01)
return 0;
else
return 1;
}
/*************************************************************************
* 接收数据
*功能: 从模块接收应答数据
*入口参数:无
*出口参数:应答数据—数组data[]
**************************************************************************/
void receive_data()
{
int num;
num = rd[4]+(rd[5]<<8);
if(num)
{
int d=0;
for(;num>0;num--)
{
data[d] = rd_data();
d++;
}
}
}
/************************************************************************* *发送数据
*功能: 向模块发送数据
*入口参数:待写入数组app[i]
*出口参数:无
**************************************************************************/
void write_data(int lx,int hx)
{
int tempd;
tempd = hx<<8 +lx ;
for(int i=0;i
}
/**************************************************************************
* 发送检测设备命令
* 入口参数:无
* 返回值:0-正常,1-无响应, 2-返回数据错误
***************************************************************************/
uchar USB118R_Detect(void)
{
uchar i,command[64];
command[0] = 0x01;
command[1] = 0x00;
for(i=2;i<64;i++)
{
command[i] = 0x20;
}
Send_Command(command);
return Receive_Command(0x04);
}
/**************************************************************************
* 获取磁盘空间
***************************************************************************/
uchar USB118R_GetDiskCapacity(void)
{
uchar i,command[64]; /*command数组用于存储命令字节*/
command[0]=0x12; /*命令字节赋值*/
command[1]=0x00;
for(i=2;i<64;i++)
command[i]=0x20;
Send_Command(command); /*发送命令 0x12,无数据字节*/
return Receive_Command(0x22); /*接收返回值并校验是否发送成功 */
/*校验码为0x22,0x01*/
}
/**************************************************************************
* 获取当前系统的版本号
***************************************************************************/
uchar USB118R_GetVersion(void)
{
uchar i,command[64]; /*command数组用于存储命令字节*/
command[0]=0x30; /*命令字节赋值*/
command[1]=0x00;
for(i=2;i<64;i++)
command[i]=0x20;
Send_Command(command); /*发送命令 0x30,无数据字节*/
return Receive_Command(0x40); /*接收返回值并校验是否发送成功*/
/* 校验码为0x40,0x01*/
}
/**************************************************************************
* 创建文件
* 功能:在U 盘上创建指定文件名的文件
* 入口参数:文件名, 8个字节;扩展名,3个字节
***************************************************************************/
uchar USB118R_Create(int fi,int fj,int fk)
{
uchar i;
uchar command[64]={0x07,"D","A","T","A","I","E"," "," ","T","X","T"};
/*命令码为0x07,文件名为DATAIE,扩展名为TXT*/
/*
*
*
* 根据FAT文件规范,在此可以添加文件
* 属性、创建时间等信息。
*
*
*
*/
for(i=12;i<33;i++)command[i]=0x20;
command[33]=0x00; /*命令字节赋值*/
for(i=34;i<64;i++)command[i]=0x20;
Send_Command(command); /*发送命令 0x07,无数据字节*/
return Receive_Command(0x0A); /*接收返回值并校验是否发送成功 */
/*校验码为0x0A,0x01*/
}
/**************************************************************************
* 列举文件
* 功能:列举目录下面的所有文件和文件夹
*lx,hx限制文件数量,每个文件名32B,修改文件数量限制时,同时要修改返回信息
*添加接收数据函数即可
***************************************************************************/
uchar USB118R_List(uchar lx,uchar hx) /*lx为USB118R_List命令返回数据长度*/
/*低字节;hx为高字节*/
{
uchar i,command[64]; /*command数组用于存储命令字节*/
command[0]=0x10; /*命令字节赋值*/
command[1]=0x00;
command[2]=0x20; /*返回数据长度低字节*/
command[3]=0x20; /*返回数据长度高字节*/
for(i=4;i<64;i++)
command[i]=0x20;
Send_Command(command); /*发送命令 0x10,无数据字节*/
return Receive_Command(0x20);
/*接收返回值及返回数据并校验是否发送成功 校验码为0x20,0x01*/
}
/**************************************************************************
* 读取文件
* 功能:读取已经打开的文件
* 入口参数:读取文件长度低字节,读取文件长度高字节
***************************************************************************/
uchar USB118R_Read(uchar lx,uchar hx)
{
uchar i,command[64]; /*command数组用于存储命令字节*/
uchar flag;
command[0]=0x08; /*命令字节*/
command[1]=lx; /*读取文件长度低字节*/
command[2]=hx; /*读取文件长度高字节*/
for(i=3;i<64;i++)
command[i]=0x20;
Send_Command(command); /*发送命令 0x08,无数据字节*/
flag = Receive_Command(0x0B);
/*接收返回值及返回数据并校验是否发送成功 校验码为0x0B,0x01*/
receive_data();
return flag;
}
/**************************************************************************
* 打开文件
* 功能: 在U 盘上打开指定文件名的文件
* 入口参数:A~H,文件名;x~z:扩展名
***************************************************************************/
uchar USB118R_Open(int fi,int fj,int fk)
{
uchar command[64]={0x06,"D","A","T","A","I","E"," "," ","T","X","T"};
Send_Command(command); /*发送命令 0x06,无数据字节*/
return Receive_Command(0x0D);
/*接收返回值并校验是否发送成功 校验码为0x0D,0x01*/
}
/**************************************************************************
* 删除文件
* 功能:删除指定的文件
* 入口参数:A~H,文件名;x~z:扩展名
***************************************************************************/
uchar USB118R_Remove(void)
{
uchar command[64]={0x11,0x00,"D","A","T","A","I","E"," "," ","T","X","T"};
/*命令码为0x11,文件名为DATAIE,扩展名为TXT*/
Send_Command(command); /*发送命令 0x11,无数据字节*/
return Receive_Command(0x21);
/*接收返回值并校验是否发送成功 校验码为0x21,0x01*/
}
/**************************************************************************
* 写入数据
* 功能: 向已经打开的文件中写入数据
* 入口参数:数据字节数
***************************************************************************/
uchar USB118R_Write(int lx,int hx)
{
uchar i,command[64]; /*command数组用于存储命令字节*/
command[0]=0x09; /*命令字节赋值*/
command[1]=0x00;
command[2]=lx; /*写入数据长度低字节*/
command[3]=hx; /*写入数据长度高字节*/
for(i=4;i<64;i++)
command[i]=0x20;
Send_Command(command); /*发送命令 0x09,有数据字节*/
write_data(lx,hx);
return Receive_Command(0x0C);
/*接收返回值并校验是否发送成功 校验码为0x0C,0x01*/
}
/**************************************************************************
* 设置指针
* 功能: 将文件指针移动到指定位置
* 入口参数:指针位置
***************************************************************************/
uchar USB118R_SetFilePointer(uchar para_1,uchar para_2,uchar para_3,uchar para_4)
{ /*参数para_1,para_2,para_3,para_4用来设置指针位置。低字节在前*/
uchar i,command[64]; /*command数组用于存储命令字节*/
command[0]=0x15; /*命令字节赋值*/
command[1]=0x00;
command[2]=para_1; /*设置指针位置*/
command[3]=para_2;
command[4]=para_3;
command[5]=para_4;
for(i=6;i<64;i++) /*命令字节赋值*/
command[i]=0x20;
Send_Command(command); /*发送命令 0x15,无数据字节*/
return Receive_Command(0x25);
/*接收返回值并校验是否发送成功 校验码为0x25,0x01*/
}
主函数根据需要,调用各个子函数。
(转载)