|
发表于 2005-1-28 11:34:50
|
显示全部楼层
//From I2C.h
extern void i2c_stop(void);
extern void i2c_send(uc data);
extern uc i2c_receive(uc end);
extern void i2c_set_addr_r(uc addr);
extern void i2c_set_addr_w(uc addr);
#define READ 1
#define WRITE 0
#define QUIT 1
#define CONTINUE 0
/////////////////////////////////////////////////////////////
//From I2C.c
#include <io.h>
//You should edit only the next three defines:
#define SDA PD5
#define SCL PD6
#define I2C_PORT_SDA DDRD
#define I2C_PORT_SCL DDRD
//Shortcuts to the pins
#define SCL_1 cbi(I2C_PORT_SCL, SCL);
#define SCL_0 sbi(I2C_PORT_SCL, SCL);
#define SDA_1 cbi(I2C_PORT_SDA, SDA);
#define SDA_0 sbi(I2C_PORT_SDA , SDA);
#define dly() i2c_delay();
#define RELEASE_SDA cbi(I2C_PORT_SDA, SDA);
//READ or WRITE operation/request
#define READ 1
#define WRITE 0
//whether we want to continue the read operation
#define QUIT 1
#define CONTINUE 0
typedef unsigned char uc;
void error(void)
{
//As we don't have external eeprom, read data from the internal EEPROM
//Should write it later
//
//Should be defined as apropriate
}
//Some experiments needed here
void i2c_delay(void)
{
uc i;
for(i=1; i<5; i++);
}
void i2c_start(void)
{
SDA_1
SCL_1
dly()
SDA_0
dly()
SCL_0
dly()
}
void i2c_stop(void)
{
SDA_0
SCL_1
dly()
SDA_1
dly()
SCL_0
dly()
}
void i2c_send(uc data)
{
register uc i;
for(i=0; i<=7; i++) {
if ( data & 0x80)
SDA_1
else
SDA_0
SCL_1
dly()
SCL_0
dly()
data = data << 1;
}
RELEASE_SDA
SCL_1
dly()
if( bit_is_clear(PIND,SDA) ) {
SCL_0
dly()
} else
error();
}
uc i2c_receive(uc end)
{
RELEASE_SDA
uc i,data;
data=0;
for(i=0; i<=7; i++) {
SCL_1
dly()
data <<= 1;
if(bit_is_set(PIND,SDA))
data++;
SCL_0
dly()
}
if(end==CONTINUE) //Set ACK
SDA_0
else //Set NO ACK
SDA_1
SCL_1
dly()
SCL_0
dly()
return data;
}
//Some useful functions for 24C04
//Setting the addres and the type of operation (READ/WRITE)
//These are needed to set the internal latch of the memory
void i2c_set_addr_r(uc addr)
{
i2c_start();
i2c_send(0xA0); //WRITE address
i2c_send(addr); //Write internal memory latch
i2c_start();
i2c_send(0xA1); //Set to READ
}
void i2c_set_addr_w(uc addr)
{
i2c_start();
i2c_send(0xA0); //WRITE address
i2c_send(addr);
} |
|