⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_at91rm9200.c

📁 基于K9 AT91RM9200 学习板的loader源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	char PCS_Device) // PCS of the Device{	 	//* Write to the MR register	pSPI->SPI_MR &= 0xFFF0FFFF;	pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS );}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_ReceiveFrame//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy//*---------------------------------------------------------------------------- unsigned int AT91F_SPI_ReceiveFrame (	AT91PS_SPI pSPI,	char *pBuffer,	unsigned int szBuffer,	char *pNextBuffer,	unsigned int szNextBuffer ){	return AT91F_PDC_ReceiveFrame(		(AT91PS_PDC) &(pSPI->SPI_RPR),		pBuffer,		szBuffer,		pNextBuffer,		szNextBuffer);}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_SendFrame//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy//*---------------------------------------------------------------------------- unsigned int AT91F_SPI_SendFrame(	AT91PS_SPI pSPI,	char *pBuffer,	unsigned int szBuffer,	char *pNextBuffer,	unsigned int szNextBuffer ){	return AT91F_PDC_SendFrame(		(AT91PS_PDC) &(pSPI->SPI_RPR),		pBuffer,		szBuffer,		pNextBuffer,		szNextBuffer);}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_Close//* \brief Close SPI: disable IT disable transfert, close PDC//*---------------------------------------------------------------------------- void AT91F_SPI_Close (	AT91PS_SPI pSPI)     // \arg pointer to a SPI controller{    //* Reset all the Chip Select register    pSPI->SPI_CSR[0] = 0 ;    pSPI->SPI_CSR[1] = 0 ;    pSPI->SPI_CSR[2] = 0 ;    pSPI->SPI_CSR[3] = 0 ;    //* Reset the SPI mode    pSPI->SPI_MR = 0  ;    //* Disable all interrupts    pSPI->SPI_IDR = 0xFFFFFFFF ;    //* Abort the Peripheral Data Transfers    AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR));    //* Disable receiver and transmitter and stop any activity immediately    pSPI->SPI_CR = AT91C_SPI_SPIDIS;}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_PutChar//* \brief Send a character,does not check if ready to send//*---------------------------------------------------------------------------- void AT91F_SPI_PutChar (	AT91PS_SPI pSPI,	unsigned int character,             unsigned int cs_number ){    unsigned int value_for_cs;    value_for_cs = (~(1 << cs_number)) & 0xF;  //Place a zero among a 4 ONEs number    pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16);}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_GetChar//* \brief Receive a character,does not check if a character is available//*---------------------------------------------------------------------------- int AT91F_SPI_GetChar (	const AT91PS_SPI pSPI){    return((pSPI->SPI_RDR) & 0xFFFF);}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_GetInterruptMaskStatus//* \brief Return SPI Interrupt Mask Status//*---------------------------------------------------------------------------- unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status        AT91PS_SPI pSpi) // \arg  pointer to a SPI controller{        return pSpi->SPI_IMR;}//*----------------------------------------------------------------------------//* \fn    AT91F_SPI_IsInterruptMasked//* \brief Test if SPI Interrupt is Masked //*---------------------------------------------------------------------------- int AT91F_SPI_IsInterruptMasked(        AT91PS_SPI pSpi,   // \arg  pointer to a SPI controller        unsigned int flag) // \arg  flag to be tested{        return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag);}/* *****************************************************************************                SOFTWARE API FOR TC   ***************************************************************************** *///*----------------------------------------------------------------------------//* \fn    AT91F_TC_InterruptEnable//* \brief Enable TC Interrupt//*---------------------------------------------------------------------------- void AT91F_TC_InterruptEnable(        AT91PS_TC pTc,   // \arg  pointer to a TC controller        unsigned int flag) // \arg  TC interrupt to be enabled{        pTc->TC_IER = flag;}//*----------------------------------------------------------------------------//* \fn    AT91F_TC_InterruptDisable//* \brief Disable TC Interrupt//*---------------------------------------------------------------------------- void AT91F_TC_InterruptDisable(        AT91PS_TC pTc,   // \arg  pointer to a TC controller        unsigned int flag) // \arg  TC interrupt to be disabled{        pTc->TC_IDR = flag;}//*----------------------------------------------------------------------------//* \fn    AT91F_TC_GetInterruptMaskStatus//* \brief Return TC Interrupt Mask Status//*---------------------------------------------------------------------------- unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status        AT91PS_TC pTc) // \arg  pointer to a TC controller{        return pTc->TC_IMR;}//*----------------------------------------------------------------------------//* \fn    AT91F_TC_IsInterruptMasked//* \brief Test if TC Interrupt is Masked //*---------------------------------------------------------------------------- int AT91F_TC_IsInterruptMasked(        AT91PS_TC pTc,   // \arg  pointer to a TC controller        unsigned int flag) // \arg  flag to be tested{        return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag);}/* *****************************************************************************                SOFTWARE API FOR PMC   ***************************************************************************** *///*----------------------------------------------------------------------------//* \fn    AT91F_CKGR_GetMainClock//* \brief Return Main clock in Hz//*---------------------------------------------------------------------------- unsigned int AT91F_CKGR_GetMainClock (	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller	unsigned int slowClock)  // \arg slowClock in Hz{	return ((pCKGR->CKGR_MCFR  & AT91C_CKGR_MAINF) * slowClock) >> 4;}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_GetProcessorClock//* \brief Return processor clock in Hz (for AT91RM3400 and AT91RM9200)//*---------------------------------------------------------------------------- unsigned int AT91F_PMC_GetProcessorClock (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller	unsigned int slowClock)  // \arg slowClock in Hz{	unsigned int reg = pPMC->PMC_MCKR;	unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2));	unsigned int pllDivider, pllMultiplier;	switch (reg & AT91C_PMC_CSS) {		case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected			return slowClock / prescaler;		case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler;		case AT91C_PMC_CSS_PLLA_CLK: // PLLA clock is selected			reg = pCKGR->CKGR_PLLAR;			pllDivider    = (reg  & AT91C_CKGR_DIVA);			pllMultiplier = ((reg  & AT91C_CKGR_MULA) >> 16) + 1;			if (reg & AT91C_CKGR_SRCA) // Source is Main clock				return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;			else                       // Source is Slow clock				return slowClock / pllDivider * pllMultiplier / prescaler;		case AT91C_PMC_CSS_PLLB_CLK: // PLLB clock is selected			reg = pCKGR->CKGR_PLLBR;			pllDivider    = (reg  & AT91C_CKGR_DIVB);			pllMultiplier = ((reg  & AT91C_CKGR_MULB) >> 16) + 1;			return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler;	}	return 0;}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_GetMasterClock//* \brief Return master clock in Hz (just for AT91RM9200)//*---------------------------------------------------------------------------- unsigned int AT91F_PMC_GetMasterClock (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller	unsigned int slowClock)  // \arg slowClock in Hz{	return AT91F_PMC_GetProcessorClock(pPMC, pCKGR, slowClock) /		(((pPMC->PMC_MCKR & AT91C_PMC_MDIV) >> 8)+1);}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_EnablePeriphClock//* \brief Enable peripheral clock//*---------------------------------------------------------------------------- void AT91F_PMC_EnablePeriphClock (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	unsigned int periphIds)  // \arg IDs of peripherals to enable{	pPMC->PMC_PCER = periphIds;}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_DisablePeriphClock//* \brief Enable peripheral clock//*---------------------------------------------------------------------------- void AT91F_PMC_DisablePeriphClock (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	unsigned int periphIds)  // \arg IDs of peripherals to enable{	pPMC->PMC_PCDR = periphIds;}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_EnablePCK//* \brief Enable peripheral clock//*---------------------------------------------------------------------------- void AT91F_PMC_EnablePCK (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	unsigned int pck,  // \arg Peripheral clock identifier 0 .. 7	unsigned int ccs,  // \arg clock selection: AT91C_PMC_CSS_SLOW_CLK, AT91C_PMC_CSS_MAIN_CLK, AT91C_PMC_CSS_PLLA_CLK, AT91C_PMC_CSS_PLLB_CLK	unsigned int pres) // \arg Programmable clock prescalar AT91C_PMC_PRES_CLK, AT91C_PMC_PRES_CLK_2, ..., AT91C_PMC_PRES_CLK_64{	pPMC->PMC_PCKR[pck] = ccs | pres;	pPMC->PMC_SCER = (1 << pck) << 8;}//*----------------------------------------------------------------------------//* \fn    AT91F_PMC_DisablePCK//* \brief Enable peripheral clock//*---------------------------------------------------------------------------- void AT91F_PMC_DisablePCK (	AT91PS_PMC pPMC, // \arg pointer to PMC controller	unsigned int pck)  // \arg Peripheral clock identifier 0 .. 7{	pPMC->PMC_SCDR = (1 << pck) << 8;}/* *****************************************************************************                SOFTWARE API FOR PIO   ***************************************************************************** *///*----------------------------------------------------------------------------//* \fn    AT91F_PIO_CfgPeriph//* \brief Enable pins to be drived by peripheral//*---------------------------------------------------------------------------- void AT91F_PIO_CfgPeriph(	AT91PS_PIO pPio,             // \arg pointer to a PIO controller	unsigned int periphAEnable,  // \arg PERIPH A to enable	unsigned int periphBEnable)  // \arg PERIPH B to enable{	pPio->PIO_ASR = periphAEnable;	pPio->PIO_BSR = periphBEnable;	pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode}//*----------------------------------------------------------------------------//* \fn    AT91F_PIO_CfgOutput//* \brief Enable PIO in output mode//*---------------------------------------------------------------------------- void AT91F_PIO_CfgOutput(	AT91PS_PIO pPio,             // \arg pointer to a PIO controller	unsigned int pioEnable)      // \arg PIO to be enabled{	pPio->PIO_PER = pioEnable; // Set in PIO mode	pPio->PIO_OER = pioEnable; // Configure in Output}//*----------------------------------------------------------------------------//* \fn    AT91F_PIO_CfgInput//* \brief Enable PIO in input mode//*---------------------------------------------------------------------------- void AT91F_PIO_CfgInput(	AT91PS_PIO pPio,             // \arg pointer to a PIO controller	unsigned int inputEnable)      // \arg PIO to be enabled{	// Disable output	pPio->PIO_ODR  = inputEnable;	pPio->PIO_PER  = inputEnable;}//*----------------------------------------------------------------------------//* \fn    AT91F_PIO_CfgOpendrain//* \brief Configure PIO in open drain//*---------------------------------------------------------------------------- void AT91F_PIO_CfgOpendrain(	AT91PS_PIO pPio,             // \arg pointer to a PIO controller	unsigned int multiDrvEnable) // \arg pio to be configured in open drain{	// Configure the multi-drive option	pPio->PIO_MDDR = ~multiDrvEnable;	pPio->PIO_MDER = multiDrvEnable;}//*----------------------------------------------------------------------------//* \fn    AT91F_PIO_CfgPullup//* \brief Enable pullup on PIO//*---------------------------------------------------------------------------- void AT91F_PIO_CfgPullup(	AT91PS_PIO pPio,             // \arg pointer to a PIO controller	unsigned int pullupEnable)   // \arg enable pullup on PIO{		// Connect or not Pullup	pPio->PIO_PPUDR = ~pullupEnable;	pPio->PIO_PPUER = pullupEnable;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -