这篇文即调试标清视频或者说调试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. POJ 3279 Filptile dfs

    题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...

  2. kali linux 2018.2 mysql密码修改后无效,外部无法连接问题。

    kali linux 2018.2 mysql密码修改后无效,外部无法连接问题 Kali Linux 2018.2 默认MySQL数据库是mariadb,可能和MySQL有些细微的变化,只需要做如下处 ...

  3. C++设计模式之职责链模式

    代码实现: // chainResbonsibility.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stri ...

  4. PHP获取访客IP、地区位置信息、浏览器、来源页面

    不多说了,每个方法都注释了,可以直接用: <?php //这个类似用来获取访客信息的 //方便统计 class visitorInfo { //获取访客ip public function ge ...

  5. 别名的使用注意,""真坑。

    我们使用别名都是使用as关键字. 大多数时候我们都会省略as关键字,然后后面直接加别名就好了.我的习惯是别名用双引号括起来. 今天因为这个习惯坑了我一大波 首先oracle的别名的规则: AS 别名 ...

  6. Alpha阶段第1周 Scrum立会报告+燃尽图 07

    作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...

  7. c# sqlbulkcopy批量插入数据

    dt信息中包含数据和表名 public static void SqlBulkInsert(DataTable dt, string connStr) { try { using (var conn ...

  8. eclipse加入c标签

    在MyEclipse中使用jstl标签只需导读jstl.jar就能使用,但是在Eclipse中还需要一点小套路 步骤: 一.导入jstl.jar 二.导入导入standard.jar 三.在WEB-I ...

  9. Oozie_02安装遇到错误【20161116】

    [错误原因]hadoop的core-site.xml配置错误  把用户名hadoop配置成了主机名hadoop01 <!-- OOZIE --><property> <n ...

  10. Linux下下载JDK

    需要加特殊的前缀,不然无法下载文件 . 例如JDK8 U131 wget -c --header "Cookie: oraclelicense=accept-securebackup-coo ...