dragontan
驱动牛犊
驱动牛犊
  • 注册日期2003-12-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1222回复:3

关于PIC+D12实现USB通讯的问题!?

楼主#
更多 发布于:2005-02-24 09:25
PDIUSBD12不能枚举,读芯片ID的问题!?
大家好,我使用 D12与PIC做USB的通讯 ,采取自供电的方式。
上电后,检查Vout输出3.3V,CLKOUT输出4M(复位默认值)--我认为D12已经可以正常工作了。
但是D12不能枚举,读取D12的芯片ID时出现的问题很奇怪。

我先把最低层的2个函数列出如下:
void outportb(unsigned char A0,unsigned char data)
{
    TRISC=0x00;     //make the RC output,when writing    
    RB2=(A0==0x01)?1:0;  //RB1 link to D12\'s A0,COMMAND=1,DATA=0
    PORTC=data;     //write D12
    RB4=0b1;      
    RB4=0b0;        //link RB4 to D12\'s wr_n
    RB4=0b1;        //wr_n ~_~ low length=1us@4Mhz
}

unsigned char inportb(unsigned char A0)
{
    unsigned char data;
    TRISC=0xff;     //make the RC input,when reading  
    RB2=(A0==0x01)?1:0;  //RB2 link to D12\'s A0
    RB3=0b1;    
    RB3=0b0;        //link RB3 to D12\'s rd_n
    data=PORTC;        //read D12
    RB3=0b1;        //rd_n ~_~ low length=1us@4Mhz
    return data;
}

单步执行的时候,可以读出芯片ID(0x1012),全速运行时ID读错,D12枚举不成功。
我的观点总结出以下几条:
1. PIC与D12的数据接口(D0~D7,A0,WR,RD),连接上应该没有问题,不然单步不会读出正确的ID
2. 我觉得问题可能就出在底层读写的这两个函数上,可能是时序上安排不对,但是我已经根据D12手册上的时序去做的。
3. 硬件上,CS_N,SUSPEND,以及ALE都接地;EOT_N,DMACK_N和RESET_N分别通过一电阻接VCC。

希望朋友们能给在下看看,指点指点,指一条明路!万分感谢!
再下叩首。
 
我只是想做些通讯,混口饭吃而已,这么难吗?
chen036066182
驱动牛犊
驱动牛犊
  • 注册日期2004-12-13
  • 最后登录2006-08-10
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-24 20:53
顶,兄弟努力
cuihua
tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-25 11:05
从描述的来看,应该是读写的问题,D12要求2次连续的读写间隔至少是500ns,命令和数据之间更要求是600ns,会不会是你pic速度太快
造成的错误
dragontan
驱动牛犊
驱动牛犊
  • 注册日期2003-12-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-03 08:15
我来结下帖^_^

是写入时序不大对
应该是:先写数据,再设置a0,然后wr
 
void outportb(unsigned char A0,unsigned char data)
{
TRISC=0x00; //make the RC output,when writing
PORTC=data; //write D12
RB2=(A0==0x01)?1:0; //RB1 link to D12\'s A0,COMMAND=1,DATA=0
RB4=0b1;
RB4=0b0; //link RB4 to D12\'s wr_n
RB4=0b1; //wr_n ~_~ low length=1us@4Mhz
}

谢谢大家!!
我只是想做些通讯,混口饭吃而已,这么难吗?
游客

返回顶部