这篇文即调试标清视频或者说调试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. docker的搭建和简单应用

    dockerserver端安装 先下载docker的yum源 wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ...

  2. 在CMD中使用for命令对单行字符串做分割的方法

    我们都知道CMD中的for命令是执行循环命令的,数据来源可以是一个文件,一个命令的结果或一个字符串,只有这3种来源 如果是一个文件则对这个文件的所有字符串进行循环处理 如果是一个命令结果,那么对这个命 ...

  3. Nginx 反向代理 如何在web应用中获取用户ip

    转载:http://blog.csdn.net/bao19901210/article/details/52537279 问题背景: 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断 ...

  4. spring boot 教程(三)配置详解

    在大部分情况下,我们不需要做太多的配置就能够让spring boot正常运行.在一些特殊的情况下,我们需要做修改一些配置,或者需要有自己的配置属性. Spring Boot 支持多种外部配置方式 这些 ...

  5. Python 使用PyMySql 库 连接MySql数据库时 查询中文遇到的乱码问题(实测可行) python 连接 MySql 中文乱码 pymysql库

    最近所写的代码中需要用到python去连接MySql数据库,因为是用PyQt5来构建的GUI,原本打算使用PyQt5中的数据库连接方法,后来虽然能够正确连接上发现还是不能提交修改内容,最后在qq交流群 ...

  6. MySQl中隔离级别和悲观锁乐观锁

    1.MySql的事物支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务.行级锁.并发 Ber ...

  7. jenkins配置maven

    # 去官网下载maven # 安装 cd /opt wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.3/binari ...

  8. 20165212实验三——敏捷开发与XP实践

    20165212实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过 ...

  9. solr5.5.0在CenOS上的安装与配置

    solr5.5.0在CenOS上的安装与配置 1. Solr简介 Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XS ...

  10. php switch case的"bug"

    首先说明,这不是一个bug.应该说是一个比较容易中招的陷阱. 今天使用switch遇到一个问题,代码如下: <?php $num = 0; switch ($price) { case $pri ...