关于S52驱动TVP5150视频解码器的问题,I2C写入出了问题

2020-02-04 09:04发布

#include "REG52.h"
#include <intrins.h>
#define add 0xBA>>1

sbit SDA = P3^4;
sbit SCL = P3^3;


void start();
void stop();
bit shout(unsigned char write_data);
void write_byte(unsigned char write_com, unsigned char write_data);
void delayms(unsigned char ms);
void delayus(unsigned char us);

main(void)
{
        SDA = 1;
        SCL = 1;
    P1 =0XFF;

    write_byte(0x00, 0x00);
    write_byte(0x03, 0x09);
    //P1 = shout;
        while(1)
        {
        ;
        }           
}

void start()
// 开始位
{
        SDA = 1;
        SCL = 1;
        _nop_();
        _nop_();
        SDA = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL = 0;
}

void stop()
// 停止位
{
        SDA = 0;
        _nop_();
        _nop_();
        SCL = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA = 1;
}


bit shout(unsigned char write_data)
// 从MCU移出数据到5150
{
        unsigned char i;
        bit ack_bit;
        for(i = 0; i < 8; i++)                // 循环移入8个位
        {
                SDA = (bit)(write_data & 0x80);
                _nop_();
        _nop_();
                SCL = 1;
                _nop_();
                _nop_();
                SCL = 0;
                write_data <<= 1;
        }
        SDA = 1;                        // 读取应答
        _nop_();
        _nop_();
        SCL = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ack_bit = SDA;
        SCL = 0;
        return ack_bit;                        // 返回AT24Cxx应答位  
}

void write_byte(unsigned char write_com, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
        start();
        shout(add);
        shout(write_com);
        shout(write_data);
    delayus(1);         //122us左右
        stop();
        delayms(10);                // 写入周期  
}


void delayms(unsigned char ms)       
// 延时子程序
{
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

void delayus(unsigned char us)       
// 延时子程序
{
        unsigned char i;
        while(us--)
        {
                for(i = 0; i < 10; i++);
        }
}


这是程序,我用逻辑分析器可以看到S52所输出的I2C波行,如图1和如图2,频率在51KHZ左右,I2C的输出。现在问题是TVP5150无反应,所有输出脚都无信号。
    write_byte(0x00, 0x00);   这两个是配置的,我用逻辑分析仪直接测试的SCLK脚,无信号输出(其它脚信号都无信号)。
    write_byte(0x03, 0x09);

图1 write_byte(0x00, 0x00); :
图2.jpg (49.78 KB, 下载次数: 0) 下载附件 2012-4-28 12:26 上传

现在不知道问题出在什么地方,不请各位帮一下忙,如果是I2C有问题看能不能给个I2C的程序,谢谢了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。