|
发表于 2006-8-14 09:55:48
|
显示全部楼层
羡慕啊,不知搂主ZLG7290部分的如何实现的,我用ICC 模拟IO方式驱动,总是不成功,不知是什么原因,楼主能否在你的板子上帮忙测试一下啊
附程序,请高人指点啊
//i2c.h
#include <iom128v.h>
#include <macros.h>
#define ZLG7290_I2C_ADDR 0x70
#define NS 42
unsigned char I2cWrite(unsigned char *buf,unsigned char num,unsigned char RomAddress);
unsigned char I2cRead(unsigned char *buf,unsigned char num,unsigned char RomAddress);
//i2c.c
#define IIC_SDA 0x08 //定义SDA管脚PE3
#define IIC_SCL 0x10 //定义SCL管脚PE4
#define IIC_PIN PINE //定义端口
#define IIC_PORT PORTE
#define IIC_DDR DDRE
#define SET_SDA IIC_PORT |= IIC_SDA //SDA高 输出用
#define CLR_SDA IIC_PORT &= ~IIC_SDA //SDA低 输出用
#define SET_SCL IIC_PORT |= IIC_SCL //SCL高 输出用
#define CLR_SCL IIC_PORT &= ~IIC_SCL //SCL低 输出用
#define SCL_OUT IIC_DDR |= IIC_SCL //SCL作输出
#define SDA_OUT IIC_DDR |= IIC_SDA //SDA作输出
#define SDA_IN IIC_DDR &= ~IIC_SDA //SDA作输入
void NOPS(unsigned int i)
{
do
{
NOP();
}while(--i!=0);
}
void I2cStart(void)
{
SDA_OUT;
SCL_OUT;
SET_SDA;
//NOPS(NS);
SET_SCL;
NOPS(NS);
CLR_SDA;
NOPS(NS);
CLR_SCL;
NOPS(NS);
}
void I2cStop(void)
{
SDA_OUT;
CLR_SDA;
NOPS(NS);
SET_SCL;
NOPS(NS);
SET_SDA;
NOPS(NS);
}
void I2cAck(unsigned char x)
{
SDA_OUT;
if(x)
SET_SDA;
else
CLR_SDA;
NOPS(NS);
SET_SCL;
NOPS(NS);
CLR_SCL;
}
//// 返回 1:错误 ////
//// 返回 0:正确 ////
unsigned char I2cTestAck(void)
{
unsigned char error = 0;
SET_SDA;
//NOPS(NS);
SDA_IN;
SET_SCL;
NOPS(NS);
if(IIC_PIN & IIC_SDA)
error = 0x01;
CLR_SCL;
NOPS(NS);
return error;
}
void I2cWrite8bit(unsigned char input)
{
unsigned char i;
SDA_OUT;
for(i=8; i>0; i--)
{
if(input & 0x80)
SET_SDA;
else
CLR_SDA;
input <<= 1;
SET_SCL;
NOPS(NS);
CLR_SCL;
NOPS(NS);
}
}
//// 返回 0:错误 ////
//// 返回 1:正确 ////
unsigned char I2cWrite(unsigned char *buf,unsigned char num,unsigned char RomAddress)
{
CLI();
I2cStart();
I2cWrite8bit(ZLG7290_I2C_ADDR);
if(I2cTestAck()){I2cStop(); return 0;} //I2cTeskAck()返回1错误
I2cWrite8bit(RomAddress);
if(I2cTestAck()){I2cStop(); return 0;}
for( ; num!=0; num--)
{
I2cWrite8bit(*buf++);
if(I2cTestAck()){I2cStop(); return 0;}
}
I2cStop();
NOPS(100);
return 1;
}
unsigned char I2cRead8bit(void)
{
unsigned char i,rd=0;
SDA_IN;
for(i=8; i>0; i--)
{
SET_SCL;
NOPS(NS);
rd <<= 1;
if(IIC_PIN & IIC_SDA)
rd |= 0x01;
NOPS(NS);
CLR_SCL;
NOPS(NS);
}
return rd;
}
//// 返回 0:错误 ////
//// 返回 1:正确,读数错误也返回1 ////
unsigned char I2cRead(unsigned char *buf,unsigned char num,unsigned char RomAddress)
{
CLI();
I2cStart();
I2cWrite8bit(ZLG7290_I2C_ADDR);
if(I2cTestAck()){I2cStop(); return 0;}
I2cWrite8bit(RomAddress);
if(I2cTestAck()){I2cStop(); return 0;}
I2cStart();
I2cWrite8bit(ZLG7290_I2C_ADDR+1);
if(I2cTestAck()){I2cStop(); return 0;}
for( ; num>0; num--)
{
*buf++ = I2cRead8bit();
I2cAck(0);
}
I2cAck(1);
I2cStop();
return 1;
}
//------------------------------------------------------------------------------------
//定义ZLG7290内部寄存器地址(子地址)
#define ZLG7290_SystemReg 0x00 //系统寄存器
#define ZLG7290_Key 0x01 //键值寄存器
unsigned char KeyValue;
main()
{
init_devices();
while(1)
{
KeyValue=0;
I2cRead(&KeyValue,1,ZLG7290_Key);
delay();
}
} |
|