- 积分
- 1493
- 在线时间
- 2240 小时
- 最后登录
- 2024-3-6
- 阅读权限
- 70
- 精华
- 2
- UID
- 20253
- 帖子
- 1325
- 精华
- 2
- 经验
- 1493 点
- 金钱
- 1278 ¥
- 注册时间
- 2007-3-16
|
本帖最后由 蜡笔 于 2013-12-4 13:45 编辑
楼主高手,难得是心得经验肯放出来分享。
软件菜鸟的我最近在尝试软控,目前碰到个对我来说是难题。
希望楼主能指引一下。就是在9018的I2C通讯上的问题,写可以进行,但无法读取9018。
I2C协议按9018PDF来的,就是想不通。板子是论坛的9018
地址是0x92,
目前的情况我觉得时序没问题,但读的时候发93过去就一直低电平了,楼主给黑暗中的我指条明路解决I2C通讯问题,无言感激!
sbit IIC_SDA = P2^7;
sbit IIC_SCL = P2^6;
code uchar IIC_ERROR_STR[] = "IIC_ERROR";
void IIC_START() //开始信号
{
IIC_SDA = 1;
IIC_DELAY();
IIC_SCL = 1;
IIC_DELAY();
IIC_SDA = 0;
IIC_DELAY();
IIC_SCL = 0;
IIC_DELAY();
}
void IIC_STOP()//停止
{
IIC_SDA = 0;
IIC_DELAY();
IIC_SCL = 1;
IIC_DELAY();
IIC_SDA = 1;
IIC_DELAY();
}
uchar IIC_READ_ACK()
{
uchar flag = 0;
IIC_SDA = 1;
IIC_SCL = 1;
IIC_DELAY();
if ( !IIC_SDA )
flag = 1;
IIC_DELAY();
IIC_SCL = 0;
IIC_DELAY();
return flag; //为0无应答
}
void IIC_WRITE_BYTE( uchar dat )
{
uchar i;
IIC_SCL = 0;
for( i=0; i<8; i++ )
{
if( dat & (0x80 >> i) )
{ IIC_SDA = 1; }
else
{ IIC_SDA = 0; }
IIC_DELAY();
IIC_SCL = 1;
IIC_DELAY();
IIC_SCL = 0;
IIC_DELAY();
}
}
uchar IIC_READ_BYTE()
{
uchar i, tmp=0;
for( i=0; i<8; i++ )
{
IIC_SCL = 1;
IIC_DELAY();
tmp <<= 1;
if( IIC_SDA )
{ tmp += 1; }
IIC_SCL = 0;
IIC_DELAY();
}
return tmp;
}
void IIC_ERROR()
{
CLEAR_LINE2();
DIS_IIC_ERROR();
}
//以下为ES9018读写
#define CHIP_ADD 0X92
void ES9018_WRITE( uchar sda, uchar dat )
{
IIC_START();
IIC_WRITE_BYTE( CHIP_ADD );
if( IIC_READ_ACK() )
{
IIC_WRITE_BYTE( sda );
if( IIC_READ_ACK() )
{
IIC_WRITE_BYTE( dat );
if( !IIC_READ_ACK() )
{
IIC_ERROR();
}
}
else
{
IIC_ERROR();
}
}
else
{
IIC_ERROR();
}
IIC_STOP();
IIC_DELAY();
}
uchar ES9018_READ( uchar sda )
{
uchar tmp;
IIC_START();
IIC_WRITE_BYTE( CHIP_ADD + 1 );
if( IIC_READ_ACK() )
{
IIC_WRITE_BYTE( sda );
if( IIC_READ_ACK() )
{
tmp = IIC_READ_BYTE();
IIC_READ_ACK();
}
else
{
IIC_ERROR();
}
}
else
{
IIC_ERROR();
}
IIC_STOP();
IIC_DELAY();
return tmp;
}
|
|