📄 sl811.c
字号:
#include "common.h"
#include "SL811.H"
#include "HAL.H"
#include "HPI.H"
#include "intrins.h"
#include "AT89X52.H"
sbit SEL_OTHERS=P1^5;
sbit MASTER_SLAVER=P3^5; //master/slave usb的主从控制,0控制为MAST,1为SLAVE
//bit SLAVE_ONLINE;
//extern bit modechanged;
extern bit SLAVE_IS_ATTACHED;
//extern bit SLAVE_REMOVED;
//extern bit SLAVE_FOUND;
bit TIMEOUT_ERR; // timeout error during data endpoint transfer
bit DATA_STOP; // device unplugged during data transfer
bit bMassDevice;
bit bData1;
xdata unsigned char epst; //端点返回状态
extern data union
{
uint flash_page;
uchar flash_arr[2];
struct
{
uchar page_MSB;
uchar page_LSB;
}flash_byte;
}flash_address;
uchar xdata DBUF[2060] _at_ 0X1000;
pUSBDEV xdata uDev; // Multiple USB devices attributes, Max 5 devices
xdata pDevDesc pDev; // Device descriptor struct
xdata pCfgDesc pCfg; // Configuration descriptor struct
xdata pIntfDesc pIfc; // Interface descriptor struct
xdata pEPDesc pEnp; // Endpoint descriptor struct
//xdata pStrDesc pStr; // String descriptor struct
extern void FlashLowTo811(void);
extern void FlashHighTo811(void);
extern void hardware_reset_811(void);
extern void delay_1ms( void );
extern void delay_2ms( void );
//*****************************************************************************************
// SL811H variables initialization
//*****************************************************************************************
//////bit SL811_GetRev(void)
//////{
////// //SL811Write(SL811_ADDR_PORT, 0x0e);
////// return SL811Read(0x0e);
//////}
void USBReset(void)
{
unsigned char temp;
temp=SL811Read(CtrlReg);
SL811Write(CtrlReg,temp|0x08);
DelayMs(50);
SL811Write(CtrlReg,0x18);
DelayMs(50);
SL811Write(CtrlReg,temp|0x08);
DelayMs(50);
SL811Write(CtrlReg,temp);
DelayMs(50);
}
bit FlashWithUsb(uint wLen) //将当前长度的FLASH中的数据通过USB发出,完成所有的数据传输才退出
{
idata uchar bufLen,cmd,intr,ep_out,page,inv_time,re_times;
uchar j;
uchar *buffer=DBUF;
ep_out=uDev.epbulkout&0x0F;
cmd=DATA0_WR; //将写命令的控制字准备好
if(!uDev.bData1[ep_out])
cmd|=0x40;
SL811Write(IntStatus,INT_CLEAR); //清除中断标志
page=(uchar)(wLen>>7);
for(j=0;j<page;j++) //这实际是本次要传输的FLASH的PAGE数
{
//加载A
//SL811BufWrite(0x10,buffer,0x40);
re_times=0;
FlashLowTo811();
//准备A的发送
// bData1=!bData1;
// if(bData1)
// cmd&=0xBF; // Set Data0 bit in command,根据状况修改命令字
// else
// cmd|=0x40; // Set Data1 bit in command,根据状况修改命令字
cmd^=0x40;
while(TRUE)
{
SL811Write(EP0Status,(ep_out|PID_OUT)); // PID + EP address
SL811Write(EP0Counter,1); // USB address
SL811Write(EP0Address,0x10); // buffer address, start with "data0",首次传送的地址,一定从前部BUF开始
SL811Write(EP0XferLen,0x40); // data transfer length,本次传送的长度
SL811Write(IntStatus,INT_CLEAR); // clear interrupt status,清除中断
//A开始传送
SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here,开始传送
//加载B
//SL811BufWrite(0x50,buffer,0x40);
//判断A传输是否结束
while(1) // always ensure requested device is
{ // inserted at all time, then you will
intr=SL811Read(IntStatus); //读取中断标志
if(intr& USB_A_DONE) //本次传送完毕
break; // interrupt done !!!
if(intr&INSERT_RESET) // proceed to parse result from slave
return FALSE; // flag true, so that main loop will
}
SL811Write(IntStatus,INT_CLEAR);
intr=SL811Read(EP0Status); // clear interrupt status,清除中断标志
if(intr&EP0_ACK) // Transmission ACK,如果接收正确
{
wLen-=0x40; // update remainding wLen value,得到剩余要传字节的数量
bufLen=0x40; //上次已经传掉的数量
re_times=0;
break;
}
else
{
SL811Write(IntStatus,INT_CLEAR);
for(inv_time=0;inv_time<200;inv_time++)
delay_1ms();
re_times++;
if(re_times>=20)
return FALSE;
continue; // fail transmission
}
}
re_times=0;
FlashHighTo811();
//准备B的发送
// bData1=!bData1;
// if(bData1)
// cmd&=0xBF; // Set Data0 bit in command,根据状况修改命令字
// else
// cmd|=0x40; // Set Data1 bit in command,根据状况修改命令字
cmd^=0x40;
while(TRUE)
{
SL811Write(EP0Status,(ep_out|PID_OUT)); // PID + EP address
SL811Write(EP0Counter,1); // USB address
SL811Write(EP0Address,0x50); // buffer address, start with "data0",首次传送的地址,一定从前部BUF开始
SL811Write(EP0XferLen,0x40); // data transfer length,本次传送的长度
SL811Write(IntStatus,INT_CLEAR); // clear interrupt status,清除中断
//B开始传送
SL811Write(EP0Control,cmd);
//判断B传输是否结束
while(1) // always ensure requested device is
{ // inserted at all time, then you will
intr=SL811Read(IntStatus); //读取中断标志
if(intr&USB_A_DONE)
//本次传送完毕
break;
if(intr&INSERT_RESET) // proceed to parse result from slave
return FALSE; // flag true, so that main loop will
}
SL811Write(IntStatus,INT_CLEAR);
intr=SL811Read(EP0Status); // clear interrupt status,清除中断标志
if(intr&EP0_ACK) // Transmission ACK,如果接收正确
{
wLen-=0x40; // update remainding wLen value,得到剩余要传字节的数量
bufLen=0x40;
re_times=0;
break; //上次已经传掉的数量
}
else
{
SL811Write(IntStatus,INT_CLEAR);
for(inv_time=0;inv_time<200;inv_time++)
delay_1ms();
re_times++;
if(re_times>=20)
return FALSE;
continue; // fail transmission
}
}
flash_address.flash_page++; // Enable ARM and USB transfer start here,开始传送
}
return TRUE;
}
//bit FlashWithUsb(uint wLen) //将当前长度的FLASH中的数据通过USB发出,完成所有的数据传输才退出
// {
// uchar cmd,result,intr,ep_out;
// idata uchar bufLen,addr,xferLen;
// uchar i=255;
// uchar *buffer=DBUF;
// ep_out=uDev.epbulkout&0x0F;
// //------------------------------------------------
// // Default setting for usb trasnfer
// //------------------------------------------------
// bufLen=0; //初始化基本参数
// TIMEOUT_ERR=DATA_STOP=FALSE;
// //------------------------------------------------
// // Define data transfer payload
// //------------------------------------------------
// if(wLen>=0x40) // select proper data payload //判断实际要求传送的长度
// xferLen=0x40; // limit to wPayload size //最大不能超过负载,超过部分下次再传
// else // else take < payload len
// xferLen=wLen;
// // For OUT token
// if(xferLen) // only when there are,把需要加载的数据转移到811
// SL811BufWrite(0x10,buffer,xferLen); // data to transfer on USB
// cmd=sDATA0_WR; //将写命令的控制字准备好
// bData1=uDev.bData1[ep_out]; //得到当前的切换状况
// uDev.bData1[ep_out]=(!bData1); // DataToggle,翻转,为下次准备
// if(bData1)
// cmd|=0x40; // Set Data1 bit in command,根据状况修改命令字
// //------------------------------------------------
// //------------------------------------------------
// // Arming of USB data transfer for the first pkt,准备数据,送到SIE待传
// //------------------------------------------------
// SL811Write(EP0Status,(ep_out|PID_OUT)); // PID + EP address
// SL811Write(EP0Counter,1); // USB address
// SL811Write(EP0Address,0x10); // buffer address, start with "data0",首次传送的地址,一定从DATA0开始
// SL811Write(EP0XferLen,xferLen); // data transfer length,本次传送的长度
// SL811Write(IntStatus,INT_CLEAR); // clear interrupt status,清除中断
// SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here,开始传送
// //------------------------------------------------
// // Main loop for completing a wLen data trasnfer
// //------------------------------------------------
// while(i--)
// {
// //---------------Wait for done interrupt------------------
// while(TRUE) // always ensure requested device is
// { // inserted at all time, then you will
// intr=SL811Read(IntStatus); //读取中断标志
// if((intr&USB_RESET)||(intr&INSERT_REMOVE)) // proceed to parse result from slave
// { // device.设备被重置了要退出传送并给出标志
// DATA_STOP=TRUE; // if device is removed, set DATA_STOP
// return FALSE; // flag true, so that main loop will
// } // know this condition and exit gracefully
// if(intr& USB_A_DONE) //本次传送完毕
// break; // interrupt done !!!
// }
// SL811Write(IntStatus,INT_CLEAR); // clear interrupt status,清除中断标志
// result=SL811Read(EP0Status); // read EP0status register,得到传送结果
// //-------------------------ACK----------------------------
// if (result&EP0_ACK) // Transmission ACK,如果接收正确
// {
// // OUT TOKEN
// wLen-=(uint)xferLen; // update remainding wLen value,得到剩余要传字节的数量
// bufLen=xferLen; //上次已经传掉的数量
// if(wLen) //如果还有数据要传送
// {
// bData1=uDev.bData1[ep_out];
// uDev.bData1[ep_out]=(!bData1); // DataToggle,把标志切换到下一个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -