单片机/MCU论坛
直播中

李皮皮

11年用户 7经验值
擅长:可编程逻辑
私信 关注
[问答]

ch374芯片对应的单片机Atmega128L的USB设备无法被识别,设备描述符请求失败?

板子:Atmega128L单片机和USB芯片ch374,
功能:想实现电脑win10与单片机板子进行USB通信
参考的资料:是WCH南京沁恒微电子提供的相关资料。
开发环境:ICCV7 for AVR(也就是AVR软件)
测试现象:烧写程序后,win10计算机无法识别此USB设备(提示设备描述符请求失败)
现在遇到的问题:SPI初始化后,数据很乱,和ch374提供的SPI时序图图示不一样。

部分代码如下:
void CH374_PORT_init(void)//此函数在SPI_HW.C SPI_SW.C中都有出现。现在只使用此函数。
{
/*如下采用《AVR单片机SPI通讯实例程序》中的spi_init()简单初始化函数的典型写法*/
unsigned char temp;

if(4 == SPI_LIN_NUM) //spi为4线制 ★ ★ ★必须把MISO和MOSI引脚中间的电阻去掉  
{
/********** SPI复用功能引脚(PB0PB1PB2PB3)的初始化 及 配置 SPI的各寄存器配置 ****************/
  DDRB |= 0x80; //MISO=input; MOSI,SCK,SS=output
  PORTB |= 0x80;  //MISO上拉电阻有效
/* SPCR=01011100 SPCR[7:4] 禁止SPI中断; SPI使能; 高位字节首先发送; 主机模式;*/
/* SPCR=01011100 SPCR[3:0] 时钟极性设置为11即SPI模式3(上升沿输入,下降沿输出);SPI时钟频率(sck)设置为00即1/4系统时钟速率*/

/* 禁止SPI片选 */
/** ★ ★ ★初始化后,SPI片选信号SCS#需要先拉高用来驱动从机的SS引脚(参考A128数据手册 P151 ss引脚功能)
   参考ch374参考代码SPI_HW.C的CH374_SPI_SCS = 1; ★ ★ ★ */
  SCS1;  // 禁止SPI片选
  
  //SPCR = 0X5C; //SPI控制寄存器-SPCR  //没有使用SPI中断方式进行SPI传输。
  SPCR = 0X5D;//与陈品台沟通改了频率。
  
  SPSR = 0x00; //SPI状态寄存器-SPSR
  
  temp = SPSR;
  temp = SPDR; //清空SPI,(和中断标志),使SPI空闲 //这一句话没弄懂。/*SPDR:数据寄存器(写寄存器发送,读寄存器接收)*/


/********** 下面是启用单片机的 ★外部中断INT0(PD0引脚) ★,ch374的INT#脚连接到单片机的PD0上 ****************/
/* 下面启用单片机的外部中断0,CH374的INT#引脚可以连接到单片机的中断引脚,中断为低电平触发;(猜测:用来侦测USB是否识别)
   如果不使用中断,那么也可以用查询方式,由单片机程序查询CH374的INT#引脚是否为低电平 */
   DDRD &= ~(1 << PD0); //配置PD0为输入
   PORTD |= (1<< PD0); //配置上拉电阻有效
   
        EICRA = 0X00;  /* 设置中断敏感电平控制位 ISC01=0,ISC00 = 0;即设置外部信号为低电平时产生中断请求,触发中断处理函数 */
        EIFR = 0;  /* 清中断标志 */  /*EIFR: 外部中断标志寄存器*/
        EIMSK = 0X01; //外部中断0屏蔽寄存器等价于EIMSK |= 1<
}
else //(3 == SPI_LIN_NUM)  //spi为3根线MOSI和MISO共用一个引脚
{ //3线制的SPI
  DDRB |= 0x80; //MISO=input; MOSI,SCK,SS=output
  PORTB |= 0x80; //MISO上拉电阻有效
  SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
  /*没有写完,**/
}
}



void USB_device(void)
{
#if 0
          Wait374Interrupt();
#endif


#if 1
while(1)
{
        if ( Query374Interrupt( ))
                USB_DeviceInterrupt( );  // 等待USB设备中断,然后处理USB设备中断
}
#endif


#if 0
        FreeUSBmS = 0;  /* 清除USB空闲计时 */
        while( 1 )
        {
                if ( FreeUSBmS >= 250 )
                {  /* USB空闲超过250毫秒 */
                        printf( "Exit USB device moden" );
                        CH374OffUSB( );  /* 关闭USB设备 */        
                        return;
                }
                if ( FreeUSBmS < 250 ) FreeUSBmS ++;  /* USB空闲计时,避免在USB通讯过程中由用户按键导致USB主从切换 */
                delay_1ms();
/* USB设备模式全部在中断服务中处理,主程序可以做其它事情,当然也可以在主程序中使用查询方式处理USB设备的通讯 */
        }
#endif
}


BOOL Query374Interrupt( void )
{
#ifdef CH374_INT_line
          // return((GetBit(PIND,PD0)) ? FALSE : TRUE );
        return( CH374_INT_line ? FALSE : TRUE );  /* 如果单片机PD0连接了CH374的中断引脚则直接查询此中断引脚的值:宏定义GetBit(Pin,Num) */
#else
//#define        REG_INTER_FLAG                0x09                /*CH374芯片寄存器中的中断标志寄存器, 只读, 位写1清0 */
//#define        BIT_IF_INTER_FLAG        0x0F                /* 所有的USB中断标志 */
        return( Read374Byte( REG_INTER_FLAG ) & BIT_IF_INTER_FLAG ? TRUE : FALSE );  /* 如果未连接CH374的中断引脚则查询中断标志寄存器 */
#endif
}


  • 微信图片_20191105135937.png

回帖(1)

陈杰

2019-11-5 18:08:07
运行代码有什么提示吗
1 举报
  • 李皮皮: 没有提示啊。前期调试时,插USB线时,电脑对USB线都识别不到。现在可以看到USB设备,但是设备描述符请求失败。应该是SPI通信那一块有问题吧。

更多回帖

×
20
完善资料,
赚取积分