hw_spi.c
来自「瑞星微公司RK27XX系列芯片的SDK开发包」· C语言 代码 · 共 959 行 · 第 1/3 页
C
959 行
}
continue;
}
// check is transmit FIFO available
if (CHECK_TRANSMIT_FIFO(status))
{
// check if buffered tx is enabled
if (spiBufferedTx)
{
while (!IS_TX_FIFO_FULL())
{
// check if there's data left in the buffer
if (spiTxBuffer.datalength)
{
// send byte from top of buffer
SPI_WRITE_DATA(bufferGetFromFront(&spiTxBuffer)); // 从spiTxBuffer前端取数据发送出去
}
else
{
// no data left
spiBufferedTx = FALSE;
// return to ready state
spiReadyTx = TRUE;
break;
}
}
}
else
{
// we're using single-byte tx mode
// indicate transmit complete, back to ready
spiReadyTx = TRUE;
}
continue;
}
// check is receive data overrun
if (CHECK_OVERRUN(status))
{
// data over run - do something to signal an overrun
return;
}
}
while (CHECK_RECEVIE_FIFO(status));
}
/**************************************************************************
* 函数描述: 清空SPI接收buffer
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void spiFlushReceiveBuffer(void)
{
// flush all data from receive buffer
bufferFlush(&spiRxBuffer);
// same effect as above
SPI_CLEAR_RX_FIFO();
}
/**************************************************************************
* 函数描述: 清空SPI发送buffer
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void spiFlushTransmitBuffer(void)
{
// flush all data from transmit buffer
bufferFlush(&spiTxBuffer);
// same effect as above
// spiTxBuffer.datalength = 0;
SPI_CLEAR_TX_FIFO();
}
/**************************************************************************
* 函数描述: 判断SPI接收buffer是否为空
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE -- 接收buffer为空
* FALSE -- 接收buffer不为空
***************************************************************************/
BOOL spiReceiveBufferIsEmpty(void)
{
if (spiRxBuffer.datalength == 0)
return TRUE;
else
return FALSE;
}
/**************************************************************************
* 函数描述: 发送1个字节数据
* 入口参数: txData -- 待发送的字节数据
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void spiSendByte(unsigned char txData)
{
// wait for the transmitter to be ready
while (!spiReadyTx);
// send byte
SPI_WRITE_DATA((UINT32)txData);
// set ready state to false
spiReadyTx = FALSE;
}
/**************************************************************************
* 函数描述: 接收1个字节数据
* 入口参数: 无
* 出口参数: rxData -- 接收的字节数据
* 返回值: TRUE -- 接收成功
* FALSE -- 接收失败
***************************************************************************/
BOOL spiReceiveByte(unsigned char * rxData)
{
// make sure we have a receive buffer
if (spiRxBuffer.size)
{
// make sure we have data
if (spiRxBuffer.datalength)
{
// get byte from beginning of buffer
*rxData = bufferGetFromFront(&spiRxBuffer);
return TRUE;
}
else
{
// no data
return FALSE;
}
}
else
{
// no buffer
return FALSE;
}
}
/**************************************************************************
* 函数描述: 向buffer发送数据
* 入口参数: txData -- 待发送的字节数据
* 出口参数: 无
* 返回值: 无
***************************************************************************/
BOOL spiSendBuffer(unsigned char *buffer, int nBytes)
{
register unsigned char first;
register int i;
// check if there's space (and that we have any bytes to send at all)
if ((spiTxBuffer.datalength + nBytes < spiTxBuffer.size) && nBytes)
{
// grab first character
first = *buffer++;
// copy user buffer to uart transmit buffer
for (i = 0; i < nBytes - 1; i++)
{
// put data bytes at end of buffer
spiTxBuffer.dataptr[(spiTxBuffer.dataindex + spiTxBuffer.datalength) % spiTxBuffer.size] = *buffer++;
// increment the length
spiTxBuffer.datalength++;
}
// send the first byte to get things going by interrupts
spiBufferedTx = TRUE;
spiSendByte(first);
// return success
return TRUE;
}
else
{
// return failure
return FALSE;
}
}
/**************************************************************************
* 函数描述: 向buffer接收数据
* 入口参数: txData -- 待发送的字节数据
* 出口参数: 无
* 返回值: 无
***************************************************************************/
int spiReceiveBuffer(unsigned char *buffer, int nBytes)
{
int recvCount = 0;
unsigned char rxData;
while (recvCount < nBytes)
{
while (!spiReceiveBufferIsEmpty())
{
// get receive data from uart receive buffer
if (spiReceiveByte(&rxData))
{
// save data into receive buffer
buffer[recvCount] = rxData;
recvCount++;
}
}
}
return recvCount;
}
/**************************************************************************
* 函数描述: SPI clock属性设置,供SPI_Config调用
* 入口参数: PBCA -- clock active delay value
* PBCT -- clock transfer delay value
* PBTxRx -- clock Tx/Rx delay value
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void spiSetClockDelay(int PBCA, int PBCT, int PBTxRx)
{
SET_ACTIVE_DELAY(PBCA);
SET_TRANSFER_DELAY(PBCT);
SET_TxRx_DELAY(PBTxRx);
return;
}
/**************************************************************************
* 函数描述: SPI传输
* 入口参数: buffer -- 待传输的数据buffer
* txCount -- 发送的数据大小
* rxCount -- 接收的数据大小
* 出口参数: 无
* 返回值: TRUE -- 传输成功
* FALSE -- 传输失败
***************************************************************************/
BOOL doSPITransfer(unsigned char * buffer, int txCount, int rxCount)
{
// check SPI controller is running or not
if (IS_SPI_RUNNING())
return FALSE;
// set transmit & receive data count
SET_TRANSMIT_COUNT(txCount);
SET_RECEIVE_COUNT(rxCount);
// send data to transmit data buffer
if (txCount > 1)
spiSendBuffer(buffer, txCount); //SPI_Write(buffer, txCount,1);
else
SPI_WRITE_DATA(buffer[0]);
// start SPI transfer
SPI_START_TRANSFER();
return TRUE;
}
/**************************************************************************
* 函数描述: 配置SPI属性参数
* 入口参数: spiconfig -- SPI属性参数
* 出口参数: 无
* 返回值: 0 -- 配置SPI成功
* 非0 -- 配置SPI失败
***************************************************************************/
int SPI_Config(UINT32 spiconfig)
{
UINT32 oldspiconfig, spiconfigFWCR;
UINT32 divisor, clockrate;
UINT32 databitlength;
oldspiconfig = ReadReg32(&pSPIReg->SPI_FWCR);
spiconfigFWCR = (oldspiconfig & (UINT32)(~0x13E)) | spiconfig;
clockrate = (spiconfig | 0xFFFF0000) >> 16;
divisor = Pll_get_apb_freq() * 1000 / clockrate;
databitlength = (spiconfig | 0xF << 10) >> 10;
// Set SPI in master mode -- Master SPI Controller
SPI_MASETR_EN();
// set SPI flow control register
WriteReg32(&pSPIReg->SPI_FWCR, spiconfigFWCR);
// set SPI bus clock rate
SET_CLOCK_DIVISOR(divisor);
// set SPI bus data bit length
SET_BIT_LENGTH(databitlength);
// config clock count
spiSetClockDelay(CLOCK_HALF, CLOCK_ZERO, CLOCK_ZERO);
return 0;
}
/**************************************************************************
* 函数描述: 初始化SPI控制器
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void SPIInitController(void)
{
// reset SPI controller
SPI_RESET();
// configure SPI controller
SPI_Config(spiconfig);
// configure FIFO
SPI_CLEAR_TX_FIFO();
SPI_CLEAR_RX_FIFO();
SPI_TX_FIFO_THRESH_4();
SPI_RX_FIFO_THRESH_4();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?