收藏 分销(赏)

飞思卡尔8位单片机MC9S0814程序USB口初始化与数据的收发编程.doc

上传人:xrp****65 文档编号:7704320 上传时间:2025-01-13 格式:DOC 页数:8 大小:1.08MB 下载积分:10 金币
下载 相关 举报
飞思卡尔8位单片机MC9S0814程序USB口初始化与数据的收发编程.doc_第1页
第1页 / 共8页
飞思卡尔8位单片机MC9S0814程序USB口初始化与数据的收发编程.doc_第2页
第2页 / 共8页


点击查看更多>>
资源描述
14.3.7 USB口初始化与数据的收发编程 *------------------------------------------------------* *功能:USB中断服务程序 *调用:handleSETUP、handleOUT0、handleIN0、initUSB *------------------------------------------------------* isrUSB: SEI ;禁止中断 ;判断是否是端点0接收到数据产生的中断,如果不是,则跳转去判断 ;是否是端点0发送数据产生中断 isr1: BRCLR B_RXD0F,UIR1,isr2 ;判断是否是SETUP事务,如果不是则认为是OUT事务 BRCLR B_SETUP,USR0,outPacket JSR handleSETUP ;调用处理SETUP事务子程序 BRA isrExit outPacket: JSR handleOUT0 ;调用处理一个普通OUT事务子程序 BRA isrExit ;判断是否是端点0发送完数据产生中断,如果不是,则跳转去判断 ;是否是复位产生中断 isr2: BRCLR B_TXD0F,UIR1,isr5 JSR handleIN0 ;调用处理端点0的IN事务处理子程序 BRA isrExit ;判断是否是USB复位产生中断,如果不是则跳出中断 isr5: BRCLR B_RSTF,UIR1,isrExit BSET B_RSTFR,UIR2 ;清除RSTF中断标志位 jiang add JSR initUSB ;初始化USB系统 BSET B_ENABLE1,UCR3 ;允许端点1 BSET B_ENABLE2,UCR3 ;允许端点2 BSET B_TXD0IE,UIR0 ;允许端点0发送数据产生中断 BSET B_RXD0IE,UIR0 ;允许端点0接收数据产生中断 BSET B_RX0E,UCR0 ;允许端点0接收数据 MOV #US_DEFAULT,USB_State ;USB设备进入Default状态 isrExit: CLI ;开中断 RTI 在handleSETUP子程序中,首先取得端点0数据寄存器中的数据(也就是设备请求),分析这些数据,判断是什么类型的设备请求,然后转入相应的设备请求子程序中执行。举例说明:若是取描述符请求,则子程序将相应描述符写到端点0数据寄存器中准备发送;若是设置地址,则相应的子程序不设置新地址,而是等到下一个端点0的 IN中断中进行设置新地址;在handleOUT0子程序中,由于端点0的OUT事务仅仅是作为标准设备请求的状态阶段,所以该子程序只是对一些标志位进行设置;在handleIN0子程序中,也要先判断当前执行的是什么设备请求,然后执行相应的操作。如:若是取描述符请求,则将相应描述符写到端点0数据寄存器中准备发送;若是设置地址,则向地址寄存器中写入新地址。 下面我们主要讲解端点1和端点2利用查询方式发送和接收数据的编程方法,包括USB初始化、发送字节和接收字节。 (1)USB初始化 以下用到的有关口地址定义在头文件JB8.H中定义,也就是说上面介绍的所有寄存器的英文名,如UDDR、UIR0,可以直接使用。 对USB进行初始化,主要是对USB寄存器的设置,在主程序的初始化时,调用如下的初始化程序: MOV #$80,UADDR ;允许USB模块,初始地址为0 MOV #$00,UCR0 ;将UCR0寄存器复位 MOV #$00,UCR1 ;将UCR1寄存器复位 MOV #$00,UCR2 ;将UCR2寄存器复位 MOV #$44,UCR3 ;清TX1ST位,允许内部上拉 MOV #$00,UCR4 ;将UCR4寄存器复位 MOV #$00,UIR0 ;将UIR0寄存器复位,端点1和端点2都不允许中断 MOV #$FF,UIR2 ;清UIR1中所有的标志位 BSET B_ENABLE1,UCR3 ;允许端点1 BSET B_ENABLE2,UCR3 ;允许端点2 BSET B_TXD0IE,UIR0 ;允许端点0发送数据产生中断 BSET B_RX0E,UCR0 ;允许端点0接收数据 (2)发送数据 JB8用Endpoint1端口来发送数据。当JB8要发送数据时,先将数据放入端点1输出缓冲区中,置控制寄存器UCR1中的TES1Q位(第7位)、TX1E位和发送数据大小位TP1SIZ0~TP1SIZ3(第0位到第3位),TES1Q位为端点1输出序列位,为数据的校验而设的,置为1表示端点1发送的下一个包为DATA1包,置为0表示端点1发送的下一个包为DATA0包,TP1SIZ0~TP1SIZ3是用来设发送字节的个数,然后将UCR2 的BM_RX2E位(第5位)置1,允许端点1输出,然后程序不断检测中断寄存器UIR1中的TXD1F位(第3位), 该位为端点1输出标志位,当存放在端点1输出缓冲区中的数据被送出,并且一个从主机发送的ACK握手包被接收到,该位被置为1,当该位被置为1后,禁止端点1输出,即将UCR2 的BM_RX2E位置0,然后必须要通过写“1”到TXD1FR位(第3位),将该位清零。查询方式发送数据的子程序如下 *------------------------------------------------------* *功能:通过USB向PC发送TxSize个数据 *入口: TxSize:数据个数 * TxBuffer:发送数据缓冲区 *出口:无 *占用寄存器:A *内部调用: *说明:调用完后,TxSize和TxBuffer缓冲区中数据不变 *------------------------------------------------------* putUSB: MOV #$00,UIR2 ;从TxBuffer的8个数据放到UE1D0-UE1D7,但只有前TxSize个数据有用 LDA {TxBuffer} STA UE1D0 LDA {TxBuffer+1} STA UE1D1 LDA {TxBuffer+2} STA UE1D2 LDA {TxBuffer+3} STA UE1D3 LDA {TxBuffer+4} STA UE1D4 LDA {TxBuffer+5} STA UE1D5 LDA {TxBuffer+6} STA UE1D6 LDA {TxBuffer+7} STA UE1D7 ;使得UCR1的低四位存放要发送的数据个数TxSize LDA UCR1 AND #$F0 ADD TxSize STA UCR1 ;将UCR1的第B_T1SEQ位取反 DATA0/1切换 BRSET B_T1SEQ,UCR1,putUSB0 BSET B_T1SEQ,UCR1 BRA PutUSB2 putUSB0: BCLR B_T1SEQ,UCR1 PutUSB2: BSET B_TX1E,UCR1 BRCLR B_TXD1F,UIR1,* ;等待PC机请求发送 BCLR B_TX1E,UCR1 ;禁止端点1发送 BSET B_TXD1FR,UIR2 ;清除端点1发送完成标志 RTS (3)接收数据 JB8中用Endpoint2端口来接收数据。当JB8要接收数据时,程序要先检测中断寄存器UIR1中的RXD2F位(第4位), 该位为端点2数据接收标志位,当USB模块接收到了一个数据包,并返回一个ACK握手包后,该位被置为1,一旦所有的接收数据被读完后,软件必须要通过写1到中断寄存器UIR2中的RXD2FR位(第4位),将该位清零。为了能让下一个数据包能被接收,控制寄存器UCR2中的RX2E位(第5位)也必须置为1,如果该位没有被清零,在下一个OUT事务中将被返回一个NAK握手包,所以JB8要接收数据前,要先检测RXD2F位是否为1,若为0则等待,直到该位为1,若为1,则将RX2E位置0,RXD2FR位置1,以清RXD2F位,然后取状态寄存器USR1中的RP2SIZ0~RP2SIZ3(第0位到第3位),这几位所表示的值等于USB要接收的数据的个数,接下来读出USB端点2数据寄存器中的数据;读完数据后,置控制寄存器UCR2中的RX2E位。查询方式接收数据的程序如下: *------------------------------------------------------* *功能:通过USB从PC接收RxSize个数据 *入口:RxBuffer(接收数据缓冲区)的首地址 *出口:RxSize,接收的数据个数 * RxBuffer,接收到的数据 *占用寄存器:A、HX *说明:RxSize的值不变 *------------------------------------------------------* getUSB: PSHH PSHX getUSB0: BRCLR B_RXD2F,UIR1,* ;等待PC机发送来数据 BCLR B_RX2E,UCR2 ;禁止端点2接收 MOV #$00,UIR2 BSET B_RXD2FR,UIR2 ;清除接收中断标志 ;首先检查接收到的数据个数是否正确,不对则重新等待 LDA USR1 AND #$0F STA {RxSize} ;将UE2D0-UE2D7中的8个数据存入RxBuffer LDHX #UE2D0 LDA ,X STA {RxBuffer} LDHX #UE2D1 LDA ,X STA {RxBuffer+1} LDHX #UE2D2 LDA ,X STA {RxBuffer+2} LDHX #UE2D3 LDA ,X STA {RxBuffer+3} LDHX #UE2D4 LDA ,X STA {RxBuffer+4} LDHX #UE2D5 LDA ,X STA {RxBuffer+5} LDHX #UE2D6 LDA ,X STA {RxBuffer+6} LDHX #UE2D7 LDA ,X STA {RxBuffer+7} BSET B_RX2E,UCR2 ;允许端点2接收 PULX PULH RTS (4)PC机方VB程序 图14-13 USB测试程序PC机方VB程序界面 图14-13给出了PC机方VB程序的界面。其功能是:在“发送窗口”的文本框输入字符,单击“发送”按钮,文本框中的字符被发送出去。任何时候,只要PC机方收到数据,则显示在“接收窗口”。为了能运行该程序,读者可以到下载USB驱动程序以及VB中USB控件的使用手册。 '程序描述: ' (1)把发送窗口中的数据从COM1发送出去 ' (2)把接收到的数据显示在接收窗口中 '------------------------------------------------------- Option Explicit '检查未经声明的变量 Dim buffer() As Byte Dim USBReadBuf(7) As Byte Dim USBReadBufLen As Long Dim Status As Long Dim WriteCompleteTag As Boolean Dim ReadCompleteTag As Boolean '定义两个USB接口对象 Dim WithEvents Endpoint1 As USBIOCOMLib.USBIOInterface Dim WithEvents Endpoint2 As USBIOCOMLib.USBIOInterface Private Sub CmdCLR_Click() '单击“清除”命令 TxtSEND.Text = "" TxtRECV.Text = "" End Sub Private Sub CmdEXIT_Click(Index As Integer) '单击“退出”命令 Endpoint1.CloseDevice Endpoint2.CloseDevice Unload Me End Sub Private Sub CmdSEND_Click() '单击“发送”命令 Dim Status As Long Dim i As Integer Dim count As Long Dim t As Integer Dim length As Integer Dim number As Integer Dim y As Integer Dim S1 As String S1 = "" If TxtSEND.Text = "" Then TxtRECV.Text = "" GoTo CmdSEND_Click_Exit End If TxtRECV.Text = "" length = Len(TxtSEND.Text) number = length \ 8 '以8个字节为单位进行发送 y = length Mod 8 For i = 0 To number If ((i = number) And (y <> 0)) Then ReDim buffer(y - 1) For t = 0 To y - 1 buffer(t) = Asc(Mid(TxtSEND.Text, i * 8 + t + 1, 1)) Next t ElseIf (i = number And y = 0) Then Exit For Else ReDim buffer(7) For t = 0 To 7 buffer(t) = Asc(Mid(TxtSEND.Text, i * 8 + t + 1, 1)) Next t End If 'USB发送数据 WriteCompleteTag = False Endpoint2.ResetPipe Status ShowError Status Endpoint2.StartWriting 8, 1, 5, False, Status ShowError Status Endpoint2.WriteData buffer, 0, Status ShowError Status '等待USB发送完毕 Do DoEvents Loop Until WriteCompleteTag = True 'USB接收数据 ReadCompleteTag = False Endpoint1.ResetPipe Status ShowError Status Endpoint1.StartReading 8, 1, 5, Status ShowError Status '等待USB接收完毕 Do DoEvents Loop Until ReadCompleteTag = True '将收到的数显示出来 For t = 0 To USBReadBufLen - 1 S1 = S1 & Chr$(USBReadBuf(t)) Next t TxtRECV.Text = S1 Next i CmdSEND_Click_Exit: End Sub Sub Endpoint1_ReadComplete(ByVal obj As Object) 'USB接收中断 On Error Resume Next ReadCompleteTag = True Endpoint1.ReadData USBReadBuf, USBReadBufLen, Status If Status <> USBIO_ERR_SUCCESS Then ShowError Status End If Endpoint1.StopReading End Sub Sub Endpoint2_WriteComplete(ByVal obj As Object) 'USB发送中断 On Error Resume Next WriteCompleteTag = True Endpoint2.StopWriting End Sub Private Sub Form_Load() '局部变量 Dim Devices As Long Dim Status1 As Long Dim Status2 As Long Set Endpoint1 = New USBIOCOMLib.USBIOInterface Set Endpoint2 = New USBIOCOMLib.USBIOInterface Endpoint1.EnumerateDevices "{325ddf96-938c-11d3-9e34-0080c82727f4}", Devices If Devices >= 1 Then Endpoint1.OpenDevice 0, Status1 Endpoint2.OpenDevice 0, Status2 If Status = USBIO_ERR_SUCCESS Then Endpoint1.AddInterface 0, 0, 4096, Status ShowError Status '发出setConfiguration标准设备请求 Endpoint1.SetConfiguration 0, Status ShowError Status 'JB8的端点1发送数据,此处Endpoint1接收数据 Endpoint1.Bind Val(&H81), Status ShowError Status 'JB8的端点2发送数据,此处Endpoint2接收数据 Endpoint2.Bind Val(2), Status ShowError Status MsgBox "opened the USB device." Else MsgBox "Cannot open the USB device." Exit Sub End If Else MsgBox "No USB device connected or USBIO device driver not installed" End If End Sub Sub ShowError(ErrorCode As Long) '显示错误信息 If ErrorCode <> USBIO_ERR_SUCCESS Then MsgBox Endpoint2.ErrorText(ErrorCode) End If End Sub
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服