⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb1.c

📁 这是一个有关USB接口中传输数据的C语言源代码,对于通信方面的设计有很大的帮助
💻 C
字号:
#include <main.h>
#include <string.h>
#include <stdio.h>
#include <avr/io.h>

#define usb_cmd (*(volatile unsigned char *)0xa001)
#define usb_data (*(volatile unsigned char *)0xa000)
#define	CMD_SET_USB_MODE	0x15			/* 设置USB工作模式 */
#define	CMD_RET_SUCCESS		0x51			/* 命令操作成功 */
#define	CMD_RESET_ALL		0x05			/* 执行硬件复位 */
#define	CMD_CHECK_EXIST		0x06			/* 测试工作状态 */
#define DISK_CONNECT			0x02	/* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
#define	CMD_GET_STATUS		0x22			/* 获取中断状态并取消中断请求 */
#define	USB_INT_DISCONNECT	0x16			/* 检测到USB设备断开事件 */
#define	USB_INT_CONNECT		0x15			/* 检测到USB设备连接事件 */
#define DISK_DISCONNECT			0x01	/* 磁盘没有连接或者已经断开 */
#define ERR_SUCCESS				0x00	/* 操作成功 */
#define	USB_INT_SUCCESS		 0x14			/* USB事务或者传输操作成功 */
#define	CMD_DISK_INIT		0x51			/* 主机方式: 初始化USB存储器 */
#define	CMD_DISK_SIZE		0x53			/* 主机方式: 获取USB存储器的容量 */

 #ifndef UINT8
typedef unsigned char                UINT8;
#endif
#ifndef UINT16
typedef unsigned short               UINT16;
#endif


  extern  UINT8   CH375DiskStatus;
  extern  UINT8    CH375DiskConnect(void );
  extern  UINT8      CH375IntStatus;
void port_init(void)
 {
   DDRA=0XFF;
   DDRC=0XFF;
   PORTC&=~0X80;
   DDRE=0X00;
   DDRG=0X00;
 }
 void CH375_port_init(void)
 {
 DDRA=0X00;
 DDRG=0X00;
 PORTG=0X1F;
 DDRC=0X00;
 PORTC=0X00;
 DDRE=0XFF;
 }
 void init_devices(void)
 {
 CLI();
 port_init();
 CH375_port_init();
 MCUCR=0X80;
 EICRB=0X00;
 EIMSK|=0X10;
 SEI();
 }
 
 
void delayms( UINT8  m) 
  { 
  UINT8 i,j; 
  while(m--)
  {for ( i = 100; i != 0; i -- )
  for ( j=10; j!=0; j-- );}
  }
  
 void delay2us(  UINT16  m) 
  { 
  UINT8 i; 
  while(m--)
  {for ( i = 2; i != 0; i -- );}
  
 }
 
 void xWriteCH375Cmd( UINT8 mCmd )		/* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */
{
	delay2us(1); /* 至少延时1uS */
   /*	*(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData;  通过并口直接读写CH375而非普通I/O模拟 */
	PORTC |= 0x02;  /* 输出A0=1 ;CS=0*/
	PORTA = mCmd;  /* 向CH375的并口输出数据 */
	DDRA = 0xFF;  /* 并口D0-D7输出 */
	PORTG=0X1E;  /* WR=0;RD=1*/
	DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	DDRA = 0x00;  /* 禁止数据输出 */
	delay2us(1);  /* 至少延时2uS */
} 

 UINT8 xReadCH375Data(void)			/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
{
	UINT8	mData;
/*	mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR;  通过并口直接读写CH375而非普通I/O模拟 */
	delay2us(1);  /* 至少延时1.2uS */
	DDRA = 0x00;  /* 数据输入 */
	PORTC=0x00;  /* 输出A0=0 ;CS=0*/
	PORTG=0X1C;  /* WR=1;RD=0*/
	DDRA = 0x00;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	mData = PINA;  /* 从CH375的并口PA输入数据 */
	return( mData );
}


void xWriteCH375Data( UINT8 mData )		/* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
{
/*	*(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData;  通过并口直接读写CH375而非普通I/O模拟 */
	PORTA = mData;  /* 向CH375的并口输出数据 */
	DDRA = 0xFF;  /* 并口D0-D7输出 */
	PORTG=0X1E;  /* 输出有效写控制信号, 写CH375芯片的数据端口,WR=0;RD=1*/
	PORTC=0x00;  /* 输出A0=0 ;CS=0*/
	DDRA = 0xFF;  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	DDRA = 0x00;  /* 禁止数据输出 */
	delay2us(1);  /* 至少延时2uS */
}

  /* 设置CH375的工作模式 */
 UINT8 set_usb_mode(UINT8 mode )
 {
	  UINT8 i;
	  UINT8 RD_Data;

	 xWriteCH375Cmd(CMD_SET_USB_MODE);
	 delay2us(1);

	 xWriteCH375Data(mode);
      delay2us(1);
	 for ( i = 100; i != 0; i -- )  /* 等待设置模式操作完成,不超过30uS */
	 {
	  RD_Data=xReadCH375Data();
	 if( RD_Data == CMD_RET_SUCCESS )
	 return 1;
	 }  /* 成功 */
	 return 0;
 }

  
 UINT8 ch375_init(UINT8 mode)
{
	 UINT8 i, k;
	 
     /* 测试CH375是否正常工作 */
	 for( k=100; k!=0; k-- )
	   {
		 xWriteCH375Cmd(CMD_CHECK_EXIST) ;  /* 测试CH375是否正常工作 */
		 delay2us(1);
		 xWriteCH375Data(0x0f); /* 写入测试数据 */
	     /* 返回数据应该是测试数据取反 */
		 delay2us(1);
		 i=xReadCH375Data();
	     if ( 0xf0!= i)   /* CH375不正常 */
	    {
		    for ( i=5; i!=0; i-- )
			  xWriteCH375Cmd(CMD_RESET_ALL);  /* 多次重复发命令,执行硬件复位 */
			
             delayms(50);  /* 延时50ms */
	    }
		else
        break;
	 }    if( k==0 )
       return 0;
	   /* 设置USB工作模式, 必要操作 */
        set_usb_mode( 6 ); /*已启用的主机方式并且自动产生SOF  */
     return set_usb_mode(mode); //内部固件模式
  }
 
 


/* 检查操作状态,如果错误则显示错误代码并停机 */
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
	printf( "Error: %02X\n", (UINT16)iError );  /* 显示错误 */
	
}

#ifndef NO_DEFAULT_CH375_INT			/* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
#if LIB_CFG_INT_EN == 0					/* CH375的INT#引脚连接方式为"查询方式" */
void xQueryInterrupt( void )			/* 查询CH375中断并更新中断状态 */
{
	while ( PINE&0x10 );  /* 如果CH375的中断引脚输出高电平则等待 */
	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
}
#else									/* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */
void xQueryInterrupt( void )			/* 查询中断状态,等待硬件中断 */
{
	while ( CH375IntStatus == 0 );		/* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */
}
void	CH375Interrupt( void ) __attribute__ ((signal));
void	CH375Interrupt( void )			/* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 */
{
	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取中断状态并取消中断请求 */
	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
#ifdef CLEAR_INT_MARK
	CLEAR_INT_MARK( );  /* 某些单片机需要由软件清除中断标志 */
#endif
}
#endif
#endif

 UINT8 waitint(void)
{ 
  while(PINE&0x10);
  xWriteCH375Cmd(CMD_GET_STATUS);
  delay2us(2);
  
  return xReadCH375Data( );
  
}
 
   UINT8 InitDisk(void)
 { 
    UINT8    Status;
   xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
   delay2us(10);
   Status = xReadCH375Data( );  /* 获取中断状态 */
   if (Status==USB_INT_DISCONNECT) return Status;//usb断开
   xWriteCH375Cmd(CMD_DISK_INIT);
   Status=waitint(  );
   if (Status!=USB_INT_SUCCESS) return Status;
   xWriteCH375Cmd(CMD_DISK_SIZE);
   Status=waitint(  );
   if (Status!=USB_INT_SUCCESS) 
   {
      delayms(250);
	  xWriteCH375Cmd(CMD_DISK_SIZE);
      Status=waitint(  );   
   }
    if (Status!=USB_INT_SUCCESS) return Status;
	return 1;//u盘初始化成功
}

 
 void main(void )
 {
    UINT8 i,  c;
	UINT16  TotalSize;
	port_init();
	CH375_port_init();
	init_devices();
    delay2us(10);
	
    ch375_init();
  
while ( 1 )
      {
//		while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
		while ( CH375DiskStatus < DISK_CONNECT ) 
		{  /* 查询CH375中断并更新中断状态,等待U盘插入 */
			if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
             delayms(100);
		}
		
		  delayms(200);;  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

          
		}
		
   
 }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -