阅读:1322回复:3
SL811的0X04寄存器读入时值是什么意义?
我在看CYPRESS网站上下的SL811的例子程序是有如下疑问:
在usbXfer()函数中: SL811Write(IntStatus,INT_CLEAR);// clear interrupt status result = SL811Read(EP0Status); // read EP0status register remainder = SL811Read(EP0Counter); // remainder value in last pkt xfer //-------------------------ACK---------------------------- if (result & EP0_ACK) // Transmission ACK { // SETUP TOKEN if(pid == PID_SETUP) // do nothing for SETUP/OUT token break; // exit while(1) immediately // OUT TOKEN else if(pid == PID_OUT) break; // IN TOKEN else if(pid == PID_IN) { // for IN token only wLen -= (WORD)xferLen; // update remainding wLen value cmd ^= 0x40; // toggle DATA0/DATA1 dataX++; // point to next dataX //------------------------------------------------ // If host requested for more data than the slave // have, and if the slave's data len is a multiple // of its endpoint payload size/last xferLen. Do // not overwrite data in previous buffer. //------------------------------------------------ if(remainder==xferLen) // empty data detected bufLen = 0; // do not overwriten previous data else // reset bufLen to zero bufLen = xferLen; // update previous buffer length //------------------------------------------------ // Arm for next data transfer when requested data // length have not reach zero, i.e. wLen!=0, and // last xferlen of data was completed, i.e. // remainder is equal to zero, not a short pkt //------------------------------------------------ if(!remainder && wLen) // remainder==0 when last xferLen { // was all completed or wLen!=0 addr = (dataX & 1) ? data1:data0;// select next address for data xferLen = (BYTE)(wLen>=wPayload) ? wPayload:wLen; // get data length required if (FULL_SPEED) // sync with SOF transfer cmd |= 0x20; // always sync SOF when FS, regardless SL811Write(EP0XferLen, xferLen); // select next xfer length SL811Write(EP0Address, addr); // data buffer addr SL811Write(IntStatus,INT_CLEAR);// is a LS is on Hub. SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm } //------------------------------------------------ // Copy last IN token data pkt from prev transfer // Check if there was data available during the // last data transfer //------------------------------------------------ if(bufLen) { SL811BufRead(((dataX&1)?data0:data1), buffer, bufLen); buffer += bufLen; } //------------------------------------------------ // Terminate on short packets, i.e. remainder!=0 // a short packet or empty data packet OR when // requested data len have completed, i.e.wLen=0 // For a LOWSPEED device, the 1st device descp, // wPayload is default to 64-byte, LS device will // only send back a max of 8-byte device descp, // and host detect this as a short packet, and // terminate with OUT status stage //------------------------------------------------ if(remainder || !wLen) break; } } 其中,当PID为PID_IN,也就是HOST读数据时,用ramainder读入了寄存器0x04的值,然后进行的动作我就读不懂了,清哪位大虾解释一下,当读入数据的时候是怎么控制的。 |
|
沙发#
发布于:2004-06-18 08:23
没有人知道吗?
手册上面写得实在是不清楚,请指点一下吧,多谢了! |
|
板凳#
发布于:2004-06-21 09:50
真的没有人知道吗?
失望 |
|
地板#
发布于:2004-07-31 16:01
读入的寄存器0x04的值应该表示buffer中还没有发送完的数据!
|
|