📄 main.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 + -