打印

给OO的PDIUSBD12读ID程序提取

[复制链接]
2491|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengyeu|  楼主 | 2007-12-2 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
给OO的PDIUSBD12读ID程序提取/********************************************************************
  main.c file
********************************************************************/
#include "at89x52.h"
#define Fclk      22118400UL         /*使用22.1184M晶体*/
#define BitRate   9600UL             /*波特率定义为9600*/
#define uint8    unsigned char
#define uint16   unsigned short int
unsigned char Sending;
/****************USB部分****************************/
#define USB_COMMAND_ADD           1
#define USB_DATA_ADD              0
#define Read_ID                  0xFD
//USB芯片连接引脚
#define USB_DATA                  P0
#define USB_A0                    P3_5
#define USB_WR                    P3_6
#define USB_RD                    P3_7
#define USB_INT                   P3_2
/********************************************************************
函数功能:写USB命令。
入口参数:一字节命令。
********************************************************************/
void WriteUsbCommand(uint8 usb_command)
{
 USB_A0=USB_COMMAND_ADD;
 USB_DATA=usb_command;
 USB_WR=0;
 USB_WR=1;
 USB_DATA=0xFF;
}
/********************************************************************
函数功能:读一字节USB数据。
返    回:读回的一字节。
********************************************************************/
uint8 ReadUsbData(void)
{
 uint8 temp;
 USB_A0=USB_DATA_ADD;
 USB_RD=0;
 temp=USB_DATA;
 USB_RD=1;
 return temp;
}
/********************************************************************
函数功能:读D12的ID。
返    回:D12的ID。
********************************************************************/
uint16 ReadD12ID(void)
{
 uint16 id;
 WriteUsbCommand(Read_ID);
 ((uint8*)&id)[1]=ReadUsbData();
 ((uint8*)&id)[0]=ReadUsbData();
 return id;
}
/*USB部分结束******************************************/


/******************************************************************
UART.C  file        部分 
********************************************/
/********************************************************************
函数功能:串口初始化。
********************************************************************/
void InitUART(void)
{
 EA=0;
 TMOD&=0x0F;
 TMOD|=0x20;    //定时器1工作在模式2
 SCON=0x50;     //串口工作在模式1
 TCON=0x05;
 TH1=256-Fclk/(BitRate*12*16);
 TL1=256-Fclk/(BitRate*12*16); 
 PCON=0x80;    //串口波特率加倍
 ES=1;         //串行中断允许
 TR1=1;        //启动定时器1
 REN=1;        //允许接收 
 EA=1;         //允许中断
}
/********************************************************************
函数功能:串口中断处理。
********************************************************************/
void UartISR(void) interrupt 4
{
   TI=0;
   Sending=0;  //清正在发送标志
}
/********************************************************************
函数功能:往串口发送一字节数据。
入口参数:d: 要发送的字节数据。
********************************************************************/
void UartPutChar(uint8 d)
{
 Sending=1;
 SBUF=d;
 while(Sending);
}
/********************************************************************
函数功能:发送一个字符串。
入口参数:pd:要发送的字符串指针。
********************************************************************/
void Prints(uint8 * pd)
{
 while((*pd)!='\0')
  {
   UartPutChar(*pd);
   pd++;
  }
}
code uint8 HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/********************************************************************
函数功能:将短整数按十六进制发送。
入口参数:待发送的整数。
********************************************************************/
void PrintShortIntHex(uint16 x)
{
 uint8 i;
 uint8 display_buffer[6];
 display_buffer[0]='0';
 display_buffer[1]='x';
 for(i=5;i>=2;i--)
  {
   display_buffer=HexTable[(x&0xf)];
   x>>=4;
  }
 Prints(display_buffer);
}
/******************************************************************
UART.C  file       END(结束)
********************************************/
/********************************************************************
函数功能:主函数。
********************************************************************/
void main(void)
{
 uint16 id;
 InitUART();          //初始化串口
 id=ReadD12ID();
 PrintShortIntHex(id);
 while(1)
 {
 }
}


相关帖子

沙发
computer00| | 2007-12-2 22:35 | 只看该作者

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

原版的测试程序,还带键盘扫描的:http://computer00.21ic.org/user1/2198/archives/2007/43612.html

使用特权

评论回复
板凳
fengyeu|  楼主 | 2007-12-2 22:39 | 只看该作者

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

/********************************************************************
  main.c file
********************************************************************/
#include "at89x52.h"
#define Fclk      22118400UL         /*使用22.1184M晶体*/
#define BitRate   9600UL             /*波特率定义为9600*/
#define uint8    unsigned char
#define uint16   unsigned short int
unsigned char Sending;
/****************USB部分****************************/
#define USB_COMMAND_ADD           1
#define USB_DATA_ADD              0
#define Read_ID                  0xFD
//USB芯片连接引脚
#define USB_DATA                  P0
#define USB_A0                    P3_5
#define USB_WR                    P3_6
#define USB_RD                    P3_7
#define USB_INT                   P3_2
/********************************************************************
函数功能:写USB命令。
入口参数:一字节命令。
********************************************************************/
void WriteUsbCommand(uint8 usb_command)
{
 USB_A0=USB_COMMAND_ADD;
 USB_DATA=usb_command;
 USB_WR=0;
 USB_WR=1;
 USB_DATA=0xFF;
}
/********************************************************************
函数功能:读一字节USB数据。
返    回:读回的一字节。
********************************************************************/
uint8 ReadUsbData(void)
{
 uint8 temp;
 USB_A0=USB_DATA_ADD;
 USB_RD=0;
 temp=USB_DATA;
 USB_RD=1;
 return temp;
}
/********************************************************************
函数功能:读D12的ID。
返    回:D12的ID。
********************************************************************/
uint16 ReadD12ID(void)
{
 uint16 id;
 WriteUsbCommand(Read_ID);
 ((uint8*)&id)[1]=ReadUsbData();
 ((uint8*)&id)[0]=ReadUsbData();
 return id;
}
/*USB部分结束******************************************/

/********************************************************************
函数功能:主函数。
********************************************************************/
void main(void)
{
 uint16 id;
 id=ReadD12ID();
 while(1)
 {
 P1=id;        //通过P1口和P2口显示ID
 P2=id>>8;
 }
}

使用特权

评论回复
地板
xwj| | 2007-12-2 22:45 | 只看该作者

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

要有精益求精的精神,
更要有闻过则喜的态度

使用特权

评论回复
5
fengyeu|  楼主 | 2007-12-2 23:04 | 只看该作者

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

我只是对读ID相关的感兴趣!看了好一会才看到原来是这样读ID的
USB-int也不需要用。
俺C也刚学。

/********************************************************************
  main.c file
********************************************************************/
#include "at89x52.h"
#define uint16   unsigned short int
#define USB_COMMAND_ADD           1     //命令
#define USB_DATA_ADD              0     //数据    
#define Read_ID                  0xFD  //读ID的命令参数
//USB芯片连接引脚
#define USB_DATA                  P0
#define USB_A0                    P3_5
#define USB_WR                    P3_6
#define USB_RD                    P3_7
/********************************************************************
函数功能:写USB命令。
入口参数:一字节命令。
********************************************************************/
void WriteUsbCommand(unsigned char usb_command)
{
 USB_A0=USB_COMMAND_ADD;
 USB_DATA=usb_command;
 USB_WR=0;
 USB_WR=1;
 USB_DATA=0xFF;
}
/********************************************************************
函数功能:读一字节USB数据。
返    回:读回的一字节。
********************************************************************/
unsigned char ReadUsbData(void)
{
 unsigned char temp;
 USB_A0=USB_DATA_ADD;
 USB_RD=0;
 temp=USB_DATA;
 USB_RD=1;
 return temp;
}
/********************************************************************
函数功能:读D12的ID。
返    回:D12的ID。
********************************************************************/
uint16 ReadD12ID(void)
{
 uint16 id;
 WriteUsbCommand(Read_ID);
 ((unsigned char*)&id)[1]=ReadUsbData();
 ((unsigned char*)&id)[0]=ReadUsbData();
 return id;
}
/********************************************************************
函数功能:主函数。
********************************************************************/
void main(void)
{
 uint16 id;
 id=ReadD12ID();
 while(1)
 {
 P1=id;        //通过P1口和P2口显示ID
 P2=id>>8;
 }
}

使用特权

评论回复
6
computer00| | 2007-12-2 23:07 | 只看该作者

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

回事了~~~~~~~~~

使用特权

评论回复
7
computer00| | 2007-12-2 23:11 | 只看该作者

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

使用特权

评论回复
8
fengyeu|  楼主 | 2007-12-9 13:46 | 只看该作者

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



#include<Atmel/AT89x52.H>

//初始化命令   pdiusbd12.h  file
#define Set_Address              0xD0
#define Set_Endpoint_Enable      0xD8

#define USB_COMMAND_ADD           1
#define USB_DATA_ADD              0

#define USB_DATA                  P0
#define USB_A0                    P3_2
#define USB_WR                    P3_6
#define USB_RD                    P3_7
#define USB_INT                   P3_3

//*****************   延时x毫秒函数 ***********
void delay(unsigned int x)                
{
 unsigned int i;
 unsigned int j;
 for(i=0;i<x;i++)
 for(j=0;j<230;j++);
}
//********************************************

void write_usb_command(unsigned char usb_command)       //写USB命令
{
 USB_A0=USB_COMMAND_ADD;
 USB_DATA=usb_command;
 USB_WR=0;
 USB_WR=1;
 USB_DATA=0xFF;
}

void write_a_usb_data(unsigned char usb_data)        //写一字节USB数据
{
 USB_A0=USB_DATA_ADD;
 USB_DATA=usb_data;
 USB_WR=0;
 USB_WR=1;
 USB_DATA=0XFF;
}
void set_usb_addr(unsigned char addr)          //设置USB地址
{
 write_usb_command(Set_Address);
 write_a_usb_data(0x80|addr);
}
void set_endpoint_enable(void)                  //端点使能
{
 write_usb_command(Set_Endpoint_Enable);
 write_a_usb_data(0x01);
}

void disconnect_usb(void)
{
 write_usb_command(0xf3);
 write_a_usb_data(0x0e);
 write_a_usb_data(0x47);
 delay(100);
}

void connect_usb(void)                            //连接USB
{
 write_usb_command(0xf3);                         //初始化USBD12
 write_a_usb_data(0x1e);                          //连接USB
 write_a_usb_data(0x47);                          //设置频率
}

void init_usb(void)                              //初始化USB
{
 set_usb_addr(0);
 set_endpoint_enable();
}

void main(void)
{
 disconnect_usb();
 init_usb();
 connect_usb();
 while(1) {}
 
}

使用特权

评论回复
9
fengyeu|  楼主 | 2007-12-9 13:56 | 只看该作者

详细枚举(转)

USB枚举过程详述
                                       

USB枚举过程详述

注:这是我毕业设计论文中的一部分。写作过程参考了“驱动开**坛”上一些网友提供的资料,在此表示感谢。由于第一次接触 USB 技术,其中难免有所差误,如有高人路过,还请指点。

 本系统中所谓USB设备即是指温度测量和控制的设备,设备采用USB总线供电,采用D12芯片内置的SoftConnect技术与USB总线连接。所谓SoftConnect意思是在程序中通过向D12发送命令实现USB设备的连接或者断开连接,这里的连接并不是指USB电缆的插上或拔出,相反USB连接可以重新初始化而不需要拔出电缆。

主机是通过检测Vcc上拉电阻的变化来确定是否有设备连接的。在D12内部集成了1.5kΩ的上拉电阻,默认状态下不与Vcc相连,程序运行时可以向D12发送连接命令使1.5kΩ电阻连接到Vcc,这样主机便检测到有设备连接。

它的枚举过程分析如下。

设备连接到总线后,设备从总线获得5V电源,程序首先初始化,端口,然后向D12发出USB连接命令。主机检测到设备连接。主机向设备发出第一个信号:总线复位。总线复位产生一个中断,并且D12器件在默认地址0处使能,以便在接下来的枚举过程中使用地址0传输命令和数据,同时中断寄存器的总线复位位被置为1。在程序中的表现是,D12向主循环请求中断,进入中断处理程序USB_int_handler(),读取中断寄存器,确定中断的类型,进行相应的处理。

主机使用默认地址0读取设备描述符。具体过程是:主机向D12发送第一个Setup包,每个Setup包都是8个字节,第一个包Get Descriptor的内容为:80 06 00 01 00 00 40 00 ,数据为16进制表示。其中的40表示返回的数据最大长度为40H字节。此Setup包存储在D12的端点0缓冲区中,并产生一个外部中断。(这时在D12的中断寄存器中保存了中断的类型:端点0的OUT中断,即中断寄存器字节1的值应为0x01)进入中断服务程序后,由于D12端点0的缓冲区只有16个字节,所以单片机就先发送16个字节的设备描述符。当主机接收到这16个字节的字符后,就认为真正有设备连接了。

地址分配。主机向D12发送第二个Setup包,这是一个含有指定地址的数据包,其内容一般为:00 05 02 00 00 00 00 00 ,其中的02就表示主机为设备分配的地址为0x02,在以后的通信里设备就只对0x02地址的信息作出应答。D12收到这个Setup包后同样产生一个中断(端点0的OUT中断),需要注意的是单片机处理这个中断时需要向主机返回一个长度为0的空数据包。

主机从新的地址获取设备描述符。主机收到设备发来的空的应答数据包后,确认地址分配成功。然后主机向D12发送第三个Setup包,再次要求获取设备描述符。这个Setup包的内容一般是:80 06 00 01 00 00 12 00 。与上次不同的是,这次要求实际的描述符长度,其中的12(十六进制数)表示要求得到全部18字节的设备描述符。因为每次只能发送16字节,因此程序中要分两次完成此要求。第一次16字节,第二次2字节。

主机读取配置描述符。成功得到18字节的设备描述符后,主机向D12发送第四个Setup包,要求得到设备的配置描述符。这个Setup包的数据为:80 06 00 02 00 00 09 00 。其中的09指定设备返回9字节数据,这正是配置描述符的长度。

读取描述符集合。成功得到9字节的配置描述符后,主机向D12发送第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80 06 00 02 00 00 FF 00 。由于不知道描述符集合的真实长度,因此它要求得到256字节。

到这一步,主机现在应该已经发现新硬件并为新设备安装好驱动程序。对于以上过程,主机是在总线驱动层处理,下面的一步,也是典型枚举过程的最后一步,就需要设备驱动程序来做了。

数值配置。主机得到各种描述符之后,认为设备的信息已经齐全,便对设备进行配置,使设备从地址状态进入配置状态。主机向D12发送第六个Setup包,其数据为:00 09 01 00 00 00 00 00 。程序中需要调用Set Configuration()函数处理此事件,允许所有端点进入工作状态。

至此,USB枚举过程结束,设备可以正常使用了。在这个过程中D12指示灯根据通信的状况间歇闪烁。

使用特权

评论回复
10
fengyeu|  楼主 | 2007-12-9 14:08 | 只看该作者

添加中断

 while(1) 
 {
 if(!USB_INT)
 {
 P2=0X0F;
 }

使用特权

评论回复
11
computer00| | 2007-12-11 01:26 | 只看该作者

嘿嘿,USB转串口做好了,

使用特权

评论回复
12
fengyeu|  楼主 | 2007-12-15 18:43 | 只看该作者

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

446

帖子

0

粉丝