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

📄 usbop.cpp

📁 一个很好的基于USB开发的VC++资料.一个很好的基于USB开发的VC++资料
💻 CPP
字号:
// USBOP.cpp: implementation of the CUSBOP class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "USBISP.h"
#include "USBOP.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

usb_dev_handle *handle= NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CUSBOP::CUSBOP()
{

}

CUSBOP::~CUSBOP()
{

}

int CUSBOP::usbaspOpen()
{
	struct usb_bus      *bus;
	struct usb_device   *dev;
	int                 errorCode = USB_ERROR_NOTFOUND;
	static int          didUsbInit = 0;

	if(!didUsbInit)
	{
		didUsbInit = 1;
		usb_init();
	}

	usb_find_busses();
	Sleep(1);

	char i=usb_find_devices();
	CString a;
	a.Format("%d",i);
	//::AfxMessageBox(a);

	for(bus=usb_get_busses(); bus; bus=bus->next)
	{
		for(dev=bus->devices; dev; dev=dev->next)
		{	
			if(dev->descriptor.idVendor == USBDEV_SHARED_VENDOR && dev->descriptor.idProduct == USBDEV_SHARED_PRODUCT)
			{
				handle=usb_open(dev); // we need to open the device in order to query st 
				if(!handle)
				{
					errorCode = USB_ERROR_ACCESS;
					fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror());
					::AfxMessageBox("Could not open USB device");
					continue;
				}
				else break;
			}
		}
		if(handle)
			break;
	}
	if(handle!=NULL)
	{
		errorCode=0;
	}
	return errorCode;
}

BOOL CUSBOP::usbaspClose()
{
	unsigned char temp[4];
	if (!handle)
		return FALSE;

	memset(temp, 0, sizeof(temp));
	usbaspTransmit(1, USBASP_FUNC_DISCONNECT, temp, temp, sizeof(temp));
	usb_close(handle);
	return TRUE;
}

int CUSBOP::usbaspTransmit(unsigned char receive, unsigned char functionid,unsigned char send[4], unsigned char * buffer, int buffersize)
{
	if(handle==NULL)
	{
		AfxMessageBox("USB句柄无效");
		return 0;
	}
	int nbytes;
	nbytes = usb_control_msg(handle,
			   USB_TYPE_VENDOR | USB_RECIP_DEVICE | (receive << 7),
			   functionid,
			   (send[1] << 8) | send[0],
			   (send[3] << 8) | send[2],
			   (char *)buffer,buffersize,
			   5000);
	if(nbytes < 0)
	{
		//ShowMessage("usbasp_transmit:\n");
		//exit(1);
	}
	return nbytes;
}

BOOL CUSBOP::usbaspConnect()
{
	unsigned char temp[4];
	memset(temp, 0, sizeof(temp));
	memset(temp, 0, sizeof(temp));
	temp[0]=0x02;
	temp[2]=m_ChipType.IspSck; //固件速度
	temp[3]=m_ChipType.FType; //芯片类型
	usbaspTransmit(1, USBASP_FUNC_CONNECT, temp, temp, sizeof(temp));
	return TRUE;
}

BOOL CUSBOP::usbaspDisconnect()
{
	unsigned char temp[4];
	memset(temp, 0, sizeof(temp));
	memset(temp, 0, sizeof(temp));
	temp[0]=0x02;
	usbaspTransmit(1,USBASP_FUNC_DISCONNECT, temp, temp, sizeof(temp));
	return TRUE;
}

int CUSBOP::usbaspInitialize()
{
	unsigned char temp[4];
	memset(temp, 0, sizeof(temp));
	temp[0]=0x02;
	temp[2]=m_ChipType.IspSck; //固件速度
	temp[3]=m_ChipType.FType; //芯片类型
	usbaspTransmit(1, USBASP_FUNC_CONNECT, temp, temp, sizeof(temp));
	Sleep(10);
	return 0;
}

unsigned char CUSBOP::usbaspCheck() //0 连接usb设备,其他没有正常连接
{
  unsigned char c=0,c1;
  if (handle) c1=0;   //已连接,直接返回0
  else c1=1;
  c=usbaspOpen();   //否则检测是否连接
  if (c==0)
  {
    if(c1!=0)
    { //"USB设备已打开!"
		usbaspInitialize();
		usbaspConnect();
    }
  }
  else if (c==1)
  {
    AfxMessageBox("没检到USBISP下载器!");
  }
  else if (c==2)
  {
    AfxMessageBox("打开USB设备失败!");
  }
  return c;
}

BOOL CUSBOP::usbaspEnable()
{
  /* Do nothing. */
  return TRUE;
}

BOOL CUSBOP::usbaspEnterProMode()
{
	unsigned char temp[4];
	memset(temp, 0, sizeof(temp));
	memset(temp, 0, sizeof(temp));
	temp[0]=0x02;
	temp[1]=m_ChipType.FType; //芯片类型
	int nbytes=usbaspTransmit(1, USBASP_FUNC_ENABLEPROG, temp, temp, sizeof(temp));
	if(nbytes==0) return FALSE;
	else return TRUE;
}

int CUSBOP::usbaspCmd(unsigned char cmd[4], unsigned char res[4])
{
  int nbytes;
  nbytes=usbaspTransmit(1, USBASP_FUNC_TRANSMIT, cmd, res, sizeof(res));
  if (nbytes != 4)
  {
    //AfxMessageBox("wrong responds size.");
    return -1;
  }
  return 0;
}

int CUSBOP::usbaspReceive(unsigned char *p)
{
  int nbytes;
  unsigned char cmd[4];

  nbytes=usbaspTransmit(1,USBASP_FUNC_UART,cmd,p,200);
  return nbytes;
}

int CUSBOP::usbaspSetting(unsigned char p[4])
{
   int nbytes;
   unsigned char res[4];
   p[0]=1;
   nbytes=usbaspTransmit(1,USBASP_FUNC_SETTING,p,res,4);
   return nbytes;
}

BOOL CUSBOP::mcuResert()
{
  if(usbaspCheck()!=0)
  { //check use connect;
    return FALSE;
  }
  usbaspConnect();
  Sleep(10);
  usbaspDisconnect();
  return TRUE;
}

⌨️ 快捷键说明

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