|
收音IC型號: BK1080-SOP16
器件地址:0x80
我用STC15W4K58S4來驅(qū)動BK1080收音模塊,I2C低層是用之前驅(qū)動RDA5820的數(shù)據(jù)來修改.
SDA和SCL都沒有接錯,也有4K7上拉電阻。
現(xiàn)在一直讀不出數(shù)據(jù),讀寄存0x00~0xFF都沒有數(shù)據(jù)。在邏輯儀上看偶爾出現(xiàn)有顯示0x7F。
求助,有人用過這個芯片嗎?
4.jpg (198.24 KB, 下載次數(shù): 88)
下載附件
2017-5-4 17:43 上傳
void I2C_Start()//I2C起始信號
{
IIC_SDA = 1; //拉高數(shù)據(jù)線
IIC_SCL = 1; //拉高時鐘線
Delayus(5);
IIC_SDA = 0; //產(chǎn)生下降沿
Delayus(5);
IIC_SCL = 0; //拉低時鐘線
}
void I2C_Stop()//I2C停止信號
{
IIC_SDA = 0; //拉低數(shù)據(jù)線
IIC_SCL = 1; //拉高時鐘線
Delayus(5);
IIC_SDA = 1; //產(chǎn)生上升沿
Delayus(5);
}
bit IIC_RecvACK()//接收應(yīng)答信號
{
IIC_SCL = 1; //拉高時鐘線
Delayus(5); //延時
CY = IIC_SDA; //讀應(yīng)答信號
IIC_SCL = 0; //拉低時鐘線
Delayus(5); //延時
return CY;
}
void I2C_SendByte(uchar dat)//向I2C總線發(fā)送一個字節(jié)數(shù)據(jù)
{
unsigned char i;
for (i=0; i<8; i++) //8位計數(shù)器
{
dat <<= 1; //移出數(shù)據(jù)的最高位
IIC_SDA = CY; //送數(shù)據(jù)口
IIC_SCL = 1; //拉高時鐘線
Delayus(5); //延時
IIC_SCL = 0; //拉低時鐘線
Delayus(5); //延時
}
IIC_RecvACK();
}
uchar I2C_RecvByte(void)//從I2C總線接收一個字節(jié)數(shù)據(jù)
{
unsigned char i;
unsigned char dat = 0;
IIC_SDA = 1; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i=0; i<8; i++) //8位計數(shù)器
{
dat <<= 1;
IIC_SCL = 1; //拉高時鐘線
Delayus(5); //延時
dat |= IIC_SDA; //讀數(shù)據(jù)
IIC_SCL = 0; //拉低時鐘線
Delayus(5); //延時
}
return dat;
}
void Single_WriteI2C_FM(uchar REG_Address,uint REG_data)//向I2C設(shè)備寫入2個字節(jié)數(shù)據(jù)
{
I2C_Start(); //起始信號
I2C_SendByte(0x80); //發(fā)送設(shè)備地址+寫信號
I2C_SendByte(REG_Address); //內(nèi)部寄存器地址,
I2C_SendByte(REG_data>>8);//取高位,類似定時器的TH0=(65536-1000)/256;
I2C_SendByte(REG_data&0xFF);//取低位,類似定時器的TL0=(65536-1000)%256;
I2C_Stop(); //發(fā)送停止信號
}
uint Single_ReadI2C_FM(uchar REG_Address)//從I2C設(shè)備讀取一個字節(jié)數(shù)據(jù)
{
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(); //發(fā)送停止信號
return buf;
}
|
|