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

📄 main.c

📁 这是USBD12芯片与PC机通讯的单片机固件程序
💻 C
字号:
#include <reg922.h>
#include <intrins.h>
#include "D12Config.h"
#include "Descriptor.h"
#include "Chap_9.h"
#include "D12Driver.h"
#include "D12CI.h"
#include "I2c_C51.h"

unsigned char idata  CommandBuf[8];
unsigned char idata  VerifyByte;
//sbit pin_LED = P1^2;
/*Not Used yet...Slm
void Delay (unsigned long t)
{ 
	unsigned long i;
	for(i=0;i<=t;i++) _nop_();
}
*/
void SysInit()
{
	P0M1&=0;
	P0M2&=0;
	P1M1&=0;
	P1M2&=0;
	P1M1|=0x1c;
	P1M2|=0x0c;
	P3M1&=0;
	P3M2&=0;
}

void I2cServe(unsigned char *Buf);
void main()
{
   	SysInit();//初始化端口配置
	
	if (Init_D12()!=0)					//初始化D12
		return;							//如果初始化不成功,返回
	
	while(1)
	{    	
		usbserve();						//处理USB事件
		if( (bEPPflags.bits.configuration) && (bEPPflags.bits.ep1_rxdone) )
		{
			DISABLE();
			CommandBuf[0] = GenEpBuf[0];
			CommandBuf[1] = GenEpBuf[1];
			CommandBuf[2] = GenEpBuf[2];
			CommandBuf[3] = GenEpBuf[3];
			CommandBuf[4] = GenEpBuf[4];
			CommandBuf[5] = GenEpBuf[5];
			CommandBuf[6] = GenEpBuf[6];
			CommandBuf[7] = GenEpBuf[7];
			bEPPflags.bits.ep1_rxdone = 0;
			ENABLE();//当数据移到CommandBufp[]后再开中断以便GenEpBuf[]接收新命令...
			I2cServe( CommandBuf );//处理命令包
			D12_WriteEndpoint(3, 8, CommandBuf);//处理后将包回执
        }		
	}//end while
	return;//end main()
}

/******* 下面为应用程序 *************/

/*******************************************************************
** 函数名称: I2cServe()
** 功能描述: 处理I2c的控制信息
** 输	 入: 无
** 输	 出: 无
GenEpBuf[0]:读/写控制 00=Bit读 01=Bit写 02=Byte读 03=Byte写 ff=读Firmware Version
fe=读Hardware Version
GenEpBuf[1]:设备地址
GenEpBuf[2]:读/写的数据,在Bit模式下:D7-D4=Bit number(0-7);D3-D0=Set/read value
GenEpBuf[3]:保留
GenEpBuf[4]:保留
GenEpBuf[5]:处理结果,0xaa:成功 0x55:失败 0xbb:未定义的命令代码 0xab:校验错误!
GenEpBuf[6]:处理结果,0xaa:成功 0x55:失败 0xbb:未定义的命令代码 0xab:校验错误!
GenEpBuf[7]:前7个字节的校验和
********************************************************************/
void I2cServe(unsigned char *Buf)//接收到主机发来的I2c控制信息并处理它
{
	unsigned char VerifyByte=Buf[0]^Buf[1]^Buf[2]^Buf[3]^Buf[4]^Buf[5]^Buf[6];
	unsigned char Sta,BitNum,SetBit;

	if(VerifyByte != Buf[7])//校验错误!
	{
		Buf[5]=0xab;
		Buf[6]=0xab;
		return;
	}
	
	switch(Buf[0])//命令解析
	{
	case 0xff://读Firware版本号
		Buf[0] = '1';
		Buf[1] = '.';
		Buf[2] = '0';
		Buf[3] = '2';
		break;
	case 0xfe://读Hardware Version
		Buf[0] = '2';
		Buf[1] = '.';
		Buf[2] = '0';
		Buf[3] = '0';
		break;
	case 0x00://Bit读
        BitNum=(Buf[2]>>4);
		Sta=Read_port_bit(Buf[1],BitNum);
		if(Sta==0xaa)//读失败
		{
			Buf[5]=0x55;
			Buf[6]=0x55;
		}
		else//读成功
		{
			Buf[5]=0xaa;
			Buf[6]=0xaa;
			Buf[2]=( Buf[2]&0xf0 );
			Buf[2]=( Buf[2]|Sta );
		}
		break;
	case 0x01://Bit写
		BitNum=(Buf[2]>>4);
		SetBit=( Buf[2]&0x0f );
		if( I2c_bit(SetBit,BitNum,Buf[1]) )
		{
			Buf[5]=0xaa;//写成功
			Buf[6]=0xaa;
		}
		else//写失败
		{
			Buf[5]=0x55;
			Buf[6]=0x55;
		}
		break;
	case 0x02://Byte读
		if( IRcvByte(Buf[1], &Buf[2]) )
		{
			Buf[5]=0xaa;//读成功
			Buf[6]=0xaa;
		}
		else//读失败
		{
			Buf[5]=0x55;
			Buf[6]=0x55;
		}
		break;
	case 0x03://Byte写
		if( ISendByte(Buf[1],Buf[2]) )
		{
			Buf[5]=0xaa;
			Buf[6]=0xaa;
		}
		else
		{
			Buf[5]=0x55;
			Buf[6]=0x55;
		}
		break;
	default://以上都不是则写错误代码
		Buf[5]=0xbb;
		Buf[6]=0xbb;
		break;
	}//end switch

	return;//end function
}

⌨️ 快捷键说明

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