📄 x1226.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 + -