这篇文即调试标清视频或者说调试TVP5147和ADV7343所使用的程序名称为video_sd_playback_480i_composite

我们用的是合众达公司(SEED)的SEED-DVSD6467板,其开发包中提供了这个测试文件.大家也可在我的网盘中下载到.地址:http://yunpan.cn/QzvXRUBCeakMT

在进行复合视频480i测试的时候,对I2C的从设备地址感到比较奇怪,一般I2C设备地址都是厂家做芯片的时候给固定好的,但是在此测试程序中出现了改变.

对于TVP5147来说,数据手册上的I2C地址是0XBA即10111010,如图所示

而程序中给出的地址是0X5D即01011101,如图所示

对于ADV7343来说,数据手册上的I2C地址是0X56即01010110,如下两图所示

而程序中给出的地址是0X2B即00101011,如下图所示

也许你现在并不是很清楚它怎么个奇怪法,现在列出相应的地址为

器件      数据手册地址      程序中地址

TVP5147    10111010      01011101

ADV7343    01010110      00101011

从上面可以看出,程序中的地址相对于数据手册中的地址向右移动了一位.即在程序中I2C地址的设定对数据手册中规定的I2C地址进行了右移一位操作.为什么会这样?

经过认真的查看资料,其实也费了我好大的劲.比较笨,关键是:程序中的I2C从设备地址与数据手册中所定义的I2C地址不同了,认真看了寄存器之后终于明白了.

如下图所示.这是寄存器ICMDR--I2C Mode Register(tms320dm6467 datasheet(P339)中的所提到的一个寄存器,其文献号为SPRS403F)中设置从设备地址格式的一位

而对于ICSAR寄存器(tms320dm6467 datasheet(P339)中的所提到的一个寄存器,其文献号为SPRS403F)来看,如下两图所示

也就是说真正的I2C地址只用到此从设备地址寄存器的的后七位再加上读写位即构成从设备地址了.

下面是用示波器所捕获的I2C时钟与数据线的传输数据情况

从上图可以看出,该从设备的地址是01010110,即0x56.其中前七位为从设备地址0101011,最后一位位写信号0.接着可以看出I2C对从设备进行写子地址(SUBADDRESS)0x17,然后通过I2C对子地址(从设备寄存器)写数据(设置寄存器)0x02.在程序中的语句即为

adv7343_rset( 0x17, 0x02 );             //功能为向ADV7343寄存器0x17中写数据0x02

Int16 adv7343_rset( Uint8 reg, Uint8 reg_value )
{
Int16 errors = ;
Uint8 cmd[]; cmd[] = reg;
cmd[] = reg_value; errors = EVMDM6467_I2C_write( ADV7343_I2C_ADDR, cmd, ); _waitmsec( ); return errors;
} #define ADV7343_I2C_ADDR ( 0x2a | 1 ) //0x2b=00101011

从上面的设置地址可以看出0x2b=00101011的后七位.正好是数据手册中的地址0101011.放大的截图如下两图所示

那么也就是说,如果想要使用的从设备为ADV7343,我们从其datasheet上得到其IIC地址为0101011(0|1),这其中前七位为0101011,最后一位是读写位(0表示写/1表示读).严格意义上来说,IIC地址只是前面的七位即0101011,而TI的datasheet上也是这样用的,我们要使用ADV7343,就要告诉DM6467该ADV7343的IIC地址,该地址是用ICSAR寄存器来配置的.而读写位是用ICMDR寄存器的TRX位配置的.所以程序中

/*define IIC address of adv7343*/
#define ADV7343_I2C_ADDR ( 0x2a | 1 ) //0x2b=00101011 /*write by iic*/
errors = EVMDM6467_I2C_write( ADV7343_I2C_ADDR, cmd, ); Int16 EVMDM6467_I2C_write( Uint16 address, Uint8* tx, Uint16 len )
{
Int16 i;
Uint8* tx8 = tx; I2C_ICCNT = len; // Set length
I2C_ICSAR = address; // Set I2C slave address
I2C_ICMDR = ICMDR_STT // Set DSP for Master Write
| ICMDR_TRX // read or write!!!!!!!!!!!!!
| ICMDR_MST
| ICMDR_IRS
| ICMDR_FREE; _wait( ); for ( i = ; i <= len ; i++ ) // Write from 1 byte onward
{
I2C_ICDXR = *tx8++; // Write 1 byte
if ( _I2C_tx_ready( i2c_timeout ) ) // Wait for TX Ready
return i;
} I2C_ICMDR |= ICMDR_STP; // STOP
return ;
}

程序中ADV7343_I2C_ADDR的值0x2a|1并没有设置读写位,这里用二进制为0101011,其实这只是设置了IIC地址,而读写位是在ICMDR寄存器中设置的.只不过EVMDM6467_I2C_write函数封装了而已.

本文转自:http://www.61ic.com/article/davinci/tms320dm646x/201104/32554.html

Davinci-DM6467板子-外围器件的I2C地址的疑惑解答的更多相关文章

  1. 如何知道外围器件的器件地址PHY_ADDR

    由于 S5P6818 现有的uboot没有网卡的初始化代码实现,在尝试移植网卡驱动而跟踪有关的源码的时候,不止一次地看到了类似下面的需要修改器件地址的有关写法. 根据原理图的有关硬件连接,找到对应的元 ...

  2. I2C地址问题

    #define     MAX_17040_BATTERY_I2C_ADDR        (0x36) 设备地址 #define     MAX_17040_BATTERY_WRITE_ADDR   ...

  3. TI davinci DM6467通过串口0将UBL和u-boot写入NAND flash

    TI的davinci系列一般支持好几种启动模式,如下图TMS320DM6467的datasheet可以查到所有的BOOTMODE LVS301和LW9226的开发板上有一个选择bootmode的拨码开 ...

  4. Arduino 寻找I2C地址address

    参考:http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-quick-tip-fin ...

  5. go:关于变量地址的疑惑

    定义一些变量,并输出其地址 一.一般变量 var a, b int32 var c, d int64 输出其地址 结果: a 0xc082006310 b 0xc082006320 c 0xc0820 ...

  6. 对 IIC 总线的理解、调用函数以及常见面试问题

    一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...

  7. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析

     针对DAVINCI DM6446平台,网络上也有很多网友写了V4L2的驱动,但只是解析Montavista linux-2.6.10 V4L2的原理.结构和函数,深度不够.本文决定把Montavis ...

  8. 模拟I2C协议学习点滴之原理框架

    I2C是一种串行总线协议. 目前几种常用的串行总线有UART.SPI和I2C协议.UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数 ...

  9. Linux设备驱动模型之I2C总线

    一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...

随机推荐

  1. STM32知识点纪要

    1.GPIO BSRR(端口位设置寄存器)是赋1相应IO拉高,赋0无影响 BRR(端口位清除寄存器)是是赋1相应IO拉低,赋0无影响 2.UART 连线TX—TX,RX—RX 3.JTAG和SWD接口 ...

  2. [转]Ubuntu默认root用户密码

    Ubuntu默认root用户密码 在试验的过程中,安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下. 到网上搜了一下,原来是这么回事:Ubuntu的默认root密码 ...

  3. jquery分页滑动插件(鼠标可控制上下滑动)

    这个插件非常好用 http://www.swiper.com.cn/

  4. 在JavaScript中进行文件处理,第五部分:Blobs

    译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 到目前为止,这个系列的帖子集中在和这些文件交互- ...

  5. Jenkins插件开发(三)-- 插件编写

    在上一篇blog 中我们介绍了如何创建我们第一个jenkins插件,在这一篇blog继续介绍在开发我们的插件过程中需要注意的一些问题. 扩展点选择 Jenkings插件是基于扩展点来实现的,比如基于B ...

  6. Alpha阶段敏捷冲刺---Day2

    一.Daily Scrum Meeting照片 PS:不要问我们为什么少了个人,某位不愿说出姓名的大佬强行申请要拍照 二.今天冲刺情况反馈 今天我们依旧在五社区五号楼719进行我们的每日立会.经过昨天 ...

  7. consul 1.2 支持service mesh

    主要说明: This release supports a major new feature called Connect that automatically turns any existing ...

  8. SpringCloud初体验:一、Eureka 服务的注册与发现

    Eureka :云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移. Eureka 可以大致理解为 房产中介 和 房东 的关系,房东想让租客租房子,首先要把房子 ...

  9. 【linux】文件目录说明

    /根目录.一般不含任何文件,除了可能的标准的系统引导映象,通常叫/vmlinuz .所有其他文件在根文件系统的子目录中. /bin 一般用户使用的命令 /boot 放置内核及LILO.GRUB等导引程 ...

  10. Python自然语言处理(1):初识NLP

    由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...