收音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;
}
|