📄 drvpdma.c
字号:
/* Description: */
/* The function is used to get peripheral transfer width from channelx */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_GetAPBTransferWidth(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
PDMA_T * tPDMA;
/* Check Channel is valid */
if (eChannel > MAX_CHANNEL_NUM ) /* Check Channel is valid */
return E_DRVPDMA_ERR_PORT_INVALID;
tPDMA = (PDMA_T *)((uint32_t)PDMA0 + eChannel * CHANNEL_OFFSET);
return (int32_t)(tPDMA->CSR.APB_TWS); /* Get Transfer Length */
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvPDMA_SetCHForAPBDevice */
/* */
/* Parameter: */
/* eChannel -[in] PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8 */
/* eDevice -[in] APB device */
/* It includes eDRVPDMA_SPI0~3,eDRVPDMA_UART0~1, */
/* eDRVPDMA_ADC ,eDRVPDMA_I2S */
/* eRWAPB -[in] Access Direction */
/* It includes eDRVPDMA_WRITE_APB/eDRVPDMA_READ_APB */
/* */
/* Returns: */
/* E_SUCCESS Success */
/* E_DRVPDMA_ERR_PORT_INVALID Invalid port number */
/* E_DRVPDMA_FALSE_INPUT Invalid APB device */
/* Description: */
/* The function is used to select PDMA channel for APB device */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_SetCHForAPBDevice(
E_DRVPDMA_CHANNEL_INDEX eChannel,
E_DRVPDMA_APB_DEVICE eDevice,
E_DRVPDMA_APB_RW eRWAPB
)
{
if (eChannel > MAX_CHANNEL_NUM ) /* Check Channel is valid */
return E_DRVPDMA_ERR_PORT_INVALID;
switch(eDevice)
{
case eDRVPDMA_SPI0: /* Set SPI0 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR0.SPI0_TXSEL = eChannel;
else
PDMA_GCR->PDSSR0.SPI0_RXSEL = eChannel;
break;
case eDRVPDMA_SPI1: /* Set SPI1 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR0.SPI1_TXSEL = eChannel;
else
PDMA_GCR->PDSSR0.SPI1_RXSEL = eChannel;
break;
case eDRVPDMA_SPI2: /* Set SPI2 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR0.SPI2_TXSEL = eChannel;
else
PDMA_GCR->PDSSR0.SPI2_RXSEL = eChannel;
break;
case eDRVPDMA_SPI3: /* Set SPI3 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR0.SPI3_TXSEL = eChannel;
else
PDMA_GCR->PDSSR0.SPI3_RXSEL = eChannel;
break;
case eDRVPDMA_UART0: /* Set UART0 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR1.UART0_TXSEL = eChannel;
else
PDMA_GCR->PDSSR1.UART0_RXSEL = eChannel;
break;
case eDRVPDMA_UART1: /* Set UART1 PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR1.UART1_TXSEL = eChannel;
else
PDMA_GCR->PDSSR1.UART1_RXSEL = eChannel;
break;
case eDRVPDMA_ADC: /* Set ADC PDMA Channel */
if(eRWAPB)
return E_DRVPDMA_FALSE_INPUT;
else
PDMA_GCR->PDSSR1.ADC_RXSEL = eChannel;
break;
case eDRVPDMA_I2S: /* Set I2S PDMA Channel */
if(eRWAPB)
PDMA_GCR->PDSSR2.I2S_TXSEL = eChannel;
else
PDMA_GCR->PDSSR2.I2S_RXSEL = eChannel;
break;
default:
return E_DRVPDMA_FALSE_INPUT;
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvPDMA_GetCHForAPBDevice */
/* */
/* Parameter: */
/* eChannel -[in] PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8 */
/* eDevice -[in] CH for APB device */
/* It includes eDRVPDMA_SPI0~3,eDRVPDMA_UART0~1, */
/* eDRVPDMA_ADC,eDRVPDMA_I2S */
/* Returns: */
/* 0~8 : Channel 0~8 */
/* E_DRVPDMA_FALSE_INPUT: Wrong parameter */
/* Others: Reserved */
/* */
/* Description: */
/* The function is used to get PDMA channel for specified APB device */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_GetCHForAPBDevice(E_DRVPDMA_APB_DEVICE eDevice,E_DRVPDMA_APB_RW eRWAPB)
{
switch(eDevice)
{
case eDRVPDMA_SPI0:
if(eRWAPB)
return PDMA_GCR->PDSSR0.SPI0_TXSEL; /* Get SPI0 PDMA Channel */
else
return PDMA_GCR->PDSSR0.SPI0_RXSEL;
case eDRVPDMA_SPI1: /* Get SPI1 PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR0.SPI1_TXSEL;
else
return PDMA_GCR->PDSSR0.SPI1_RXSEL;
case eDRVPDMA_SPI2: /* Get SPI2 PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR0.SPI2_TXSEL;
else
return PDMA_GCR->PDSSR0.SPI2_RXSEL;
case eDRVPDMA_SPI3: /* Get SPI3 PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR0.SPI3_TXSEL;
else
return PDMA_GCR->PDSSR0.SPI3_RXSEL;
case eDRVPDMA_UART0: /* Get UART0 PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR1.UART0_TXSEL;
else
return PDMA_GCR->PDSSR1.UART0_RXSEL;
case eDRVPDMA_UART1: /* Get UART1 PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR1.UART1_TXSEL;
else
return PDMA_GCR->PDSSR1.UART1_RXSEL;
case eDRVPDMA_ADC: /* Get ADC PDMA Channel */
if(eRWAPB)
return E_DRVPDMA_FALSE_INPUT;
else
return PDMA_GCR->PDSSR1.ADC_RXSEL;
case eDRVPDMA_I2S: /* Set I2S PDMA Channel */
if(eRWAPB)
return PDMA_GCR->PDSSR2.I2S_TXSEL;
else
return PDMA_GCR->PDSSR2.I2S_RXSEL;
default:
return E_DRVPDMA_FALSE_INPUT;
}
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvPDMA_CHSoftwareReset */
/* */
/* Parameter: */
/* eChannel -[in] PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8 */
/* Returns: */
/* E_SUCCESS Success */
/* E_DRVPDMA_ERR_PORT_INVALID Invalid port number */
/* Description: */
/* The function is used to do software reset Channelx */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_CHSoftwareReset(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
PDMA_T * tPDMA;
if (eChannel > MAX_CHANNEL_NUM ) /* Check Channel is valid */
return E_DRVPDMA_ERR_PORT_INVALID;
tPDMA = (PDMA_T *)((uint32_t)PDMA0 + eChannel * CHANNEL_OFFSET);
tPDMA->CSR.SW_RST = 1; /* Set S/W Reset Bit */
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvPDMA_CHEnablelTransfer */
/* */
/* Parameter: */
/* eChannel -[in] PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8 */
/* Returns: */
/* E_SUCCESS Success */
/* E_DRVPDMA_ERR_PORT_INVALID Invalid port number */
/* Description: */
/* The function is used to enable PDMA channelx and enable channelx */
/* data read or write transfer */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_CHEnableTransfer(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -