📄 drivers.c
字号:
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI
* entirely ready for read or write
*/
SPISendChar(u8Addr ); /*
* Dummy write. Receive register of SPI
* will contain MSB
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get MSB
*/
SPIReadMSB(&u16Data); /* MSB */
SPISendChar(u8Addr); /*
* Dummy write. Waiting until after
* reading received data insures no
* overrun
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get LSB
*/
((UINT8*)&u16Data)[1] = SPIRead(); /* LSB */
DeAssertCE(); /* Disables MC13192 SPI */
MC13192RestoreInterrupts(); /* Restore MC13192 interrupt status */
return u16Data;
}
/*!
* \brief SPIDrvRead2 : Read the second word from SPI
*
* \param u8Addr - SPI address
*
* \return u16Data - u16Data[0] is the MSB, u16Data[1] is the LSB
*/
UINT16 SPIDrvRead2(UINT8 u8Addr)
{
UINT8 u8TempValue=0;
UINT16 u16Data=0; /* u16Data[0] is MSB, u16Data[1] is LSB */
SPIClearRecieveStatReg(&u8TempValue); /* Clear status register (possible SPRF, SPTEF) */
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
MC13192DisableInterrupts(); /* Necessary to prevent double SPI access */
AssertCE(); /* Enables MC13192 SPI */
SPISendChar((u8Addr & 0x3f) | 0x80); /* Mask address, 6bit addr, Set
* read bit.
*/
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set */
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI
* entirely ready for read or write
*/
SPISendChar(u8Addr ); /*
* Dummy write. Receive register of SPI
* will contain MSB
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get MSB
*/
SPIReadMSB(&u16Data); /* MSB */
SPISendChar(u8Addr); /*
* Dummy write. Waiting until after
* reading received data insures no
* overrun
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get LSB
*/
SPIReadLSB(&u16Data); /* LSB */
SPISendChar(u8Addr); /*
* Dummy write. Waiting until after
* reading received data insures no
* overrun
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get LSB
*/
SPIReadMSB(&u16Data); /* MSB */
SPISendChar(u8Addr); /*
* Dummy write. Waiting until after
* reading received data insures no
* overrun
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get LSB
*/
SPIReadLSB(&u16Data); /* LSB */
DeAssertCE(); /* Disables MC13192 SPI */
MC13192RestoreInterrupts(); /* Restore MC13192 interrupt status */
return u16Data;
}
/*!
* \brief RAMDrvWriteTx : Write a block of data to TX packet RAM, whichever is selected
*
* \param *psTxPkt - Packet to write
*
*/
void RAMDrvWriteTx(tTxPacket *psTxPkt)
{
UINT8 i, u8TempByte=0, u8TempValue=0; /* Temporary counters */
UINT8 u8MinLen=0;
UINT16 u16Reg=0; /* TX packet length register value */
if (gsPhyOptions.Bits.u1PromiscuousMode)
u8MinLen = 3;
else
u8MinLen = 5;
u16Reg = SPIDrvRead(TX_PKT_LEN); /*
* Read the TX packet length register
* contents
*/
u16Reg = (0xFF80 & u16Reg) | (psTxPkt->u8DataLength + (u8MinLen - 1)); /*
* Mask out old
* length setting and
* update. Add 2 for
* CRC and 2 for code bytes
*/
SPIDrvWrite(TX_PKT_LEN, u16Reg); /* Update the TX packet length field */
SPIClearRecieveStatReg(&u8TempValue);/* Clear status register
* (possible SPRF, SPTEF)
*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
MC13192DisableInterrupts(); /* Necessary to prevent double SPI access */
AssertCE(); /* Enables MC13192 SPI */
SPISendChar(TX_PKT); /* SPI TX ram data register */
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content MSB
*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
if (!gsPhyOptions.Bits.u1PromiscuousMode)
{
SPISendChar(0xFF); /* Send 1st Code Byte */
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content MSB
*/
SPISendChar(0x7E); /* Send 2nd Code Byte */
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content MSB
*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register. SPI entirely
* ready for read or write
*/
}
u8TempByte = 0; /* Byte counter for *contents */
/* Word loop. Round up. */
for (i=0; i<((psTxPkt->u8DataLength+1) >> 1); i++) {
SPISendChar(psTxPkt->pu8Data[u8TempByte + 1]); /* Write MSB */
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be set.
* Now write content LSB
*/
SPIClearRecieveDataReg(&u8TempValue);/*
* Clear receive data register. SPI entirely
* ready for read or write
*/
SPISendChar(psTxPkt->pu8Data[u8TempByte]); /* Write LSB */
u8TempByte = (UINT8)(u8TempByte + 2); /* Increment byte counter */
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set.*/
SPIClearRecieveDataReg(&u8TempValue);/*
* Clear receive data register. SPI entirely
* ready for read or write
*/
}
DeAssertCE(); /* Disables MC13192 SPI */
MC13192RestoreInterrupts(); /* Restore MC13192 interrupt status */
}
/*!
* \brief RAMDrvReadRx : Read a block of data from RX packet RAM, whichever is selected
*
* \param *psRxPkt - Packet received
*
* \return u8Status
*/
UINT8 RAMDrvReadRx(tRxPacket *psRxPkt)
{
UINT8 i, u8TempByte=0; /* Temporary counters. */
UINT8 u8MinLen=0;
UINT8 u8TempValue=0; /*
* Used by SPIClearRecieveDataReg to
* flush SPI1D register during read
*/
UINT8 u8Status = 0; /* Holder for the return value */
UINT16 u16RxLength;
if (gsPhyOptions.Bits.u1PromiscuousMode)
u8MinLen = 3;
else
u8MinLen = 5;
u16RxLength = SPIDrvRead(RX_PKT_LEN); /*
* Read the RX packet length
* register contents
*/
u16RxLength &= 0x007F; /* Mask out all but the RX packet length */
/* MC13192 reports length with 2 CRC bytes and 2 Code bytes,
* remove them.
*/
if (u16RxLength >= u8MinLen) {
psRxPkt->u8DataLength = u16RxLength - (u8MinLen - 1); /*
* Less byte code
* and CRC
*/
}
else {
psRxPkt->u8DataLength = 0;
}
if ((psRxPkt->u8DataLength >= 1) && \
(psRxPkt->u8DataLength <= psRxPkt->u8MaxDataLength)) { /*
* If <5, the packet
* is garbage
*/
SPIClearRecieveStatReg(&u8TempValue); /* Clear status register (SPRF, SPTEF) */
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register.
* SPI entirely ready for read or write
*/
MC13192DisableInterrupts(); /* Necessary to prevent double SPI access */
AssertCE(); /* Enables MC13192 SPI */
SPISendChar(RX_PKT | 0x80); /* SPI RX ram data register */
SPIWaitTransferDone(); /* For this bit to be set, SPTED
* MUST be set.
*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register.
* SPI entirely ready for read or write
*/
SPISendChar(u8TempValue); /*
* Dummy write. Receive register of SPI will
* contain MSB garbage for first read
*/
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set.*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register.
* SPI entirely ready for read or write
*/
SPISendChar(u8TempValue); /*
* Dummy write. Receive register of SPI will
* contain LSB garbage for first read
*/
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set.*/
SPIClearRecieveDataReg(&u8TempValue); /*
* Clear receive data register.
* SPI entirely ready for read or write
*/
if (gsPhyOptions.Bits.u1PromiscuousMode == 0)
{
/* Byte codes */
SPISendChar(u8TempValue); /*
* Dummy write. Receive register of SPI will
* contain LSB garbage for first read
*/
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set.*/
u8TempValue = SPIRead(); /* Read first code byte */
SPISendChar(u8TempValue); /*
* Dummy write. Receive register of SPI will
* contain LSB garbage for first read
*/
SPIWaitTransferDone(); /* For this bit to be set, SPTED MUST be set.*/
u8TempValue = SPIRead(); /* Read second code byte */
}
u8TempByte = 0; /* Byte counter for *contents */
/* Word loop. Round up. Deduct CRC. */
for (i=0; i<((u16RxLength-1)>>1); i++) {
SPISendChar(u8TempValue);/*
* Dummy write. Receive register of SPI
* will contain MSB
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get MSB
*/
/* For a trailing garbage byte, just read and discard */
if ((u8TempByte + 3) == u16RxLength) {
SPIClearRecieveDataReg(&u8TempValue); /* Discard */
}
else {
psRxPkt->pu8Data[u8TempByte + 1] = SPIRead(); /* Read MSB */
}
SPISendChar(u8TempValue);/*
* Dummy write. Receive register of SPI
* will contain LSB
*/
SPIWaitTransferDone(); /*
* For this bit to be set, SPTED MUST be
* set. Get LSB
*/
psRxPkt->pu8Data[u8TempByte] = SPIRead(); /* Read LSB */
u8TempByte = (UINT8)(u8TempByte + 2); /* Increment byte counter */
}
DeAssertCE(); /* Disables MC13192 SPI */
psRxPkt->u8Status = SUCCESS;
MC13192RestoreInterrupts(); /* Restore MC13192 interrupt status */
}
/* Check to see if a larger packet than desired is received. */
if (psRxPkt->u8DataLength > psRxPkt->u8MaxDataLength) {
psRxPkt->u8Status = OVERFLOW;
}
return u8Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -