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 + -
显示快捷键?