📄 ics1523.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*//********************************************************************************//********************************************************************************//* 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 + -