|
先上代码:
bool SERCOM6_SPI_WriteRead (void* pTransmitData, size_t txSize, void* pReceiveData, size_t rxSize)
{
bool isRequestAccepted = false;
uint32_t dummyData = 0U;
/* Verify the request */
if((((txSize > 0U) && (pTransmitData != NULL)) || ((rxSize > 0U) && (pReceiveData != NULL))) && (sercom6SPIObj.transferIsBusy == false))
{
if((SERCOM6_REGS->SPIM.SERCOM_CTRLB & SERCOM_SPIM_CTRLB_CHSIZE_Msk) == (uint32_t)SPI_DATA_BITS_9)
{
/* For 9-bit transmission, the txSize and rxSize must be an even number. */
if(((txSize > 0U) && ((txSize & 0x01U) != 0U)) || ((rxSize > 0U) && ((rxSize & 0x01U) != 0U)))
{
return isRequestAccepted;
}
}
isRequestAccepted = true;
sercom6SPIObj.txBuffer = pTransmitData;
sercom6SPIObj.rxBuffer = pReceiveData;
sercom6SPIObj.rxCount = 0U;
sercom6SPIObj.txCount = 0U;
sercom6SPIObj.dummySize = 0U;
if(pTransmitData != NULL)
{
sercom6SPIObj.txSize = txSize;
}
else
{
sercom6SPIObj.txSize = 0U;
}
if(pReceiveData != NULL)
{
sercom6SPIObj.rxSize = rxSize;
}
else
{
sercom6SPIObj.rxSize = 0U;
}
sercom6SPIObj.transferIsBusy = true;
/* Flush out any unread data in SPI read buffer */
while((SERCOM6_REGS->SPIM.SERCOM_INTFLAG & SERCOM_SPIM_INTFLAG_RXC_Msk) == SERCOM_SPIM_INTFLAG_RXC_Msk)
{
dummyData = SERCOM6_REGS->SPIM.SERCOM_DATA;
(void)dummyData;
}
SERCOM6_REGS->SPIM.SERCOM_STATUS |= SERCOM_SPIM_STATUS_BUFOVF_Msk;
SERCOM6_REGS->SPIM.SERCOM_INTFLAG |= (uint8_t)SERCOM_SPIM_INTFLAG_ERROR_Msk;
if(sercom6SPIObj.rxSize > sercom6SPIObj.txSize)
{
sercom6SPIObj.dummySize = sercom6SPIObj.rxSize - sercom6SPIObj.txSize;
}
/* Start the first write here itself, rest will happen in ISR context */
if((SERCOM6_REGS->SPIM.SERCOM_CTRLB & SERCOM_SPIM_CTRLB_CHSIZE_Msk) == (uint32_t)SPI_DATA_BITS_8)
{
if(sercom6SPIObj.txCount < sercom6SPIObj.txSize)
{
SERCOM6_REGS->SPIM.SERCOM_DATA = *((uint8_t*)sercom6SPIObj.txBuffer);
sercom6SPIObj.txCount++;
}
else if(sercom6SPIObj.dummySize > 0U)
{
SERCOM6_REGS->SPIM.SERCOM_DATA = 0xFFU;
sercom6SPIObj.dummySize--;
}
else
{
/* Do nothing */
}
}
else
{
sercom6SPIObj.txSize >>= 1U;
sercom6SPIObj.dummySize >>= 1U;
sercom6SPIObj.rxSize >>= 1U;
if(sercom6SPIObj.txCount < sercom6SPIObj.txSize)
{
SERCOM6_REGS->SPIM.SERCOM_DATA = *((uint16_t*)sercom6SPIObj.txBuffer) & SERCOM_SPIM_DATA_Msk;
sercom6SPIObj.txCount++;
}
else if(sercom6SPIObj.dummySize > 0U)
{
SERCOM6_REGS->SPIM.SERCOM_DATA = 0xFFFFU & SERCOM_SPIM_DATA_Msk;
sercom6SPIObj.dummySize--;
}
else
{
/* Do nothing */
}
}
if(rxSize > 0U)
{
/* Enable ReceiveComplete */
SERCOM6_REGS->SPIM.SERCOM_INTENSET = (uint8_t)SERCOM_SPIM_INTENSET_RXC_Msk;
}
else
{
/* Enable the DataRegisterEmpty */
SERCOM6_REGS->SPIM.SERCOM_INTENSET = (uint8_t)SERCOM_SPIM_INTENSET_DRE_Msk;
}
}
return isRequestAccepted;
}
bool SERCOM6_SPI_Read(void* pReceiveData, size_t rxSize)
{
return SERCOM6_SPI_WriteRead(NULL, 0U, pReceiveData, rxSize);
}
接收到的数据在pReceiveData里。
我想在一个程序里调用它,如下:
unsigned char Read_W5500_1Byte(unsigned short reg)
{
unsigned char i;
void* pReceiveData=NULL;
GPIO_PC06_Clear();
SPI1_Send_Short(reg);
SPI1_Send_Byte(FDM1|RWB_READ|COMMON_R);
i=SERCOM6_SPI_Read1();
SERCOM6_SPI_Read(pReceiveData, 1);
i=(unsigned char)pReceiveData;
GPIO_PC06_Set();
return i;
}
这样写行吗?我总觉得不靠谱。
请高手指教,谢谢! |
上一篇: 请问jsoncpp怎么解析utf8字符串下一篇: 老师封装的CTabSheet 类使用Tab控件中出现的问题
|