收音IC型号: BK1080-SOP16
器件地址:0x80
我用STC15W4K58S4来驱动BK1080收音模块,I2C低层是用之前驱动RDA5820的数据来修改.
SDA和SCL都没有接错,也有4K7上拉电阻。
现在一直读不出数据,读寄存0x00~0xFF都没有数据。在逻辑仪上看偶尔出现有显示0x7F。
求助,有人用过这个芯片吗?
void I2C_Start()//I2C起始信号
{
IIC_SDA = 1; //拉高数据线
IIC_SCL = 1; //拉高时钟线
Delayus(5);
IIC_SDA = 0; //产生下降沿
Delayus(5);
IIC_SCL = 0; //拉低时钟线
}
void I2C_Stop()//I2C停止信号
{
IIC_SDA = 0; //拉低数据线
IIC_SCL = 1; //拉高时钟线
Delayus(5);
IIC_SDA = 1; //产生上升沿
Delayus(5);
}
bit IIC_RecvACK()//接收应答信号
{
IIC_SCL = 1; //拉高时钟线
Delayus(5); //延时
CY = IIC_SDA; //读应答信号
IIC_SCL = 0; //拉低时钟线
Delayus(5); //延时
return CY;
}
void I2C_SendByte(uchar dat)//向I2C总线发送一个字节数据
{
unsigned char i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
IIC_SDA = CY; //送数据口
IIC_SCL = 1; //拉高时钟线
Delayus(5); //延时
IIC_SCL = 0; //拉低时钟线
Delayus(5); //延时
}
IIC_RecvACK();
}
uchar I2C_RecvByte(void)//从I2C总线接收一个字节数据
{
unsigned char i;
unsigned char dat = 0;
IIC_SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
IIC_SCL = 1; //拉高时钟线
Delayus(5); //延时
dat |= IIC_SDA; //读数据
IIC_SCL = 0; //拉低时钟线
Delayus(5); //延时
}
return dat;
}
void Single_WriteI2C_FM(uchar REG_Address,uint REG_data)//向I2C设备写入2个字节数据
{
I2C_Start(); //起始信号
I2C_SendByte(0x80); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址,
I2C_SendByte(REG_data>>8);//取高位,类似定时器的TH0=(65536-1000)/256;
I2C_SendByte(REG_data&0xFF);//取低位,类似定时器的TL0=(65536-1000)%256;
I2C_Stop(); //发送停止信号
}
uint Single_ReadI2C_FM(uchar REG_Address)//从I2C设备读取一个字节数据
{
unsigned int buf;
I2C_Start();
I2C_SendByte(0x80);
I2C_SendByte(REG_Address);
I2C_Start();
I2C_SendByte(0x80+1);
buf = I2C_RecvByte();
buf<<=8;
IIC_SDA = 0;
IIC_SCL = 1;
Delayus(5);
IIC_SCL = 0;
Delayus(5);
IIC_SDA = 1;
buf |= I2C_RecvByte();
IIC_SDA = 1;
IIC_SCL = 1;
Delayus(5);
IIC_SCL = 0;
Delayus(5);
IIC_SDA = 0;
I2C_Stop(); //发送停止信号
return buf;
}
|