IIC驱动 IO模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QPSK
STV0903 TUNER STV6110 驱动设计
1.IIC 理论
MEGA128 模拟IIC时序控制QPSK 中的STV0903 STV6110
STV0903 STV6110 连接图
IIC时序理论
先看下STV0903写时序图
1)起总线
先将SCL、SDA拉高,然后维持SCL为高先将SDA拉低参考代码如下:void Start(void)
{
SBI(PORTD,SAA7113_DA TA);
SBI(PORTD,SAA7113_CLK);
IIC_delay();
CBI(PORTD,SAA7113_DA TA);
IIC_delay();
CBI(PORTD,SAA7113_CLK);
IIC_delay();
}
2)停总线
先将SCL、SDA拉低,然后先拉高SCL,维持SCL为高时拉高SDA
参考代码:
void Stop(void)
{
CBI(PORTD,SAA7113_DA TA);
CBI(PORTD,SAA7113_CLK);
IIC_delay();
SBI(PORTD,SAA7113_CLK);
IIC_delay();
SBI(PORTD,SAA7113_DA TA);
IIC_delay();
}
3)写总线
在写总线时将SDA设置为输出,参考代码:
void write_byte(unsigned char data)
{
uchar m,tmp;
SBI(SAA7113_DDR,SAA7113_DA TA);
for(m = 0; m < 8; m++)
{
if(data & 0x80)
SBI(PORTD,SAA7113_DA TA);
else
CBI(PORTD,SAA7113_DA TA);
IIC_delay();
SBI(PORTD,SAA7113_CLK);
IIC_delay();
data = data<<1;
CBI(PORTD,SAA7113_CLK);
}
IIC_delay();
saa7113_ack();
IIC_delay();
}
4)应答
应答由被控制芯片回应过来,在此时SDA应该设置为输入等待ACK, 在CLK第九个脉冲时,CLK为高电平,而SDA为一个低电平在表示收到器件的一个ACK应答。。
参考代码:
void saa7113_ack()
{
uchar tmp,m;
CBI(DDRD,SAA7113_DA TA);
SBI(PORTD,SAA7113_CLK);
for(m=0;m<10;m++)
{
IIC_delay();
tmp = PIND;
tmp &=0x02;
if(tmp == 0)
break;
}
CBI(PORTD,SAA7113_CLK);
SBI(DDRD,SAA7113_DA TA);
}
5)读时序
读芯片的数据时SDA应该设置为输入,
参考代码:
uchar read_byte(void)
{
uchar m;
uchar tmp1 = 0;
uchar tmp2 = 0;
CBI(SAA7113_DDR,SAA7113_DA TA);//输入
for(m = 0; m < 8; m++)
{
CBI(PORTD,SAA7113_CLK);
IIC_delay();
SBI(PORTD,SAA7113_CLK);
IIC_delay();
tmp1 = PIND; //sda 所在管脚
tmp1 &= 0x02;
if(0x02 == tmp1)
tmp2 = ((tmp2 << 1) | 1);
else
tmp2 = ((tmp2 << 1) & 0xfe);
CBI(PORTD,SAA7113_CLK);
}
IIC_delay();
saa7113_ack();
return(tmp2);
}
STV0903 and STV6110
通过STV0903来控制STV6110 当STV0903能正常读写时,先是打开I2CRPT控制寄存器用示波器测量SCL、SDA引脚观测波形,再测STV6110波形,如果STV6110波形出现脉冲宽度不等,则可能是SCLT 延迟于SCL,通过配置寄存器去掉延迟。如果波形变化比较多出现多种波形,而且脉冲有时与SDA对准出现不标准,则可能是设置STV6110的时候速度不对。。
开发所遇到的问题:
1)IIC时序不对,在示波器上看哪出波形不对则修改哪处,观察到的波形就是我们模拟的波形,注意转折点SDA的输入输出。
2)STV6110波形不对,比如SCL为高时,SDA不能确定是高还是低。。则是STV6110速度设置问题。I2C repeater速度设置不对,我们设置为010我们的repeater是16MHZ,而datasheet上是(that is, 135 MHz);
3)不标准波形如下所示。
如上波形:不好认为是010 还是111 ,这种波形我认为是不标准波形。