如果是windows标准外设置只需要编写USB设备程序。
自定义的HID设备还需要编写驱动程序,一般是相应的inf文件。
非标准的USB外设,windows不会识别,需要驱动程序帮windows来识并应用该USB外设,一般是VB VC之类的都可拿来写相应驱动程序
STC系列单片机为例:
首先,需要安装keil软件和STC_ISP程序下载软件
先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给单片机提供电源就可以观察单片机开发板或是自己搭建的板子上的现象了通过不断修改程序,下载程序,最终获得自己在实验板上想要的结果这样就可以了
实验板与PC机的连接:一般对现成购买的开发板来说,会有一个USB接口提供5v电源、提供通信或另一个USB用来下载接口驱动程序,同时有RS232串口,实现MAX232电平与单片机TTL电平之间转换,用来进行通信下载程序和数据;;对自己搭建的电路板来说,仍会有MAX232芯片和RS232串口用来实现程序的烧写,实现对单片机写入数据和程序的下载用的是RS232串口实现的程序烧写!
若要用USB来烧写,需要一个相应的ISP下载软件和硬件烧写器,一般这种烧写器价格不菲用的是USB口实现烧写程序!
一般的,烧写程序还是选用可以用ISP下载的,自己搭建个RS232串口的电路,简单实用,对单片机烧写程序就够用了
interface USB {
public void upload();
public void download();
}
public class UDisk implements USB{
public void download() {
// TODO Auto-generated method stub
Systemoutprintln("正在下载");
}
public void upload() {
// TODO Auto-generated method stub
Systemoutprintln("正在上传");
}
public static void main(String[] args) {
USB U1 = new UDisk();
U1download();
U1upload();
}
}
when wait_int =>
if int='0' then
ch376_next <= get_int;
next_state <= write_cmd;
reg2 <= "00100010";
elsif AES=upload then
ch376_next <= WR_USB;
next_state <= write_cmd;
reg2 <= "00101011";
up_s <= "01";
else
ch376_next <= wait_int;
next_state <= wait_delay;
end if;
#pragma NOAREGS //禁止编译器使用绝对寄存器寻址,一定要加上#include <REG52H> //51单片机头文件#include "CH375INCH" //CH372/CH375头文件 /////////////////////////////////////////////////说明: CH372总线地址// 采用别的方式,地址另外设定///////////////////////////////////////////////unsigned char volatile xdata CH375_CMD_PORT _at_ 0x03F1; unsigned char volatile xdata CH375_DAT_PORT _at_ 0x03F0; /延时程序//////////////////////////////////////////////////函数:delay2us//说明:延时2us//入口:无//返回:无/////////////////////////////////////////////// void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); } /////////////////////////////////////////////////函数:delay50ms//说明:延时50ms//入口:无//返回:无///////////////////////////////////////////////void Delay50ms( ) { unsigned char i, j; for ( i="200"; i!=0; i-- ) for ( j="250"; j!=0; j-- ); } /基本读写程序//////////////////////////////////////////////////函数:CH375_WR_CMD_PORT//说明:写USB命令//入口:unsigned char cmd:待写入命令//返回:无///////////////////////////////////////////////void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); CH375_CMD_PORT=cmd; delay2us(); } /////////////////////////////////////////////////函数:CH375_WR_DAT_PORT//说明:写一字节USB数据//入口:unsigned char dat:待写入一字节数据//返回:无///////////////////////////////////////////////void CH375_WR_DAT_PORT( unsigned char dat ) { CH375_DAT_PORT=dat; } /////////////////////////////////////////////////函数:CH375_RD_DAT_PORT//说明:读一字节USB数据//入口:无//返回:从CH372/CH375读一字节数据///////////////////////////////////////////////unsigned char CH375_RD_DAT_PORT( void ) { return( CH375_DAT_PORT ); } /初始化和中断服务程序//////////////////////////////////////////////////函数:CH375_Init//说明:CH372/CH375初始化//入口:无//返回:无///////////////////////////////////////////////void CH375_Init( ) { / 设置USB工作模式, 必要 *** 作 /unsigned char i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); //设置USB工作模式 CH375_WR_DAT_PORT( 2 ); //设置为内置固件模式 for ( i="100"; i!=0; i-- ) { / 等待 *** 作成功,通常需要等待10uS-20uS / if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } / 下面启用USB中断,CH372/CH375的INT#引脚可以连接到单片机的中断引脚,中断为低电平有效或者下降沿有效,如果不使用中断,那么也可以用查询方式,由单片机程序查询CH372/CH375的INT#引脚为低电平 /IT0 = 0; / 置外部信号为低电平触发 / IE0 = 0; / 清中断标志 / EX0 = 1; / 允许CH372中断,假定CH372的INT#引脚连接到单片机的INT0 /} /////////////////////////////////////////////////函数:mCh375Interrupt//说明:CH372/CH375中断程序//入口:无//返回:无///////////////////////////////////////////////void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char i, length; unsigned char data buffer[64]; unsigned char InterruptStatus; CH375_WR_CMD_PORT( CMD_GET_STATUS ); //获取中断状态并取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( ); //获取中断状态 //采用边沿触发的外部中断请求,CPU在相应中断后,自动清除中断标志 switch ( InterruptStatus ) { case USB_INT_BUS_RESET1: //USB总线复位 { break; } case USB_INT_BUS_RESET2: //USB总线复位 { break; } case USB_INT_BUS_RESET3: //USB总线复位 { break; } case USB_INT_BUS_RESET4: //USB总线复位 { break; } case USB_INT_EP0_SETUP: { //端点0 的接收器接收到数据,SETUP 事务成功,内部固件模式时不需要处理break; } case USB_INT_EP0_OUT: { //端点0 的接收器接收到数据,OUT 事务成功,内部固件模式时不需要处理 break; } case USB_INT_EP0_IN: { //端点0 的发送器发送完数据,IN 事务成功,内部固件模式时不需要处理 break; } case USB_INT_EP2_OUT: //批量端点/端点2接收到数据,OUT成功 { //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); length = CH375_RD_DAT_PORT( ); / 首先读取后续数据长度 / for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); //接收数据包 / -----------测试数据正确性,将接收到的命令包数据返回给PC机----------- / CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); / 向USB端点2的发送缓冲区写入数据块 / CH375_WR_DAT_PORT( length ); / 首先写入后续数据长度,回传刚接收到的数据长度 / for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer[ i ] ); / 数据返回,由计算机应用程序测试数据是否正确 / / ------------------------------------------------------------------------------------------------------ / break; } case USB_INT_EP2_IN: //批量端点/端点2发送完数据,IN成功 { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放当前USB缓冲区 break; } default: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); break; } } } /////////////////////////////////////////////////函数:main//说明:主程序。对CH372初始化,对USB进行读写及其他程序//入口:无//返回:无///////////////////////////////////////////////main( ) { Delay50ms( ); CH375_Init( ); //对CH375/CH372初始化EA = 1; //允许中断while(1);}
我来说下我做过的USB通信,我没有做过DSP跟上位机的通信,我只做过ARM类的STM32跟上位机的数据传递,虽然做过但是也不是很 懂,只是略知一二,我来说说我怎么做的吧,我是这么实现的:
USB是个很复杂的协议,你如果完全搞懂,我估计没有几个月专心钻研是不行的,但是如果只是能实现你的这个功能,我估计不是很复杂。
首先来说说USB通信:
USB通信传输方式分为四种:控制,中断,批量,同步传输四种,这个你可以看看网上资料,然后我用STM32通信,因为数据量不是很大,我用的是中断传输方式,但是DSP数据量应该会比较大,不知道中断传输行不行,但是一般问题不大。
传输方式说完了,再说说USB设备类型,你每次插usb设备到电脑上的时候就会有提示,这是一个什么设备,USB设备类型就是说的这个意思,是鼠标还是键盘还是别的什么的,如果你选用标准的类,你就不用自己写上位机(PC)的驱动程序,但是如果不用标准的类,就是用自定义的类就要自己写上层的设备驱动程序,就是所谓的DDK,WDM,WDF什么的,你没写过这方面的还真有点棘手,但是也不一定要写驱动程序,你可以试试有个类叫HID类,这个类在USB通信的时候用的还挺多的,不过这个类也有缺点,这个地方还要说一点,USB还分低速,全速,高速三种,不太了解DSP,不知道他支持什么模式,但是USB20的全速应该至少可以支持的。
USB20全速模式HID用中断方式每秒最多可以传输64KB的数据,不知道能不能达到你的要求,但是我估计一般问题不大了,如果你这歀DSP能支持高速模式,每秒用这种方式可以传输高达22MB的数据,这个速度一般问题不大了。
你可以照着我说的思路,去网上搜搜人家写好的程序,肯定有人做过DSP的USB通信,然后你按照自己的要求改一改,主要应该是USB的设备描述符部分要自己修改,然后可能还要根据自己的电路改改配置什么的,上位机软件网上有源代码的多的是,然后自己摸索摸索,我估计你要是编程水平还可以的话,只是摸索USB,一两个星期完全没有问题,祝你好运!
汇编语言肯定是可行的,你现在用C语言开发,然后用现成的MDK开发环境编译汇编后运行的,如果你能够调试,你可以看到调试部分是把你的C代码转换为汇编代码运行的,最终在单片机里面运行的是机器码0、1
以上就是关于设计开发一个USB外设时,主要编写几部分程序他们的作用如何全部的内容,包括:设计开发一个USB外设时,主要编写几部分程序他们的作用如何、51单片机怎样用usb烧写程序、用MyEclipse编写程序:定义一个接口USB,里面有两个方法分别是upload( )和dow等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)