给OO的PDIUSBD12读ID程序提取

[复制链接]
3601|11
 楼主| fengyeu 发表于 2007-12-2 22:24 | 显示全部楼层 |阅读模式
给OO的PDIUSBD12读ID程序提取/********************************************************************<br />&nbsp;&nbsp;main.c&nbsp;file<br />********************************************************************/<br />#include&nbsp;&quot;at89x52.h&quot;<br />#define&nbsp;Fclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22118400UL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*使用22.1184M晶体*/<br />#define&nbsp;BitRate&nbsp;&nbsp;&nbsp;9600UL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*波特率定义为9600*/<br />#define&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint16&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;int<br />unsigned&nbsp;char&nbsp;Sending;<br />/****************USB部分****************************/<br />#define&nbsp;USB_COMMAND_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;USB_DATA_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;Read_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFD<br />//USB芯片连接引脚<br />#define&nbsp;USB_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0<br />#define&nbsp;USB_A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_5<br />#define&nbsp;USB_WR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_6<br />#define&nbsp;USB_RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_7<br />#define&nbsp;USB_INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_2<br />/********************************************************************<br />函数功能:写USB命令。<br />入口参数:一字节命令。<br />********************************************************************/<br />void&nbsp;WriteUsbCommand(uint8&nbsp;usb_command)<br />{<br />&nbsp;USB_A0=USB_COMMAND_ADD;<br />&nbsp;USB_DATA=usb_command;<br />&nbsp;USB_WR=0;<br />&nbsp;USB_WR=1;<br />&nbsp;USB_DATA=0xFF;<br />}<br />/********************************************************************<br />函数功能:读一字节USB数据。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:读回的一字节。<br />********************************************************************/<br />uint8&nbsp;ReadUsbData(void)<br />{<br />&nbsp;uint8&nbsp;temp;<br />&nbsp;USB_A0=USB_DATA_ADD;<br />&nbsp;USB_RD=0;<br />&nbsp;temp=USB_DATA;<br />&nbsp;USB_RD=1;<br />&nbsp;return&nbsp;temp;<br />}<br />/********************************************************************<br />函数功能:读D12的ID。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:D12的ID。<br />********************************************************************/<br />uint16&nbsp;ReadD12ID(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;WriteUsbCommand(Read_ID);<br />&nbsp;((uint8*)&id)[1]=ReadUsbData();<br />&nbsp;((uint8*)&id)[0]=ReadUsbData();<br />&nbsp;return&nbsp;id;<br />}<br />/*USB部分结束******************************************/<br /><br /><br />/******************************************************************<br />UART.C&nbsp;&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部分&nbsp;<br />********************************************/<br />/********************************************************************<br />函数功能:串口初始化。<br />********************************************************************/<br />void&nbsp;InitUART(void)<br />{<br />&nbsp;EA=0;<br />&nbsp;TMOD&=0x0F;<br />&nbsp;TMOD|=0x20;&nbsp;&nbsp;&nbsp;&nbsp;//定时器1工作在模式2<br />&nbsp;SCON=0x50;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口工作在模式1<br />&nbsp;TCON=0x05;<br />&nbsp;TH1=256-Fclk/(BitRate*12*16);<br />&nbsp;TL1=256-Fclk/(BitRate*12*16);&nbsp;<br />&nbsp;PCON=0x80;&nbsp;&nbsp;&nbsp;&nbsp;//串口波特率加倍<br />&nbsp;ES=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串行中断允许<br />&nbsp;TR1=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动定时器1<br />&nbsp;REN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许接收&nbsp;<br />&nbsp;EA=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许中断<br />}<br />/********************************************************************<br />函数功能:串口中断处理。<br />********************************************************************/<br />void&nbsp;UartISR(void)&nbsp;interrupt&nbsp;4<br />{<br />&nbsp;&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;Sending=0;&nbsp;&nbsp;//清正在发送标志<br />}<br />/********************************************************************<br />函数功能:往串口发送一字节数据。<br />入口参数:d:&nbsp;要发送的字节数据。<br />********************************************************************/<br />void&nbsp;UartPutChar(uint8&nbsp;d)<br />{<br />&nbsp;Sending=1;<br />&nbsp;SBUF=d;<br />&nbsp;while(Sending);<br />}<br />/********************************************************************<br />函数功能:发送一个字符串。<br />入口参数:pd:要发送的字符串指针。<br />********************************************************************/<br />void&nbsp;Prints(uint8&nbsp;*&nbsp;pd)<br />{<br />&nbsp;while((*pd)!='\0')<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;UartPutChar(*pd);<br />&nbsp;&nbsp;&nbsp;pd++;<br />&nbsp;&nbsp;}<br />}<br />code&nbsp;uint8&nbsp;HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};<br />/********************************************************************<br />函数功能:将短整数按十六进制发送。<br />入口参数:待发送的整数。<br />********************************************************************/<br />void&nbsp;PrintShortIntHex(uint16&nbsp;x)<br />{<br />&nbsp;uint8&nbsp;i;<br />&nbsp;uint8&nbsp;display_buffer[6];<br />&nbsp;display_buffer[0]='0';<br />&nbsp;display_buffer[1]='x';<br />&nbsp;for(i=5;i&gt=2;i--)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;display_buffer=HexTable[(x&0xf)];<br />&nbsp;&nbsp;&nbsp;x&gt&gt=4;<br />&nbsp;&nbsp;}<br />&nbsp;Prints(display_buffer);<br />}<br />/******************************************************************<br />UART.C&nbsp;&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END(结束)<br />********************************************/<br />/********************************************************************<br />函数功能:主函数。<br />********************************************************************/<br />void&nbsp;main(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;InitUART();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化串口<br />&nbsp;id=ReadD12ID();<br />&nbsp;PrintShortIntHex(id);<br />&nbsp;while(1)<br />&nbsp;{<br />&nbsp;}<br />}<br /><br /><br />
computer00 发表于 2007-12-2 22:35 | 显示全部楼层

我晕~~~这个东西还减肥它做什~~~本来就是一个测试程序~~~

原版的测试程序,还带键盘扫描的:<a href="http://computer00.21ic.org/user1/2198/archives/2007/43612.html" target=_blank>http://computer00.21ic.org/user1/2198/archives/2007/43612.html</a>
 楼主| fengyeu 发表于 2007-12-2 22:39 | 显示全部楼层

在减 //通过P1口和P2口显示ID

/********************************************************************<br />&nbsp;&nbsp;main.c&nbsp;file<br />********************************************************************/<br />#include&nbsp;&quot;at89x52.h&quot;<br />#define&nbsp;Fclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22118400UL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*使用22.1184M晶体*/<br />#define&nbsp;BitRate&nbsp;&nbsp;&nbsp;9600UL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*波特率定义为9600*/<br />#define&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint16&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;int<br />unsigned&nbsp;char&nbsp;Sending;<br />/****************USB部分****************************/<br />#define&nbsp;USB_COMMAND_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;USB_DATA_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />#define&nbsp;Read_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFD<br />//USB芯片连接引脚<br />#define&nbsp;USB_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0<br />#define&nbsp;USB_A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_5<br />#define&nbsp;USB_WR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_6<br />#define&nbsp;USB_RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_7<br />#define&nbsp;USB_INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_2<br />/********************************************************************<br />函数功能:写USB命令。<br />入口参数:一字节命令。<br />********************************************************************/<br />void&nbsp;WriteUsbCommand(uint8&nbsp;usb_command)<br />{<br />&nbsp;USB_A0=USB_COMMAND_ADD;<br />&nbsp;USB_DATA=usb_command;<br />&nbsp;USB_WR=0;<br />&nbsp;USB_WR=1;<br />&nbsp;USB_DATA=0xFF;<br />}<br />/********************************************************************<br />函数功能:读一字节USB数据。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:读回的一字节。<br />********************************************************************/<br />uint8&nbsp;ReadUsbData(void)<br />{<br />&nbsp;uint8&nbsp;temp;<br />&nbsp;USB_A0=USB_DATA_ADD;<br />&nbsp;USB_RD=0;<br />&nbsp;temp=USB_DATA;<br />&nbsp;USB_RD=1;<br />&nbsp;return&nbsp;temp;<br />}<br />/********************************************************************<br />函数功能:读D12的ID。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:D12的ID。<br />********************************************************************/<br />uint16&nbsp;ReadD12ID(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;WriteUsbCommand(Read_ID);<br />&nbsp;((uint8*)&id)[1]=ReadUsbData();<br />&nbsp;((uint8*)&id)[0]=ReadUsbData();<br />&nbsp;return&nbsp;id;<br />}<br />/*USB部分结束******************************************/<br /><br />/********************************************************************<br />函数功能:主函数。<br />********************************************************************/<br />void&nbsp;main(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;id=ReadD12ID();<br />&nbsp;while(1)<br />&nbsp;{<br />&nbsp;P1=id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//通过P1口和P2口显示ID<br />&nbsp;P2=id&gt&gt8;<br />&nbsp;}<br />}<br /><br />
xwj 发表于 2007-12-2 22:45 | 显示全部楼层

小蛋蛋,你这样的态度是不对的

要有精益求精的精神,<br />更要有闻过则喜的态度
 楼主| fengyeu 发表于 2007-12-2 23:04 | 显示全部楼层

我只是对读ID相关的感兴趣!

我只是对读ID相关的感兴趣!看了好一会才看到原来是这样读ID的<br />USB-int也不需要用。<br />俺C也刚学。<br /><br />/********************************************************************<br />&nbsp;&nbsp;main.c&nbsp;file<br />********************************************************************/<br />#include&nbsp;&quot;at89x52.h&quot;<br />#define&nbsp;uint16&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;int<br />#define&nbsp;USB_COMMAND_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//命令<br />#define&nbsp;USB_DATA_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;Read_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFD&nbsp;&nbsp;//读ID的命令参数<br />//USB芯片连接引脚<br />#define&nbsp;USB_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0<br />#define&nbsp;USB_A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_5<br />#define&nbsp;USB_WR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_6<br />#define&nbsp;USB_RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_7<br />/********************************************************************<br />函数功能:写USB命令。<br />入口参数:一字节命令。<br />********************************************************************/<br />void&nbsp;WriteUsbCommand(unsigned&nbsp;char&nbsp;usb_command)<br />{<br />&nbsp;USB_A0=USB_COMMAND_ADD;<br />&nbsp;USB_DATA=usb_command;<br />&nbsp;USB_WR=0;<br />&nbsp;USB_WR=1;<br />&nbsp;USB_DATA=0xFF;<br />}<br />/********************************************************************<br />函数功能:读一字节USB数据。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:读回的一字节。<br />********************************************************************/<br />unsigned&nbsp;char&nbsp;ReadUsbData(void)<br />{<br />&nbsp;unsigned&nbsp;char&nbsp;temp;<br />&nbsp;USB_A0=USB_DATA_ADD;<br />&nbsp;USB_RD=0;<br />&nbsp;temp=USB_DATA;<br />&nbsp;USB_RD=1;<br />&nbsp;return&nbsp;temp;<br />}<br />/********************************************************************<br />函数功能:读D12的ID。<br />返&nbsp;&nbsp;&nbsp;&nbsp;回:D12的ID。<br />********************************************************************/<br />uint16&nbsp;ReadD12ID(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;WriteUsbCommand(Read_ID);<br />&nbsp;((unsigned&nbsp;char*)&id)[1]=ReadUsbData();<br />&nbsp;((unsigned&nbsp;char*)&id)[0]=ReadUsbData();<br />&nbsp;return&nbsp;id;<br />}<br />/********************************************************************<br />函数功能:主函数。<br />********************************************************************/<br />void&nbsp;main(void)<br />{<br />&nbsp;uint16&nbsp;id;<br />&nbsp;id=ReadD12ID();<br />&nbsp;while(1)<br />&nbsp;{<br />&nbsp;P1=id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//通过P1口和P2口显示ID<br />&nbsp;P2=id&gt&gt8;<br />&nbsp;}<br />}<br /><br />
computer00 发表于 2007-12-2 23:07 | 显示全部楼层

哎...你没看过我原来的程序,看过后你就明白这个“减肥”

回事了~~~~~~~~~
computer00 发表于 2007-12-2 23:11 | 显示全部楼层

楼主,其实这个不能叫做减肥,只能叫做代码选取。

  
 楼主| fengyeu 发表于 2007-12-9 13:46 | 显示全部楼层

可以显示未知设备!正在看枚举

<br /><br />#include&ltAtmel/AT89x52.H&gt<br /><br />//初始化命令&nbsp;&nbsp;&nbsp;pdiusbd12.h&nbsp;&nbsp;file<br />#define&nbsp;Set_Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xD0<br />#define&nbsp;Set_Endpoint_Enable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xD8<br /><br />#define&nbsp;USB_COMMAND_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;USB_DATA_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br /><br />#define&nbsp;USB_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0<br />#define&nbsp;USB_A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_2<br />#define&nbsp;USB_WR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_6<br />#define&nbsp;USB_RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_7<br />#define&nbsp;USB_INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_3<br /><br />//*****************&nbsp;&nbsp;&nbsp;延时x毫秒函数&nbsp;***********<br />void&nbsp;delay(unsigned&nbsp;int&nbsp;x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;unsigned&nbsp;int&nbsp;j;<br />&nbsp;for(i=0;i&ltx;i++)<br />&nbsp;for(j=0;j&lt230;j++);<br />}<br />//********************************************<br /><br />void&nbsp;write_usb_command(unsigned&nbsp;char&nbsp;usb_command)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写USB命令<br />{<br />&nbsp;USB_A0=USB_COMMAND_ADD;<br />&nbsp;USB_DATA=usb_command;<br />&nbsp;USB_WR=0;<br />&nbsp;USB_WR=1;<br />&nbsp;USB_DATA=0xFF;<br />}<br /><br />void&nbsp;write_a_usb_data(unsigned&nbsp;char&nbsp;usb_data)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写一字节USB数据<br />{<br />&nbsp;USB_A0=USB_DATA_ADD;<br />&nbsp;USB_DATA=usb_data;<br />&nbsp;USB_WR=0;<br />&nbsp;USB_WR=1;<br />&nbsp;USB_DATA=0XFF;<br />}<br />void&nbsp;set_usb_addr(unsigned&nbsp;char&nbsp;addr)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置USB地址<br />{<br />&nbsp;write_usb_command(Set_Address);<br />&nbsp;write_a_usb_data(0x80|addr);<br />}<br />void&nbsp;set_endpoint_enable(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//端点使能<br />{<br />&nbsp;write_usb_command(Set_Endpoint_Enable);<br />&nbsp;write_a_usb_data(0x01);<br />}<br /><br />void&nbsp;disconnect_usb(void)<br />{<br />&nbsp;write_usb_command(0xf3);<br />&nbsp;write_a_usb_data(0x0e);<br />&nbsp;write_a_usb_data(0x47);<br />&nbsp;delay(100);<br />}<br /><br />void&nbsp;connect_usb(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接USB<br />{<br />&nbsp;write_usb_command(0xf3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化USBD12<br />&nbsp;write_a_usb_data(0x1e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接USB<br />&nbsp;write_a_usb_data(0x47);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置频率<br />}<br /><br />void&nbsp;init_usb(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化USB<br />{<br />&nbsp;set_usb_addr(0);<br />&nbsp;set_endpoint_enable();<br />}<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;disconnect_usb();<br />&nbsp;init_usb();<br />&nbsp;connect_usb();<br />&nbsp;while(1)&nbsp;{}<br />&nbsp;<br />}<br />
 楼主| fengyeu 发表于 2007-12-9 13:56 | 显示全部楼层

详细枚举(转)

USB枚举过程详述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />USB枚举过程详述<br /><br />注:这是我毕业设计论文中的一部分。写作过程参考了“驱动开**坛”上一些网友提供的资料,在此表示感谢。由于第一次接触&nbsp;USB&nbsp;技术,其中难免有所差误,如有高人路过,还请指点。<br /><br />&nbsp;本系统中所谓USB设备即是指温度测量和控制的设备,设备采用USB总线供电,采用D12芯片内置的SoftConnect技术与USB总线连接。所谓SoftConnect意思是在程序中通过向D12发送命令实现USB设备的连接或者断开连接,这里的连接并不是指USB电缆的插上或拔出,相反USB连接可以重新初始化而不需要拔出电缆。<br /><br />主机是通过检测Vcc上拉电阻的变化来确定是否有设备连接的。在D12内部集成了1.5kΩ的上拉电阻,默认状态下不与Vcc相连,程序运行时可以向D12发送连接命令使1.5kΩ电阻连接到Vcc,这样主机便检测到有设备连接。<br /><br />它的枚举过程分析如下。<br /><br />设备连接到总线后,设备从总线获得5V电源,程序首先初始化,端口,然后向D12发出USB连接命令。主机检测到设备连接。主机向设备发出第一个信号:总线复位。总线复位产生一个中断,并且D12器件在默认地址0处使能,以便在接下来的枚举过程中使用地址0传输命令和数据,同时中断寄存器的总线复位位被置为1。在程序中的表现是,D12向主循环请求中断,进入中断处理程序USB_int_handler(),读取中断寄存器,确定中断的类型,进行相应的处理。<br /><br />主机使用默认地址0读取设备描述符。具体过程是:主机向D12发送第一个Setup包,每个Setup包都是8个字节,第一个包Get&nbsp;Descriptor的内容为:80&nbsp;06&nbsp;00&nbsp;01&nbsp;00&nbsp;00&nbsp;40&nbsp;00&nbsp;,数据为16进制表示。其中的40表示返回的数据最大长度为40H字节。此Setup包存储在D12的端点0缓冲区中,并产生一个外部中断。(这时在D12的中断寄存器中保存了中断的类型:端点0的OUT中断,即中断寄存器字节1的值应为0x01)进入中断服务程序后,由于D12端点0的缓冲区只有16个字节,所以单片机就先发送16个字节的设备描述符。当主机接收到这16个字节的字符后,就认为真正有设备连接了。<br /><br />地址分配。主机向D12发送第二个Setup包,这是一个含有指定地址的数据包,其内容一般为:00&nbsp;05&nbsp;02&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;,其中的02就表示主机为设备分配的地址为0x02,在以后的通信里设备就只对0x02地址的信息作出应答。D12收到这个Setup包后同样产生一个中断(端点0的OUT中断),需要注意的是单片机处理这个中断时需要向主机返回一个长度为0的空数据包。<br /><br />主机从新的地址获取设备描述符。主机收到设备发来的空的应答数据包后,确认地址分配成功。然后主机向D12发送第三个Setup包,再次要求获取设备描述符。这个Setup包的内容一般是:80&nbsp;06&nbsp;00&nbsp;01&nbsp;00&nbsp;00&nbsp;12&nbsp;00&nbsp;。与上次不同的是,这次要求实际的描述符长度,其中的12(十六进制数)表示要求得到全部18字节的设备描述符。因为每次只能发送16字节,因此程序中要分两次完成此要求。第一次16字节,第二次2字节。<br /><br />主机读取配置描述符。成功得到18字节的设备描述符后,主机向D12发送第四个Setup包,要求得到设备的配置描述符。这个Setup包的数据为:80&nbsp;06&nbsp;00&nbsp;02&nbsp;00&nbsp;00&nbsp;09&nbsp;00&nbsp;。其中的09指定设备返回9字节数据,这正是配置描述符的长度。<br /><br />读取描述符集合。成功得到9字节的配置描述符后,主机向D12发送第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80&nbsp;06&nbsp;00&nbsp;02&nbsp;00&nbsp;00&nbsp;FF&nbsp;00&nbsp;。由于不知道描述符集合的真实长度,因此它要求得到256字节。<br /><br />到这一步,主机现在应该已经发现新硬件并为新设备安装好驱动程序。对于以上过程,主机是在总线驱动层处理,下面的一步,也是典型枚举过程的最后一步,就需要设备驱动程序来做了。<br /><br />数值配置。主机得到各种描述符之后,认为设备的信息已经齐全,便对设备进行配置,使设备从地址状态进入配置状态。主机向D12发送第六个Setup包,其数据为:00&nbsp;09&nbsp;01&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;。程序中需要调用Set&nbsp;Configuration()函数处理此事件,允许所有端点进入工作状态。<br /><br />至此,USB枚举过程结束,设备可以正常使用了。在这个过程中D12指示灯根据通信的状况间歇闪烁。<br /><br />
 楼主| fengyeu 发表于 2007-12-9 14:08 | 显示全部楼层

添加中断

&nbsp;while(1)&nbsp;<br />&nbsp;{<br />&nbsp;if(!USB_INT)<br />&nbsp;{<br />&nbsp;P2=0X0F;<br />&nbsp;}
computer00 发表于 2007-12-11 01:26 | 显示全部楼层

嘿嘿,USB转串口做好了,

  
 楼主| fengyeu 发表于 2007-12-15 18:43 | 显示全部楼层

USB转串口.一口一口吃,!

USB转串口.一口一口吃,!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

446

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部