本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
用U盘实现数据采集存储
目前正在研制的系统为大功率光伏阵列特性测试仪,其主要用于对各种规格、容量的光伏阵列进行I-V特性的测试,为光伏系统(并网、发电)的选型提供必要的参考。该系统需要人员采集光伏阵列的电压、电流、温度、日照等数据,由于该系统多用于野外,因此需要对所测得的数据进行存储以便进行I-V特性曲线的绘制及光伏阵列在各种不同的日照和温度下特性的推演。数据的采集及存储可由系统控制芯片通过SPI接口USB118模块通讯,并辅以大容量USB存储设备来完成。
在所设计的系统中采用了西安达泰电子有限责任公司提供的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<tempd;i++)
wr_data(app[i]); //app[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*/
}
/**************************************************************************
* 写入数据
* 功能: |
|