www.pudn.com > FIFODATAWRITE.rar > FIFODATAWRITE.c
//..................................................................................
void UsbDataWrite(INT8U *pReadBuffer, INT16U DataLen) //pReadBuffer = 位址
{
UsbDataIn(pReadBuffer, DataLen);
}
//..................................................................................
void UsbDataIn(INT8U *pReadBuffer, INT16U DataLen)
{
if (!(EPAFIFOCS & bmFIFO0_FULL)) //bmFIFO0_FULL = 0x04 若未飽和則成立
{
FifoIn(pReadBuffer, DataLen);
}
if (!(EPAFIFOCS & bmFIFO0_FULL))
{
SendDataCmd();
}
}
//..................................................................................
void FifoIn(INT8U *pReadBuffer, INT16U DataLen)
{
union
{
INT8U Val;
struct
{
INT8U Count0 : 3;
INT8U : 1;
INT8U Count1 : 3;
INT8U : 1;
} Bit;
} HighReg;
Length.Val = DataLen; //2byte
HighReg.Val = EPACNTH; //1byte
EPACNT0L = Length.Byte[1]; // Write count low byte len & 0x00ff;
HighReg.Bit.Count0 = Length.Byte[0] & 0x07;
HighReg.Val = HighReg.Val | bmCNT0HWEN; //bmCNT0HWEN =0x08 Write Enable of EP_CNT0[10:8]
EPACNTH = HighReg.Val; // Write count high byte
UsbDmaBuffer = DMA_FIFOA0; // Get FIFO address DMA_FIFOA0 0xEC00 512 Byte Data FIFO A0
memcpy((INT8U xdata *)UsbDmaBuffer, pReadBuffer, DataLen); // Copy data
}
//..................................................................................
void SendDataCmd(void)
{ //bmFIFO0_FULL = 0x04
//bmFIFO0_FULL_WE = 0x40
EPAFIFOCS = (EPAFIFOCS | bmFIFO0_FULL_WE) | bmFIFO0_FULL; // Set FULL bit
EPACS = EPACS | bmEP_RXTXEN; // Enable RXTX
}
//..................................................................................
union FIFODataLen
{
INT16U Val;
INT8U Byte[2];
};