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

📄 x1226.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
字号:
//*----------------------------------------------------------------------------
//* File Name           : x1226.c
//* Object              : DF9311上X1226时钟读写,及eeprom的读写
//*                     :
//*			:
//* 1.0 04/07/08	: Creation
//*----------------------------------------------------------------------------
#include "../ucos_ii/includes.h"
 
/* Global Variables */

extern INT32U	i2c_speed;
I2Cdesc     I2C_line ;
extern void timer2_init(void);
 
/*--------------------  Function definition for I2C driver ------------------*/
//*-----------------------------------------------------------------------------
//* Function Name       : no_handler_tc (I2Cdesc *I2C_pt)
//* Object              : I2C Error
//* Input Parameters    : <I2C_pt> = I2C Peripheral Descriptor pointer
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void no_handler_tc (I2Cdesc *I2C_pt)
{//* Begin

//    at91_I2C_lineClose(&I2C_line);

}//* End

//*-----------------------------------------------------------------------------
//* Function Name       :  at91_I2CError(I2Cdesc *I2C_pt)
//* Object              : I2C Error
//* Input Parameters    : <I2C_pt> = I2C Peripheral Descriptor pointer
//*         : loadAddress  Address on slave
//*         : nbByte       Read to bytes
//*         : I2C_address  I2C address Divice
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void at91_I2CError(I2Cdesc *I2C_pt)
{
//* Begin

    //* change interrupt handler to at91_I2CTxSendStopSDA
    I2C_pt->I2CTCHandler = at91_I2CSendStopSDA;

}//* End
/*-----------------  External Function definition for at24c512 --------------*/

//*--------------------------------------------------------------------------------
//* Function Name       : IIC_Init( INT32U speed )
//* Object              : Init the x1226 driver
//* Input Parameters    : speed define in timer value by ((MCKI /4 ) / (I2C Freq))
//* Output Parameters   : None
//*---------------------------------------------------------------------------------
void IIC_Init(const PioCtrlDesc *pio_pt, INT32U speed, INT32U sda, INT32U scl )
{//* Begin

    /*I2C init */
    I2C_line.pio_ctrl_desc  = pio_pt ;            //* PIO field
    I2C_line.pioa_base      = pio_pt->pio_base;
    I2C_line.SDA_line       = sda ;
    I2C_line.SCL_line       = scl ;

    // EPROM X1226 address
//    I2C_line.deviceAddress = X1226_I2C_ADDRESS;


    //* Timer 0 Counter field
    I2C_line.TCBase     = TCB0_BASE;
    I2C_line.timerBase  = (StructTC *) TC2_BASE;
  //  I2C_line.timerBase  = TC2_BASE;
    I2C_line.channelId  = TC2_ID;            //changed 
  //  I2C_line.timerBase  = (StructTC *) TCB0_BASE;
  //  I2C_line.channelId  = TC0_ID;

    //* IRQ field
    I2C_line.timerBase->TC_IDR = 0x1FF;             //* disable interrupt
    I2C_line.AICHandler = tc2_interrupt_handler;
    I2C_line.I2CTCHandler =no_handler_tc;
    
   // I2C_line.timerBase->TC_RA = 0; //new

    at91_I2C_lineOpen(&I2C_line, speed);

} //* End
//*---------------------------------------------------------------------------------------
//* Function Name       : IIC_TransfertEnd(void)
//* Object              : Wait the end I2C transfert when I2C_line.state != OK
//* Input Parameters    : None
//* Output Parameters   : none
//*---------------------------------------------------------------------------------------
void  IIC_TransfertEnd(void)
{//* Begin
    at91_I2CTransfertEnd(&I2C_line);
}//* End

//*---------------------------------------------------------------------------------------
//* Function Name       : Clock_Write (INT16U address, INT8U *data_array, INT32U num_bytes )
//* Object              : Write to serial EEPROM note: the data input buffer are free when
//*                       I2C_line.state != OK
//* Input Parameters    :
//*         address   : devive assress to write
//*         pointer   : data for write
//*         num_bytes : number of byte to write
//*         mck       : Master clock of the board
//*
//* Output Parameters   : none
//*---------------------------------------------------------------------------------------
void Clock_Write( INT16U address, INT8U *data_array, INT32U num_bytes, INT32U mck )
{//* Begin
    INT32U num_page;
    INT32U cpt;
    INT32U mck_khz;
     
    I2C_line.deviceAddress = CCR;
     
    num_page = num_bytes / X1226_PAGE_LENGTH;
 
    mck_khz = MCKKHz;
    
    I2C_line.TxEnd  = I2C_line.TxPtr  = data_array;

    //* Trig the timer
    I2C_line.timerBase->TC_CCR = TC_SWTRG;
    //* write modulo page block
    for (cpt=0; cpt<num_page; cpt++)
    {
        at91_I2CTransfertEnd(&I2C_line);
        at91_I2CWrite(&I2C_line,address+cpt*X1226_PAGE_LENGTH,X1226_PAGE_LENGTH,TRUE);
        //*  wait write tine 10 ms

	   // at91_I2CWaitTime(&I2C_line,X1226_TWR,mck_khz);
	 

    }
    //* write modulo rest page
    if((num_page*X1226_PAGE_LENGTH) < num_bytes)
    {
        at91_I2CTransfertEnd(&I2C_line);
        at91_I2CWrite(&I2C_line,address+cpt*X1226_PAGE_LENGTH,(num_bytes-X1226_PAGE_LENGTH*cpt),TRUE);
        //*  wait write tine 10 ms


	//  I2C_line.timerBase->TC_CCR = TC_SWTRG; 
    //   at91_I2CWaitTime(&I2C_line,X1226_TWR,mck_khz);
    }

}//* End

//*---------------------------------------------------------------------------------------
//* Function Name       : Clock_Read( INT16U address, INT8U *data_array, INT32U num_bytes )
//* Object              : Reading the serial EEPROM  note: the data outout buffer are full
//*                       when I2C_line.state != OK
//* Input Parameters    :
//*         address   : devive assress to Read
//*         pointer   : data to read
//*         num_bytes : nbbyte
//* Output Parameters   : none
//*---------------------------------------------------------------------------------------
void  Clock_Read(INT16U address, INT8U *data_array, INT32U num_bytes )
{//* Begin
    
    I2C_line.deviceAddress = CCR;
     
     //* Set the recivied buffer
    I2C_line.RxEnd = I2C_line.RxPtr  = data_array;

    //* Trig the timer
    I2C_line.timerBase->TC_CCR = TC_SWTRG;
    at91_I2CTransfertEnd(&I2C_line);
    at91_I2CRead(&I2C_line,address,num_bytes,TRUE);
    at91_I2CTransfertEnd(&I2C_line);


}//* End


void EEprom_Write( INT16U address, INT8U *data_array, INT32U num_bytes, INT32U mck )
{//* Begin
    INT32U num_page;
    INT32U cpt;
    INT32U mck_khz;
     
    I2C_line.deviceAddress = Eeprom_Array;
     
   num_page = num_bytes / X1226_EEPROM_LENGTH;
//    mck_khz = mck/1000;
    mck_khz = MCKKHz;
    //* set global buffer aadres
    I2C_line.TxEnd  = I2C_line.TxPtr  = data_array;

    //* Trig the timer
    I2C_line.timerBase->TC_CCR = TC_SWTRG;
    //* write modulo page block
    for (cpt=0; cpt<num_page; cpt++)
    {
        at91_I2CTransfertEnd(&I2C_line);
        at91_I2CWrite(&I2C_line,address+cpt*X1226_EEPROM_LENGTH,X1226_EEPROM_LENGTH,TRUE);
        //*  wait write tine 10 ms
        I2C_line.timerBase->TC_CCR = TC_SWTRG;        
    	at91_I2CWaitTime(&I2C_line,X1226_TWR,mck_khz);

    }
    //* write modulo rest page
    if((num_page*X1226_EEPROM_LENGTH) < num_bytes)
    {
        at91_I2CTransfertEnd(&I2C_line);
        at91_I2CWrite(&I2C_line,address+cpt*X1226_EEPROM_LENGTH,(num_bytes-X1226_EEPROM_LENGTH*cpt),TRUE);
        //*  wait write tine 10 ms


	   I2C_line.timerBase->TC_CCR = TC_SWTRG; 
       at91_I2CWaitTime(&I2C_line,X1226_TWR,mck_khz);
    }

}//* End



void  EEprom_Read(INT16U address, INT8U *data_array, INT32U num_bytes )
{//* Begin
    
    I2C_line.deviceAddress = Eeprom_Array;
     
     //* Set the recivied buffer
    I2C_line.RxEnd = I2C_line.RxPtr  = data_array;

    //* Trig the timer
    I2C_line.timerBase->TC_CCR = TC_SWTRG;
    at91_I2CTransfertEnd(&I2C_line);
    at91_I2CRead(&I2C_line,address,num_bytes,TRUE);
    at91_I2CTransfertEnd(&I2C_line);


}//* End
void WriteSysTime(TSysTime *SysTime)
{          
           u_char WriteCom;
           
           SysTime->Hour |= 0x80;
           
           Timer2SwitchToI2C();
           
      //     at91_irq_close ( WDI_ID );
       
           WriteCom = 0x02;
           Clock_Write(STATUSREG,&WriteCom, 1, MCK) ;
           
           IIC_TransfertEnd();
    
           WriteCom = 0x06;
           Clock_Write(STATUSREG,&WriteCom, 1, MCK) ;
    
           IIC_TransfertEnd();  
         
   
           Clock_Write(RTC_SC, &(SysTime->Second), 8, MCK) ;
        
           
           IIC_TransfertEnd();
           
           WriteCom = 0x0;
           Clock_Write(STATUSREG,&WriteCom, 1, MCK) ;
           
           IIC_TransfertEnd();
           
         /*   at91_irq_open ( WDI_ID ,
                         INTWATCHDOG ,
                         AIC_SRCTYPE_INT_EDGE_TRIGGERED ,
                         OSTickISR ) ;*/
                         
           Timer2SwitchToFreq();
}
void ReadSysTime(TSysTime *SysTime)
{
       
        Timer2SwitchToI2C();
        
       // at91_irq_close ( WDI_ID );
      
        Clock_Read( RTC_SC, &(SysTime->Second), 8) ;
      
       /* at91_irq_open ( WDI_ID ,
                         INTWATCHDOG ,
                         AIC_SRCTYPE_INT_EDGE_TRIGGERED ,
                         OSTickISR ) ;*/
        Timer2SwitchToFreq();
}
void WriteEEprom(INT16U addr,INT8U *buf,INT16U num)
{

          u_char WriteCom;
     //     short i;
          
          Timer2SwitchToI2C();
          
         at91_irq_close ( WDI_ID );
       
          IIC_TransfertEnd();
           
          WriteCom = 0x02;
          Clock_Write(STATUSREG,&WriteCom, 1, MCK) ;
           
          IIC_TransfertEnd();
          
    
          WriteCom = 0x06;
          Clock_Write(STATUSREG,&WriteCom, 1, MCK) ;
           
          IIC_TransfertEnd();
   //连续写两次页面;(一次写的字节64)
           EEprom_Write(addr, buf, num, MCK) ;
   //连续单字节写;
        /*  for(i=0;i<num;i++)
          {
           EEprom_Write(addr+i, &(buf[i]), 1, MCK) ;
      //     buf++;
          // IIC_TransfertEnd();
          }*/
           
          IIC_TransfertEnd();
           
         at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
         
          Timer2SwitchToFreq();                         
                         
}

void ReadEEprom(INT16U addr,INT8U *buf,INT16U num)
{           

           Timer2SwitchToI2C();
           
           IIC_TransfertEnd();
          
           at91_irq_close ( WDI_ID );
      
           EEprom_Read( addr, buf, num) ;
      
			at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);                    
           
           Timer2SwitchToFreq();
}
 
void Timer2SwitchToI2C(void)
{
        // at91_tc_close(&TC2_DESC);
        // at91_irq_close(TC2_DESC.periph_id);
        // at91_clock_close(TC2_DESC.periph_id);
        
          at91_pio_open ( &PIO_DESC, P6, PIO_OUTPUT );  //将开关选择设为PIO输出模式;
          at91_pio_open ( &PIO_DESC, P7, PIO_OUTPUT );  //将I2C SDA设为PIO输出模式;
		  at91_pio_write (&PIO_DESC, P6, PIO_CLEAR_OUT );//将开关选择置低;
		 
		  IIC_TransfertEnd();   	  
		  IIC_Init(&PIO_DESC, i2c_speed, SDA, SCL);
}
void Timer2SwitchToFreq(void)
{         
           at91_pio_write (&PIO_DESC, P6, PIO_SET_OUT );
           timer2_init();
}

 

⌨️ 快捷键说明

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