99 lines
3.3 KiB
C
99 lines
3.3 KiB
C
// Copyright (C) 2009 Ubixum, Inc.
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
/** \file i2c.h
|
|
* Utilities for reading and writing to i2c devices and as eeproms.
|
|
**/
|
|
|
|
#ifndef I2C_H
|
|
#define I2C_H
|
|
|
|
#include "fx2types.h"
|
|
|
|
/**
|
|
* i2c_write and i2c_read set this to FALSE at the beginning of a
|
|
* transaction. If for some reason, the read/write is taking too
|
|
* long or not returning, firmware can set this to TRUE to cause the
|
|
* routine to abort. (Usually done via an interrupt).
|
|
**/
|
|
extern volatile __xdata BOOL cancel_i2c_trans;
|
|
|
|
/**
|
|
* \brief write data to i2c bus.
|
|
*
|
|
* Writes data from addr buffer 1st, then data buffer.
|
|
* Either buffer can be NULL (as long as you set lenN to 0).
|
|
*
|
|
* Two buffers allows writing data all in one i2c write command without
|
|
* having to write a hardware address and a data byte with each
|
|
* i2c transaction.
|
|
*
|
|
* \param addr i2c address
|
|
* \param len1 length of addr data
|
|
* \param addr_buf addr data
|
|
* \param len2 length of data
|
|
* \param data_buf data bytes
|
|
**/
|
|
BOOL i2c_write(BYTE addr, WORD len1, BYTE * addr_buf, WORD len2,
|
|
BYTE * data_buf);
|
|
|
|
/**
|
|
* \brief read data on the i2c bus.
|
|
*
|
|
* \param addr i2c address
|
|
* \param len number of bytes to read
|
|
* \param buf buffer to store data
|
|
**/
|
|
BOOL i2c_read(BYTE addr, WORD len, BYTE * buf);
|
|
|
|
/**
|
|
* \brief read data from an attached eeprom.
|
|
*
|
|
* Writes the address of the data to read then reads len bytes into buf.
|
|
* This function checks the I2CS register to determine if a one or two
|
|
* byte address eepom was detected on the i2c bus. Reading from proms
|
|
* at non-standard addresses my require using the i2c_read/write commands
|
|
* explicitly.
|
|
*
|
|
* \param prom_addr eeprom i2c address
|
|
* \param addr address of bytes to start reading
|
|
* \param len number of bytes to read
|
|
* \param buf data buffer
|
|
**/
|
|
BOOL eeprom_read(BYTE prom_addr, WORD addr, WORD len, BYTE * buf);
|
|
|
|
/**
|
|
* \brief write data to the eeprom
|
|
*
|
|
* This function checks the I2CS register to determin if a one or two
|
|
* two byte eeprom is detected. If the prom is not detected at boot time
|
|
* or is connected to alternate addresses, the i2c_read/write commands should
|
|
* be used explicitly insread of using this function.
|
|
*
|
|
* For each byte in buf, the address is written and then the data byte. Many
|
|
* proms support writing multiple bytes at the same time. For these, it is
|
|
* also better to use i2c_read/write explicitly. This function is rather slow
|
|
* but is effective.
|
|
*
|
|
* \param prom_addr eeprom i2c address
|
|
* \param addr address of bytes to start writing
|
|
* \param len number of bytes to write
|
|
* \param buf data buffer
|
|
**/
|
|
BOOL eeprom_write(BYTE prom_addr, WORD addr, WORD len, BYTE * buf);
|
|
|
|
#endif
|