找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7332|回复: 3
打印 上一主题 下一主题
收起左侧

求肋BK1080收音模块读不出数据

[复制链接]
跳转到指定楼层
楼主
ID:146949 发表于 2017-5-4 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
收音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;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72088 发表于 2022-1-31 17:39 | 只看该作者
我在找中文资料,没找到
回复

使用道具 举报

板凳
ID:625730 发表于 2022-2-1 11:09 | 只看该作者
感觉楼主的I2C指令可能有问题。
回复

使用道具 举报

地板
ID:824490 发表于 2022-2-2 00:14 | 只看该作者
新乡家电维修 发表于 2022-1-31 17:39
我在找中文资料,没找到

BK1080E数据手册 v1.1.pdf (842.98 KB, 下载次数: 24)
刚好我有。以前供应商送的5个SOP8的,从没用过,后来用的是BK1079,简单点的,免MCU的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表