linux 怎么通过usb通信

linux 怎么通过usb通信,第1张

USB驱动程序基础在动手写USB驱动程序这前,让我们先看看写的USB驱动程序在内核中的结构,如下图: USB驱动程序存在于不同的内核子系统和USB硬件控制器之间,USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。USB是一个非常复杂的设备,linux内核为我们提供了一个称为USB的核心的子系统来处理大部分的复杂性,USB设备包括配置(configuration)、接口(interface)和端点(endpoint),USB设备绑定到接口上,而不是整个USB设备。如下图所示: USB通信最基本的形式是通过端点(USB端点分中断、批量、等时、控制四种,每种用途不同),USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。所以我们可以这样认为:设备通常具有一个或者更多的配置,配置经常具有一个或者更多的接口,接口通常具有一个或者更多的设置,接口没有或具有一个以上的端点。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动装载哪一个驱动程序。上面我们简要说明了驱动程序的基本理论,在写一个设备驱动程序之前,我们还要了解以下两个概念:模块和设备文件。模块:是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。Linux下对于一个硬件的驱动,可以有两种方式:直接加载到内核代码中,启动内核时就会驱动此硬件设备。另一种就是以模块方式,编译生成一个ko文件(在24以下内核中是用o作模块文件,我们以26的内核为准,以下同)。当应用程序需要时再加载到内核空间运行。所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块。设备文件:对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的 *** 作。这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时, *** 作系统就已经知道这个设备所对应的驱动程序。对于一个硬件,Linux是这样来进行驱动的:首先,我们必须提供一个ko的驱动模块文件。我们要使用这个驱动程序,首先要加载它,我们可以用insmod xxxko,这样驱动就会根据自己的类型(字符设备类型或块设备类型,例如鼠标就是字符设备而硬盘就是块设备)向系统注册,注册成功系统会反馈一个主设备号,这个主设备号就是系统对它的唯一标识。驱动就是根据此主设备号来创建一个一般放置在/dev目录下的设备文件。在我们要访问此硬件时,就可以对设备文件通过open、read、write、close等命令进行。而驱动就会接收到相应的read、write *** 作而根据自己的模块中的相应函数进行 *** 作了。USB驱动程序实践了解了上述理论后,我们就可以动手写驱动程序,如果你基本功好,而且写过linux下的硬件驱动,USB的硬件驱动和pci_driver很类似,那么写USB的驱动就比较简单了,如果你只是大体了解了linux的硬件驱动,那也不要紧,因为在linux的内核源码中有一个框架程序可以拿来借用一下,这个框架程序在/usr/src/~(你的内核版本,以下同)/drivers/usb下,文件名为usb-skeletonc。写一个USB的驱动程序最基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)(当然也可以不用urb来传输数据,下文我们会说到)。驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:/ 驱动程序支持的设备列表 /static struct usb_device_id skel_table [] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } / 终止入口 /};MODULE_DEVICE_TABLE (usb, skel_table);对于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:/ 定义制造商和产品的ID号 /#define USB_SKEL_VENDOR_ID 0x1234#define USB_SKEL_PRODUCT_ID 0x2345这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:Bus 004 Device 001: ID 0000:0000 Bus 003 Device 002: ID 1234:2345 Abc Corp Bus 002 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000得到这两个值后把它定义到程序里就可以了。注册USB驱动程序:所有的USB驱动程序都必须创建的结构体是struct usb_driver。这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:static struct usb_driver skel_driver = { owner = THIS_MODULE, name = "skeleton", probe = skel_probe, disconnect = skel_disconnect, id_table = skel_table,};

通过USB接口也可以实现两台计算机的组网,这就是要用到USB连接线。USB线有两种,一种是连接线中间带有网卡控制芯片的,叫USB网络桥接线(USB

20价格为60~100元),另一种则不带网卡功能,叫USB双机桥接线(价格为20~50元)。后者只能进行文件传输,而前者则能够真正实现组网功能,除了文件传输功能外,还能以480Mbps高速(USB20连接)实现和以太网卡一样的各种功能,如联网游戏。一根USB线就代替了两块网卡和—根网线,这非常适合简单网络组建或笔记本用户随身携带。(假如以USB

HUB为中心节点,则可组建多台计算机的局域网。)

USB连接线两端都采用了标准的USB接口,所以只要分别将两端插入两台计算机的USB接口即可完成硬件连接。不过在接入之前需要在CMOS设置中将USB一项设置为“Enable”状态,否则计算机无法使用USB接口。

相对硬件,软件的安装要复杂些。目前的USB连接线驱动程序分为两种:一种是EXE格式的安装文件,另一种是采用INF格式的驱动文件。对于前者,建议用户在不插入USB设备时双击程序完成驱动程序的安装,以免系统自动搜索驱动程序造成无法加载程序的情况;后者则需要在Windows运行时插上USB设备,这时系统会自动检测出新硬件的增加并要求你插入驱动程序安装盘,插入驱动盘后,系统将自动对其进行搜索,接着安装合适的驱动程序。

安装好USB连接线缆的驱动程序,可以在“控制面板”的“系统”中发现多出了一个虚拟的网卡设备,这就说明USB连接线的驱动程序已经正确安装。需要注意的是,由于USB

20兼容USB11,假如连接的两台机器使用的USB接口版本不同,虽然安装不会报错,但使用时却会发现无法通信,建议大家注意统一USB连接线和两台计算机的USB接口版本为20(USB11连接线速度太慢)

硬件:

1:选用51单片机(带USB20控制器和51内核的),如Cpress系列

2:普通51单片机+USB20控制器芯片,如飞利浦的PDUSBD12和ATMEL的AT89S52等

软件:

嵌入式软件

USB20通信协议

会简单的单片机前后台工作处理

通信软件:

一般需要驱动软件(PC,可以试试windriver)和应用软件(PC,可以试试VC)

目前由于有多种集成带USB驱动程序的软件,自己只是需要做一些应用,可以试试LABVIEW。

工具/原料

两台电脑   数据线

方法/步骤

1、两台电脑,连接上同一个路由器。

2、右击桌面点击“网络”点击“属性”点击“更改高级共享设置”。

3、点击“ 公共网络”,点击“启动网络发现”点击“启动文件和打印机共享”点击“启用共享”点击“关闭密码保护共享”。

4、点击保存,点击“确定”。

5、选择需共享的文件夹,右击“属性”。

6、打开共享选项卡,点击 共享。

7、d出对话框,点击“添加”“Guest”点击“共享”。

8、选择 “高级共享” 点击“共享此文件”点击“确定”。

9、在另一台电脑上,双击网上邻居,即可出现刚才共享的文件夹,传输成功。

我前一阵用过这个c8051f340的内置USB,一共两种模式,一种HID模式,还有一种是批量传输方式。他自带的那个xpress是批量传输方式的。其实不难,注意阅读那个AN169帮助文件。里面的函数接口都有。你那个没有附赠实例么?实例挺清楚的。如果没有官方的例子可以留下你的邮箱我发给你。

那我把我当时遇见的一点问题说给你听听,看看对你有没有帮助。

第一,那个动态库USBlib是在最小模式下编译的,如果你程序定义的数据较多,最小模式编译不下,使用关键字large把较大的数据放入片内的xram(4K但是其中有一部分要被USB占用,从2K到3K也就是xram的0x400-0x800中的一部分)。

第二,这个片子的USB传输速度,cpu是很重要,如果cpu除了传送数据外还有其它工作要做,一定会降低USB的传输速率。虽然是标注的USB全速,按理论上说应该能达到15MByte每秒,但是这个单片机完全不能达到这个速度,我当时还咨询过芯片的技术人员,让我恼火的是竟然回答是没有做过实验,后来终于找到一个技术比较高的回复我说,在批量传输方式下,做过实验,啥也不做,只传输,能够达到大约1M每秒。我想可能是连发送的字节数也不用cpu计算吧,只是空发fifo中数据达到的。所以说能达到几百k就不错。

第三,我不知道你用这个是不是做工程,如果不做工程只是练习的话,速度倒也无所谓了。这款芯片的好处就是驱动不用自己写(当然你也可以自己写),照着那个实例好好看,看不懂再看,实在有看不懂的地方你可以给我发信息。不要被USB吓到,USB难在通信协议较复杂和驱动上,而用USBxpress根本不需要考虑这些。

纯手打,祝你成功,望采纳

[摘 要]:本文介绍一种基于SPI 接口的高速可靠的多微处理器扩展和通信方法,包括该方法的实现原理、硬件连接和软件实现等。[关键词]:SPI 接口,通信,扩展

1 引言

现代测控领域中,工业电子产品往往不是孤立存在的,而是需要能够数据共享,实现多机通信的功能,因而在大多数电子产品的设计中要考虑多机扩展和通信问题。比如在各种采用微处理器的控制系统中,就要求能实现多微处理器的柔性扩展和它们之间的数据通信。本文以AVR 单片机组成的一主两从系统为例,介绍一种基于 SPI 接口的高速可靠的多微处理器扩展和通信方法,包括该方法的实现原理、硬件连接和软件实现。

2 通信接口的选择

通信接口的选择关系到整个多机扩展的构成和通信方案的设计。微控制器的通信方式包括并行通信和串行通信,其中串行通信方式有 SPI 通信接口、UART 通信接口、I2C 通信接口等。在通信接口的选择中,通信的可靠性要放在首位。由于并行通信方式通道间会有互相干扰,当传输出错时,要重新传送数据,而且要求数据同时到达接收端,但往往各通道由于布线长度不一等原因难以保证真正的一致性。另外采用并行通信方式占用了较多的 I/O 资源,不适合于小型系统,所以本文选择了串行通信方式。基于 SPI通信接口的速度较快,而且通信协议也较为简单,相对来说也比较稳定等优点,本设计就选用 SPI 接口来实现多机通信。

SPI 接口是全双工同步串行外设接口,采用主从模式架构,支持单主多从模式应用。时钟由主机控制,在时钟移位脉冲下,数据按位传输,输入输出为全双工通信方式。SPI 数据通信时的主-从连接与数据传送方式如图 1 所示。

图1 SPI 数据通信时的主-从机连接与数据传送方式

由图1可知,SPI 数据传输系统是由主机和从机两部分组成;主要是由主、从双方的两个移位寄存器和主机 SPI 时钟发生器组成,主机为 SPI 数据传输的控制方。NSS为从设备选择管脚,对于主机,无用,可配置为GPIO口用于选择从机;通知从机进入传输状态,然后主机启动时钟发生器产生同步时钟信号SCK,预先存在两个移位寄存器中的数据在 SCK 的驱动下进行循环移位 *** 作,完成主-从机之间的数据交换,传输的数据为 8 位,按位传输。

SPI 通过一根时钟引线 SCK 将主机和从机同步,主机的数据由 MOSI 进入从机,而同时从机的数据由MISO 进入主机。因此,它的串行数据交换不需要增加起始位、停止位等用于同步的格式位,直接将要传送的数据写入到主机的 SPI 发送数据寄存器,这个写入过程自动启动主机的发送过程。对于从机,同样在SCK 的节拍下将出现在引脚 MOSI 上的数据逐位移到从机的移位寄存器,当接收完一个完整的数据块后,设置中断标志,通知从机这个数据块已接收完毕,同时将移位寄存器接收到的内容复制到从机的SPI接收数据寄存器。可以看出,用户编程只需在发送数据时写数据到SPI发送数据寄存器,在接收数据时读SPI接收数据寄存器,其余的移位、同步、置位收发标志等工作都由内置的 SPI 模块自动完成。

3 多机扩展和通信的实现原理

以一主两从的系统结构、主从都以 Atmega128 单片机为例,介绍多机扩展和通信方案。系统框图如图2 所示,主机分别同两个从机的 SPI 接口相连,另外主从机间还增加了地址分配使能线 AD。在理论上这种扩展方法可以实现无数个从机的扩展和通信。

图2 系统框图

31 地址分配

在多机通信系统中,主机通过从机地址对各个从机进行访问,因此,要求每个从机都有唯一的地址。为确保地址的唯一性和可靠性,就必须对从机进行统一编址。

常用编址方式是将拨码开关连接在从机的 I/O上,用人工拨码来实现编址。拨码开关打开和关闭分别代表着 0 和 1,这也就代表着一定的数据,这个数据就是该从机的地址。这种硬编址方式简单且容易 *** 作,但是占用从机的 I/O 资源。当从机数量增加时,用于拨码开关的 I/O 口也要相应地增加,而且编址需要人工 *** 作来实现,在实际应用中很不方便。

本文设计了一种软件编址方式,采用主机自动给从机分配地址的方法。在硬件上,只需在 SPI 通信接口的基础上增加一根地址分配使能线就能实现,如图2 所示。其实现原理是:主机通过AD线向从机1发出处理地址分配使能信号,与此同时,从机 1 通过 AD 线禁止从机 2 地址分配使能,保证在地址分配期间某一时刻只有一个从机进行地址信息处理。主机通过 SPI 接口向各从机发出地址分配信息,从机都接收到主机传来的地址信息,但此时只有从机 1 的地址分配是使能的,所以只有从机1 对地址分配信息进行处理,通过以下时序对从机 1 进行地址分配:

① 主机向从机发送地址分配起始标识符‘(’,告诉从机此时进行地址分配 *** 作,从机 1 向主机反馈确认信息;

② 主机向从机发送地址,从机 1 进行地址存储并向主机反馈确认信息;

③ 主机向从机发送地址分配结束标识符‘)’,告诉从机已完成地址分配。

主机成功对从机 1 进行地址分配后,主机关闭从机 1 的地址分配使能,从机 1 开启从机 2 的地址分配使能,同理,依照以上时序,主机完成对所有从机的地址分配。

32 数据查询

主机对所有的从机进行了统一编址后,每个从机都拥有了唯一的地址,这样主机和从机之间就可以进行数据查询和发送 *** 作了。数据查询 *** 作时,首先主机向所有从机发出其要查询从机的地址,所有从机接到主机发来的地址后和自己的地址信息进行比较,地址匹配的从机就响应主机并将数据传给主机,这样就完成了主机对一个从机的数据查询。数据查询 *** 作的时序为:

① 主机向从机发送数据查询起始标识符‘[’,从机以此识别为数据查询 *** 作;

② 主机向从机发送数据查询的地址值,从机接收地址信息并和自己的地址比较,相同者才进行下面的 *** 作,不同者就不做任何 *** 作;

③ 对应地址的从机向主机发回数据,主机进行数据接收;

④ 从机向主机发送数据结束标识符‘]’,告诉主机数据传送结束。

依照时序,主机就可以对全部从机或者某个从机进行数据查询。

33 数据发送

数据发送 *** 作时,首先主机向所有需要向其发送数据的从机发出地址信息,所有从机接到主机发来的地址后和自己的地址信息进行比较,地址匹配的从机就响应主机并做好接受数据的准备,这样就完成了主机向一个从机发送数据的过程。数发送的时序为:

① 主机向从机发送数据及起始标识符‘’,告诉从机数据传送结束。

依照时序,主机就可以根据需要向全部或者某个从机进行数据发送。

4 结束语

本文介绍了一种多机扩展和通信的实现方法,该方法在标准 SPI 接口的基础上加上一根普通 I/O 线并采用软件编址的方式来实现了对从机的地址分配,与硬件编址方式比较更节省 I/O 资源且简单并容易实现,基于 SPI 接口,数据查询发送的通信速率更快,本文所提出的多机扩展和通信方法简单可行、安全可靠,值得推广。

参考文献:

[1] 胡汉才 单片机原理及其接口技术[M]北京:清华大学出版社,2004

[2] 赵凯,黄珊 TLl6C550在TMS320VC5402与PC机串行通信中的应用[J]国外电子元器,2007,(9):17-20

[3] 徐明,堵国梁 双向透明串口扩展技术在嵌入式系统中的实现[J]信息化纵横,2009,(14):31-34

[4] 马忠梅单片机的C语言应用程序设计[M] 北京:北京航天航空大学出版社,2007

首先,单片机和微机通信的电气标准要一致,微机串口一般是RS232电气标准,所以要加电平转换芯片,大多用MAX232,一般单片机实验板上都提供这样的标准串口。

其次,要分别编写上位机和下位机软件程序,单片机程序参照例程、教科书进行编写;上位机微机可采用VB,组态软件,Labview等软件编写,一般若是简单的通信,上位机程序编写很简单,例如VB中学会使用mscomm控件,有VB最基础知识的一天就能学会。

最后,大可以没有单片机,没有MAX232,没有串行接口这些硬件就可以实现学习并掌握单片机与微机之间的串口通信。proteus可以仿真单片机,也是主流软件。另外,如今的笔记本电脑几乎都没有保留串口,而用USB接口取而代之,不过没关系,有了虚拟串口和串口调试助手,这些都解决了。你可以搜索一下虚拟串口,真的很不错的。

以上就是关于linux 怎么通过usb通信全部的内容,包括:linux 怎么通过usb通信、两台机子如何通过一根双USB线连接、如何用USB2.0实现51单片机与pc机之间的通信如何下手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10122989.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存