QPSKSTV0903 TUNER STV6110 驱动设计1.IIC 理论MEGA128 模拟IIC时序控制QPSK 中的STV0903 STV6110STV0903 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);elseCBI(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);elsetmp2 = ((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 ,这种波形我认为是不标准波形。
示波器的使用说明P11-触发 2 –水平3- 用作调节视图(观察范围)(秒/格)4-5 –垂直调节一个为CH1 一个为CH2 ,6-7 分别为CH1 CH2 电压调节,8-9 为CH1 CH2 (CH1是指通道1) 10 运行/停止3-逆时针则会视野更广,看到的波形越小,顺时针则会局部到某一部分波形上。
1-触发调节触发可以使得波形停留时间更长以及更加清晰,易于捕捉波形按10停止。
使用实例:测试STV0903波形,在程序中不断向SCL、SDA发送信号,设置延时易于捕捉波形,开机时调节3使得观察到全部波形,然后将2向左调,调节6,7使得电压都为2V,调节4,5使得波形垂直方向上挨齐些,按10停止,再按3查看局部波形。
指针二级指针与指针的指针的区别(以char 为例)指针变量char * p; p 被定义为一个char * 类型的指针变量。
&p则表示指针变量所分配的内存处的地址,*p 表示所指向地址的处的值。
P为所指地址。
Ef:Char str[10];Char *p1=str;P1 和str 的值是一样的,都是指数组的首地址。
*p1 和str[0]的值相同。
Char *p2=p1;P2 与p1 的值相同也是str的地址。
Char ** p2 = &p1;意思为P2所指向地址&p1,p1中存放是一个char * 的指针;参考代码:#include <stdio.h>#include <stdlib.h>void test(char *);void second(char *);int main(void){char str[10];char tmp;printf(" str addr : %x \n " , str);for(tmp = 0;tmp <9;tmp++)str[tmp]=tmp+0x30;str[tmp]='\0';puts("main:");puts(str);test(str);puts(str);return 0;}void test(char *a){char tmp;puts("test:");puts(a);printf("a addr : %x \n " , &a);// second(a);char ** b = &a;for(tmp=0;tmp<9;tmp++)*(*b)++ = tmp + 65;return ;}void second(char *b){printf(" b addr : %x \n " , &b);puts("second:");char tmp;for(tmp=0;tmp < 9;tmp++)*(b++) = tmp + 65;return ;}/*str addr : 12ff74main:012345678test:012345678a addr : 12ff20ABCDEFGHIPress any key to continue*/数据手册参考词汇lagacy 继承reflection 反射Confidential 机密的demodulator 解调器implementation 实现Semiconductors 半导体internal 内部的device master 主设备access 访问repeater 中继器Electrical specifications 电气规格tuning 调整transactions执行oversample采样ascertain 确定integrates 整合significantly 值得注目地impedeance 阻抗respectively 分别的reserved 默认bidirectional 双向tuner 调谐器compliant适应sub addresses 子地址attention items 注意事项isolation 分离perform 执行pulse 脉冲respectively 分别的invert 反向integrates 集成configures 配置high impedance 高阻抗Consult 咨询Unallocated 未分配的conforms 符合consecutive 连续的open-drain 开漏RF IC 射频IC unless otherwise 除非calibration 校准bitfield位域determines 决定residual 剩余further 更进一步。
constant 常数dedicated专用subsequent随后amplifier放大器compensation 补偿assigned 分配foreword 序Recommendation 推荐division ratio 分频比local oscillator 本振频率divisor 除数divider 分频器either……or 要么……要么hence 因此Spectrum 频谱conforms符合。