完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
板子: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 /* //#define BIT_IF_INTER_FLAG 0x0F /* 所有的USB中断标志 */ return( Read374Byte( REG_INTER_FLAG ) & BIT_IF_INTER_FLAG ? TRUE : FALSE ); /* 如果未连接CH374的中断引脚则查询中断标志寄存器 */ #endif }
|
|
相关推荐
1个回答
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11780 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 04:14 , Processed in 0.859907 second(s), Total 84, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号