📄 drvspi.c
字号:
DRVSPI_TYPE2:
CS --| Active state |---
_ _ _ _ _ _ _ _
CLK ____| |_| |_| |_| |_| |_| |_| |_| |_____
Tx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |---
Rx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |---
DRVSPI_TYPE3:
CS --| Active state |---
_ _ _ _ _ _ _ _
CLK ____| |_| |_| |_| |_| |_| |_| |_| |_____
Tx --| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |-----
Rx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |---
DRVSPI_TYPE4:
CS --| Active state |---
___ _ _ _ _ _ _ _ ______
CLK |_| |_| |_| |_| |_| |_| |_| |_|
Tx --| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |------
Rx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |----
DRVSPI_TYPE5:
CS --| Active state |---
___ _ _ _ _ _ _ _ ______
CLK |_| |_| |_| |_| |_| |_| |_| |_|
Tx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |----
Rx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |----
DRVSPI_TYPE6:
CS --| Active state |---
___ _ _ _ _ _ _ _ ______
CLK |_| |_| |_| |_| |_| |_| |_| |_|
Tx --| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |------
Rx --| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |------
DRVSPI_TYPE7:
CS --| Active state |---
___ _ _ _ _ _ _ _ ______
CLK |_| |_| |_| |_| |_| |_| |_| |_|
Tx ----| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |----
Rx --| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |----
Master / Slave Transfer Type Matching Table
DRVSPI_TYPE0 <==> DRVSPI_TYPE3
DRVSPI_TYPE1 <==> DRVSPI_TYPE1
DRVSPI_TYPE2 <==> DRVSPI_TYPE2
DRVSPI_TYPE3 <==> DRVSPI_TYPE0
DRVSPI_TYPE4 <==> DRVSPI_TYPE7
DRVSPI_TYPE5 <==> DRVSPI_TYPE5
DRVSPI_TYPE6 <==> DRVSPI_TYPE6
DRVSPI_TYPE7 <==> DRVSPI_TYPE4
*/
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvSPI_Open(E_DRVSPI_PORT eSpiPort, E_DRVSPI_MODE eMode, E_DRVSPI_TRANS_TYPE eType, int32_t i32BitLength)
{
int32_t i32TimeOut;
if(g_sSpiHandler[eSpiPort].bInUse)
{
return E_DRVSPI_ERR_INIT;
}
/* Bit length 1 ~ 32 */
if((i32BitLength <= 0) || (i32BitLength > 32))
{
return E_DRVSPI_ERR_BIT_LENGTH;
}
if(eSpiPort == eDRVSPI_PORT0)
{
SYSCLK->APBCLK.SPI0_EN =1;
SYS->IPRSTC2.SPI0_RST =1;
SYS->IPRSTC2.SPI0_RST =0;
}
else if(eSpiPort == eDRVSPI_PORT1)
{
SYSCLK->APBCLK.SPI1_EN =1;
SYS->IPRSTC2.SPI1_RST =1;
SYS->IPRSTC2.SPI1_RST =0;
}
else if(eSpiPort == eDRVSPI_PORT2)
{
SYSCLK->APBCLK.SPI2_EN =1;
SYS->IPRSTC2.SPI2_RST =1;
SYS->IPRSTC2.SPI2_RST =0;
}
else
{
SYSCLK->APBCLK.SPI3_EN =1;
SYS->IPRSTC2.SPI3_RST =1;
SYS->IPRSTC2.SPI3_RST =0;
}
/* Check busy*/
i32TimeOut = 0x10000;
while(SPI_PORT[eSpiPort]->CNTRL.GO_BUSY == 1)
{
if(i32TimeOut-- <= 0)
return E_DRVSPI_ERR_BUSY;
}
g_sSpiHandler[eSpiPort].bInUse = TRUE;
g_sSpiHandler[eSpiPort].pfnOneTransDoneCallBack = NULL;
g_sSpiHandler[eSpiPort].u32OneTransDoneUserData = 0;
g_sSpiHandler[eSpiPort].pfn3WireStartCallBack = NULL;
g_sSpiHandler[eSpiPort].u32ThreeWireStartUserData = 0;
/* "i32BitLength = 0" means 32 bits */
if(i32BitLength == 32)
{
i32BitLength = 0;
}
SPI_PORT[eSpiPort]->CNTRL.TX_BIT_LEN = i32BitLength;
if(eMode == eDRVSPI_SLAVE)
SPI_PORT[eSpiPort]->CNTRL.SLAVE = 1;
else
SPI_PORT[eSpiPort]->CNTRL.SLAVE = 0;
/* Automatic slave select */
SPI_PORT[eSpiPort]->SSR.AUTOSS = 1;
/* Timing waveform types */
if(eType==eDRVSPI_TYPE0)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 0;
/* Drive data and latch data at the same edge. Not recommend to use this transfer type. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 0;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 0;
}
else if(eType==eDRVSPI_TYPE1)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 0;
/* Drive data at falling-edge of serial clock; latch data at rising-edge of serial clock. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 1;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 0;
}
else if(eType==eDRVSPI_TYPE2)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 0;
/* Drive data at rising-edge of serial clock; latch data at falling-edge of serial clock. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 0;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 1;
}
else if(eType==eDRVSPI_TYPE3)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 0;
/* Drive data and latch data at the same edge. Not recommend to use this transfer type. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 1;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 1;
}
else if(eType==eDRVSPI_TYPE4)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 1;
/* Drive data and latch data at the same edge. Not recommend to use this transfer type. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 0;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 0;
}
else if(eType==eDRVSPI_TYPE5)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 1;
/* Drive data at falling-edge of serial clock; latch data at rising-edge of serial clock. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 1;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 0;
}
else if(eType==eDRVSPI_TYPE6)
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 1;
/* Drive data at rising-edge of serial clock; latch data at falling-edge of serial clock. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 0;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 1;
}
else
{
SPI_PORT[eSpiPort]->CNTRL.CLKP = 1;
/* Drive data and latch data at the same edge. Not recommend to use this transfer type. */
SPI_PORT[eSpiPort]->CNTRL.TX_NEG = 1;
SPI_PORT[eSpiPort]->CNTRL.RX_NEG = 1;
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSPI_Close */
/* */
/* Parameters: */
/* eSpiPort [in]: Specify the SPI port. */
/* */
/* Returns: */
/* None. */
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -