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

📄 i2c.h

📁 ppcboot2.0 华恒光盘里带的BOOTLOADER
💻 H
字号:
#ifndef I2C_H#define I2C_H/**************************************************** * * Copyright Motrola 1999 * ****************************************************/#define get_eumbbar() CFG_EUMB_ADDR#define I2CADR    0x00003000#define I2CFDR    0x00003004#define I2CCR     0x00003008#define I2CSR     0x0000300C#define I2CDR     0x00003010typedef enum _i2cstatus{ I2CSUCCESS     = 0x3000, I2CADDRESS, I2CERROR, I2CBUFFFULL, I2CBUFFEMPTY, I2CXMITERROR, I2CRCVERROR, I2CBUSBUSY, I2CALOSS, I2CNOEVENT,} I2CStatus;typedef enum i2c_control{ MEN  = 0x00000080, MIEN = 0x00000040, MSTA = 0x00000020, MTX  = 0x00000010, TXAK = 0x00000008, RSTA = 0x00000004,} I2C_CONTROL;typedef enum i2c_status{  MCF   =  0x00000080,  MAAS  =  0x00000040,  MBB   =  0x00000020,  MAL   =  0x00000010,  SRW   =  0x00000004,  MIF   =  0x00000002,  RXAK  =  0x00000001,} I2C_STATUS;typedef struct _i2c_ctrl{	unsigned int reserved0 : 24;	unsigned int men       : 1;	unsigned int mien      : 1;	unsigned int msta      : 1;	unsigned int mtx       : 1;	unsigned int txak      : 1;	unsigned int rsta      : 1;	unsigned int reserved1 : 2;} I2C_CTRL;typedef struct _i2c_stat{	unsigned int rsrv0    : 24;	unsigned int mcf      : 1;	unsigned int maas     : 1;	unsigned int mbb      : 1;	unsigned int mal      : 1;	unsigned int rsrv1    : 1;	unsigned int srw      : 1;	unsigned int mif      : 1;	unsigned int rxak     : 1;} I2C_STAT;typedef enum _i2c_mode{	RCV =  0,	XMIT = 1,} I2C_MODE;/******************** App. API ******************** * The application API is for user level application * to use the funcitonality provided by I2C driver * * Note: Its App.s responsibility to swap the data *       byte. In our API, we just transfer whatever *       we are given **************************************************//** * Note: * * In all following functions, * the caller shall pass the configured embedded utility memory * block base, EUMBBAR. **//* Send a buffer of data to the intended rcv_addr. * If stop_flag is set, after the whole buffer * is sent, generate a STOP signal provided that the * receiver doesn't signal the STOP in the middle. * I2C is the master performing transmitting. If * no STOP signal is generated at the end of current * transaction, the master can generate a START signal * to another slave addr. * * return I2CSUCCESS if no error. */static I2CStatus I2C_put( unsigned int  eumbbar,						  unsigned char rcv_addr,    /* receiver's address */	                      unsigned char *buffer_ptr, /* pointer of data to be sent */					      unsigned int  length,      /* number of byte of in the buffer */					      unsigned int  stop_flag,   /* 1 - signal STOP when buffer is empty					                                  * 0 - no STOP signal when buffer is empty											          */						  unsigned int  is_cnt );    /* 1 - this is a restart, don't check MBB                                                      * 0 - this is a new start, check MBB													  *//* Receive a buffer of data from the desired sender_addr * If stop_flag is set, when the buffer is full and the * sender does not signal STOP, generate a STOP signal. * I2C is the master performing receiving. If no STOP signal * is generated, the master can generate a START signal * to another slave addr. * * return I2CSUCCESS if no error. */static I2CStatus I2C_get( unsigned int  eumbbar,						  unsigned char sender_addr, /* sender's address */					      unsigned char *buffer_ptr, /* pointer of receiving buffer */				          unsigned int  length,      /* length of the receiving buffer */					      unsigned int  stop_flag,   /* 1 - signal STOP when buffer is full					                                  * 0 - no STOP signal when buffer is full												      */						  unsigned int  is_cnt );    /* 1 - this is a restart, don't check MBB                                                      * 0 - this is a new start, check MBB													  */#if 0 /* the I2C_write and I2C_read functions are not active *//* Send a buffer of data to the requiring master. * If stop_flag is set, after the whole buffer is sent, * generate a STOP signal provided that the requiring * receiver doesn't signal the STOP in the middle. * I2C is the slave performing transmitting. * * return I2CSUCCESS if no error. * * Note: due to the Kahlua design, slave transmitter *       shall not signal STOP since there is no way *       for master to detect it, causing I2C bus hung. * *       For the above reason, the stop_flag is always *       set, i.e., 1. * *       programmer shall use the timer on Kahlua to *       control the interval of data byte at the *       master side. */static I2CStatus I2C_write( unsigned int eumbbar,						    unsigned char *buffer_ptr, /* pointer of data to be sent */					        unsigned int  length,      /* number of byte of in the buffer */					        unsigned int  stop_flag ); /* 1 - signal STOP when buffer is empty								                        * 0 - no STOP signal when buffer is empty											            */ /* Receive a buffer of data from the sending master. * If stop_flag is set, when the buffer is full and the * sender does not signal STOP, generate a STOP signal. * I2C is the slave performing receiving. * * return I2CSUCCESS if no error. */static I2CStatus I2C_read(unsigned int  eumbbar,						  unsigned char *buffer_ptr, /* pointer of receiving buffer */					      unsigned int  length,      /* length of the receiving buffer */				          unsigned int  stop_flag ); /* 1 - signal STOP when buffer is full					                                  * 0 - no STOP signal when buffer is full												      */#endif /* of if0 for turning off I2C_read & I2C_write *//* if interrupt is not used, this is the timer event handler. * After each fixed time interval, this function can be called * to check the I2C status and call appropriate function to * handle the status event. */static I2CStatus I2C_Timer_Event( unsigned int eumbbar, I2CStatus (*handler)( unsigned int ) );/********************* Kernel API ************************ * Kernel APIs are functions I2C driver provides to the * O.S. *********************************************************//******************* device I/O function ***************//*  Generate a START signal in the desired mode. *  I2C is the master. * * return I2CSUCCESS if no error. *        I2CERROR   if i2c unit is not enabled. *        I2CBUSBUSY if bus cannot be granted */static I2CStatus I2C_Start( unsigned int  eumbbar,						    unsigned char slave_addr, /* address of the receiver */	                        I2C_MODE     mode,       /* XMIT(1) - put (write)							                          * RCV(0)  - get (read)													  */						    unsigned int is_cnt ); /* 1 - this is a restart, don't check MBB													* 0 - this is a new start, check MBB                                                    *//* Generate a STOP signal to terminate the transaction. */static I2CStatus I2C_Stop( unsigned int eumbbar );/*  Do a one-byte master transmit. * *  return I2CBUFFEMPTY if this is the last byte. *  Otherwise return I2CSUCCESS */static I2CStatus I2C_Master_Xmit( unsigned int eumbbar );/*  Do a one-byte master receive. * *  return I2CBUFFFULL if this is the last byte. *  Otherwise return I2CSUCCESS */static I2CStatus I2C_Master_Rcv( unsigned int eumbbar );/*  Do a one-byte slave transmit. * *  return I2CBUFFEMPTY if this is the last byte. *  Otherwise return I2CSUCCESS * */static I2CStatus I2C_Slave_Xmit( unsigned int eumbbar );/* Do a one-byte slave receive. * *  return I2CBUFFFULL if this is the last byte. *  Otherwise return I2CSUCCESS */static I2CStatus I2C_Slave_Rcv( unsigned int eumbbar  );/* Process slave address phase. * * return I2CADDRESS if this is slave receiver's address phase * Otherwise return the result of slave xmit one byte. */static I2CStatus I2C_Slave_Addr( unsigned int eumbbar );/******************* Device Control Fucntion ****************//*  Initialize I2C unit with desired frequency divider, *  driver's slave address w/o interrupt enabled. * *  This function must be called before I2C unit can *  be used. */static I2CStatus I2C_Init( unsigned int  eumbbar,						   unsigned char fdr,       /* frequency divider */	                       unsigned char addr,      /* driver's address used for receiving */	 			           unsigned int en_int);    /* 1 - enable I2C interrupt					                                 * 0 - disable I2C interrup											         *//* I2C interrupt service routine. * * return I2CADDRESS if it is receiver's (either master or slave) address phase. * return the result of xmit or receive one byte */static I2CStatus I2C_ISR(unsigned int eumbbar  );/* Set I2C Status, i.e., write to I2CSR */static void I2C_Set_Stat( unsigned int eumbbar, I2C_STAT stat );/* Query I2C Status, i.e., read I2CSR */static I2C_STAT I2C_Get_Stat( unsigned int eumbbar );/* Change I2C Control bits, i.e., write to I2CCR */static void I2C_Set_Ctrl( unsigned int eumbbar, I2C_CTRL ); /* new control value *//* Query I2C Control bits, i.e., read I2CCR */static I2C_CTRL I2C_Get_Ctrl( unsigned int eumbbar );/* This function performs the work for I2C_do_transaction.  The work is * split into this function to enable I2C_do_transaction to first transmit * the data address to the I2C slave device without putting the data address * into the first byte of the buffer. * * en_int controls interrupt/polling mode * act is the type of transaction * i2c_addr is the I2C address of the slave device * len is the length of data to send or receive * buffer is the address of the data buffer * stop = I2C_NO_STOP, don't signal STOP at end of transaction *        I2C_STOP, signal STOP at end of transaction * retry is the timeout retry value, currently ignored * rsta = I2C_NO_RESTART, this is not continuation of existing transaction *        I2C_RESTART, this is a continuation of existing transaction */static I2C_Status I2C_do_buffer( I2C_INTERRUPT_MODE en_int,                                 I2C_TRANSACTION_MODE act,                                 unsigned char i2c_addr,                                 int len,                                 unsigned char *buffer,                                 I2C_STOP_MODE stop,                                 int retry,                                 I2C_RESTART_MODE rsta);#endif

⌨️ 快捷键说明

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