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

📄 main.c

📁 AVR单片机控制的PDIUSBD12原程序
💻 C
字号:
//********************************
//		   主程序
//	  编译环境WinAVR GCC
//        2007-01-9
//         hjxiang
//********************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "epphal.h"
#include "d12ic.h"
#include "isr.h"
#include "main.h"

extern void (*StandardDeviceRequest[])(void);
extern void (* VendorDeviceRequest[])(void);
#define F_IO  16000000    //单片机外部时钟频率
#define baud 1200        //串口通信波特率

#define RD_N		4
#define WR_N		5
#define ALE			6
#define CS_N		7
#define RESET_N		3
#define TXD232		1
#define INT_N		2
#define MCU_D12_CS_0()	PORTB&=~(1<<CS_N)
#define MCU_D12_CS_1()	PORTB|=(1<<CS_N)
#define LEDon()			PORTB&=~(1<<PB1)
#define LEDoff()		PORTB|=(1<<PB1)
void LED(void)
{
	while(1)
	{
		PORTC=0xff;
	}
}
void IO_Init(void)
{
	DDRB=(1<<CS_N)|(1<<RD_N)|(1<<WR_N)|(1<<RESET_N)|(1<<ALE);
	PORTB=(1<<CS_N)|(1<<RD_N)|(1<<WR_N)|(1<<RESET_N)|(1<<ALE);
	DDRD=(0<<INT_N)|(1<<TXD232);
	DDRC=0xff;
	PORTC=0;
}
//USART初始化
void USART_Init(void)
{
    /*设置波特率*/
	UCSRA = 0x00;
	//*接收器与发送器使能,接收结束中断使能*/
	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
	/*设置帧格式:8个数据位,1个停止位,偶校验位*/
	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1);
	UBRRH =(F_IO/baud/16-1)/256;
	UBRRL =(F_IO/baud/16-1)%256;
}
//串口发送数据
void put_c(unsigned char cData) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=cData;
}
void put_s(unsigned char *ptr)
{
	while (*ptr)
	{
		put_c(*ptr++);
	}
	put_c(0x0D);
	put_c(0x0A);  //结尾发送回车换行
}
//中断初始化
void Inter_Init(void)
{
	MCUCR=0;			//int0低电平中断
	GICR=(1<<INT0);
}
SIGNAL(SIG_INTERRUPT0)
{
	fn_usb_isr();
}
void main(void)
{
	IO_Init();
	USART_Init();
	Inter_Init();
	bEPPflags.value=0;				//清除事件标志寄存器bEPPflags
	reconnect_USB();
	sei();
	while(1)
	{
		if (bEPPflags.bits.bus_reset)    						//总线复位处理
		{
		 	bEPPflags.bits.bus_reset = 0;						//清标志
		}   
		if (bEPPflags.bits.suspend)								//总线挂起处理
	    {
		    bEPPflags.bits.suspend= 0;							//清标志
		} 
		if (bEPPflags.bits.setup_packet)						//协议处理
		{
			bEPPflags.bits.setup_packet = 0;					//清标志
			control_handler();
		}
	}
}

//断开USB总线
void disconnect_USB(void)
{
	//初始化D12工作状态,断开Soft Connect上拉电阻
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//连接USB总线
void connect_USB(void)
{
	DISABLE;
	bEPPflags.value=0;				//清除事件标志
	ENABLE;
	//初始化D12工作状态,接通Soft Connect上拉电阻
	D12_SetDMA(0); 
	D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M );

}
//重新连接到USB
void reconnect_USB(void)
{
	unsigned long clk_cnt;
	disconnect_USB();
	for(clk_cnt=0;clk_cnt<50000;clk_cnt++)
		;
	connect_USB();
}
//USB处理子程序
void control_handler(void)
{
	unsigned char type,req;
	type=ControlData.DeviceRequest.bmRequestType & USB_REQUSET_TYPE_MASK;
	req=ControlData.DeviceRequest.bRequest & USB_REQUSET_MASK;
//	put_c(req);
	if(type == USB_STANDERD_REQUEST)
		(*StandardDeviceRequest[req])();
	else
		if(type==USB_VENDOR_REQUEST)
			(*VendorDeviceRequest[req])();
		else
			stall_ep0();
}

⌨️ 快捷键说明

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