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

📄 ics1523.c

📁 ARM外围FLASH 以及SDRAM烧写程序 完整的程序 可能对大家硬件编程有点帮助
💻 C
字号:
//*--------------------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*--------------------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*--------------------------------------------------------------------------------------
//* File Name           : TWI ICS1523 driver
//* Object              :
//* Translator          :
//* 1.0 08/30/02 ED		: Creation
//* 1.2 13/01/03 FB		: Update on lib V3
//*--------------------------------------------------------------------------------------

#include	"ics1523.h"
#include	"AT91RM9200.h"
#include	"lib_AT91RM9200.h"

//////////////////////////////////////////////////////////////////////////////
// Externals
//////////////////////////////////////////////////////////////////////////////
extern unsigned int AT91F_GetTickCount(void);

//////////////////////////////////////////////////////////////////////////////
// Global Variables
//////////////////////////////////////////////////////////////////////////////

//* Supported standard configurations
const AT91S_ICS1523Desc Param_conf_list[] =
{
	//* TFT_Conf Definition File Parameters
	{
		( ICS_ENDLS | ICS_ENPLS | ICS_PDEN ),
		( ICS_PSD | ICS_PFD ),
		0x39,
		0x00,
		0x00,
		0x03,
		( ICS_OEF | ICS_OET2 | ICS_OETCK ),
		( ICS_INSEL | 0x7F )
	}
} ;

//* ICS1523 Parameters Descriptor
AT91S_ICS1523Desc ICS1523_Desc ;

//*----------------------------------------------------------------------------
//* \fn    AT91F_SetTwiClock
//* \brief Initialization
//*----------------------------------------------------------------------------
void AT91F_SetTwiClock(const AT91PS_TWI pTwi,unsigned int mck_khz)
{
	int sclock;

	/* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/

	sclock = (10*mck_khz /ICS_TRANSFER_RATE);
	if (sclock % 10 >= 5)
		sclock = (sclock /10) - 5;
	else
		sclock = (sclock /10)- 6;
	sclock = (sclock + (4 - sclock %4)) >> 2;	// div 4

    pTwi->TWI_CWGR	= 0x00010000 | sclock | (sclock << 8);
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_ICS1523_Init
//* \brief Initialization of the Clock Generator ICS1523
//*----------------------------------------------------------------------------
int AT91F_ICS1523_Init (unsigned int conf, unsigned int mck_khz)
{
	int 			ack,nb_trial,error_status ;
	char *			status ;
	unsigned int	initial_timeout;

	error_status = (int) ICS1523_ACCESS_OK ;

	//* Descriptors initialisation
	ICS1523_Desc.icr = Param_conf_list[conf].icr ;
	ICS1523_Desc.lcr = Param_conf_list[conf].lcr ;
	ICS1523_Desc.fd0 = Param_conf_list[conf].fd0 ;
	ICS1523_Desc.fd1 = Param_conf_list[conf].fd1 ;
	ICS1523_Desc.dpao = Param_conf_list[conf].dpao ;
	ICS1523_Desc.dpac = Param_conf_list[conf].dpac ;
	ICS1523_Desc.oes = Param_conf_list[conf].oes ;
	ICS1523_Desc.odr = Param_conf_list[conf].odr ;

	// Configure TWI PIOs
	AT91F_TWI_CfgPIO ();
	AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,(unsigned int) AT91C_PA25_TWD);

	// Configure PMC by enabling TWI clock
	AT91F_TWI_CfgPMC ();
	
	// Configure TWI in master mode
	AT91F_TWI_Configure (AT91C_BASE_TWI);
	
	// Set TWI Clock Waveform Generator Register	
	AT91F_SetTwiClock(AT91C_BASE_TWI,mck_khz);

	// ICS1523 Initialisation
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_ICR, ( unsigned char ) 0 ) ;
	error_status |= ack ;
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_OE, ( unsigned char ) ICS1523_Desc.oes ) ;
	error_status |= ack ;
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_OD, ( unsigned char ) ICS1523_Desc.odr ) ;
	error_status |= ack ;
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_DPAO, ( unsigned char ) 0 ) ;
	error_status |= ack ;
	
	nb_trial = 0 ;
	do
	{
		nb_trial++ ;
		ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_ICR, ( unsigned char ) ICS1523_Desc.icr ) ;
		error_status |= ack ;
		ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_LCR, ( unsigned char ) ICS1523_Desc.lcr ) ;
		error_status |= ack ;
		ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_FD0, ( unsigned char ) ICS1523_Desc.fd0 ) ;
		error_status |= ack ;
		ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_FD1, ( unsigned char ) ICS1523_Desc.fd1 ) ;
		error_status |= ack ;
		ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_SWRST, ( unsigned char ) ( ICS_PLLR ) ) ;
		error_status |= ack ;

	    // Program 1ms temporizing period
		initial_timeout = AT91F_GetTickCount();
		while( AT91F_GetTickCount() < (initial_timeout + TIMEOUT_OF_1000us) );

		AT91F_ICS1523_ReadByte ( ( unsigned char ) ICS_SR, status ) ;
	} while ( !( ( unsigned int ) *status & ( unsigned int ) ICS_PLLLOCK ) && ( nb_trial < 10 ) ) ;
	
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_DPAC, ( unsigned char ) ICS1523_Desc.dpac ) ;
	error_status |= ack ;
	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_SWRST, ( unsigned char ) ( ICS_DPAR ) ) ;
	error_status |= ack ;
	
	//* Program 1ms temporizing period
	initial_timeout = AT91F_GetTickCount();
	while( AT91F_GetTickCount() < (initial_timeout + TIMEOUT_OF_1000us) );

	ack = AT91F_ICS1523_WriteByte ( ( unsigned char ) ICS_DPAO, ( unsigned char ) ICS1523_Desc.dpao ) ;
	error_status |= ack ;
	return ( error_status ) ;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_ICS1523_WriteByte
//* \brief Write a byte with TWI Interface to the Clock Generator ICS1523
//*----------------------------------------------------------------------------
int AT91F_ICS1523_WriteByte (char reg_address, char data_out)
{
	int 			Status, nb_trial ;
	unsigned int	initial_timeout;

    AT91C_BASE_TWI->TWI_MMR = (AT91C_TWI_MREAD & 0x0) | AT91C_TWI_IADRSZ_1_BYTE | ((ICS_ADD << 0x10) & AT91C_TWI_DADR);
	AT91C_BASE_TWI->TWI_IADR = ( unsigned int ) reg_address ;
	AT91C_BASE_TWI->TWI_THR	= ( unsigned int ) data_out ;
    AT91C_BASE_TWI->TWI_CR = ( unsigned int ) ( AT91C_TWI_START | AT91C_TWI_STOP ) ;

	//* Program temporizing period (300us)
	initial_timeout = AT91F_GetTickCount();
	while( AT91F_GetTickCount() < initial_timeout + TIMEOUT_OF_300us);

    nb_trial = 0 ;
    Status = AT91C_BASE_TWI->TWI_SR ;

    while ( !( Status  & AT91C_TWI_TXCOMP ) && ( nb_trial < 10 ) )
    {
		nb_trial++;
		if ( Status  & AT91C_TWI_ERROR )
		{	
		// Si Under run OR NACK Start again
	    AT91C_BASE_TWI->TWI_CR	= ( unsigned int ) ( AT91C_TWI_START | AT91C_TWI_STOP ) ;
		//* Program temporizing period (300us)
		initial_timeout = AT91F_GetTickCount();
		while( AT91F_GetTickCount() < (initial_timeout + TIMEOUT_OF_300us) );
		}
		Status = AT91C_BASE_TWI->TWI_SR ;
    };
    
	if (Status & AT91C_TWI_TXCOMP)
		return ( (int) ICS1523_ACCESS_OK ) ;
	else
		return ( (int) ICS1523_ACCESS_ERROR ) ;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_ICS1523_ReadByte
//* \brief Read a byte with TWI Interface from the Clock Generator ICS1523
//*----------------------------------------------------------------------------
int AT91F_ICS1523_ReadByte (char reg_address, char *data_in)
{
	int 			Status, nb_trial ;
	unsigned int	initial_timeout;

    AT91C_BASE_TWI->TWI_MMR = AT91C_TWI_MREAD | AT91C_TWI_IADRSZ_1_BYTE | ((ICS_ADD << 0x10) & AT91C_TWI_DADR);
    AT91C_BASE_TWI->TWI_IADR = ( unsigned int ) reg_address ;
	AT91C_BASE_TWI->TWI_CR = ( unsigned int ) ( AT91C_TWI_START | AT91C_TWI_STOP ) ;

	//* Program temporizing period (300us)
	initial_timeout = AT91F_GetTickCount();
	while( AT91F_GetTickCount() < (initial_timeout + TIMEOUT_OF_300us) );

	nb_trial = 0 ;
    Status = AT91C_BASE_TWI->TWI_SR ;

	//* Wait TXcomplete ...
    while ( !( Status  & AT91C_TWI_TXCOMP ) && ( nb_trial < 10 ) )
    	{
    	nb_trial++;
		Status = AT91C_BASE_TWI->TWI_SR ;
		}
		
	if (Status & AT91C_TWI_TXCOMP)
	{
		*data_in = (char) AT91C_BASE_TWI->TWI_RHR ;
		return ( (int) ICS1523_ACCESS_OK ) ;
	}
	return ( (int) ICS1523_ACCESS_ERROR ) ;
}

⌨️ 快捷键说明

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