这篇文即调试标清视频或者说调试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. JS类型转换之valueOf和toString详解

    最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2)// 3 add(1,2,3)(10)// 16 add(1)(2)(3)(4)(5)// 15 对于一个好 ...

  2. 流程设计器jQuery + svg/vml(Demo4 - 画连线)

    流程结点可以添加了之后,接下来到画结点与结点之间的连线,效果图如下 很眼馋visio的连线可以折来折去,这里实现的连线比较简单. 首先是把连线的类型分为Z(折线).N(折线)及I(直线)3种类型,然后 ...

  3. 配置java环境变量,实现一条命令自由切java7 或java8

    在多个java编译环境中,有时需要java 7,有时又需要java 8,怎么配置java 环境,可以快速自动切换呢?下面用mac演示在 /etc/bashrc 中配置的环境变量 # 设置 JDK ex ...

  4. ASP.NET MVC 使用NPOI导出Excel 无法访问已关闭的流(转)

    第一步重写MemoryStream , 让它不能自动关闭. //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public ...

  5. 软工2017第三周作业之找bug——测试报告

    作业要求来自:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/957 环境:windows7  cmd命令行 要求1 bug计分.阅读 ...

  6. Log4j(一):Log4j将日志信息写入数据库

    前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ...

  7. 【转载】一张表看懂LTE和5G NR的区别

    转自:微信公众号:网优雇佣军 KPI 物理层

  8. .Net调用Java端带有WS-Security支持的Web Service各方案实战【转】

    原文:http://www.xuebuyuan.com/641669.html 到现在为止,我们AEP平台已经发布很长一段时间了,也有很多ISV接入并上线了,就语言而言,目前主要有三类:Java..N ...

  9. web程序1

  10. 浅谈iOS学习之路(转)

    转眼学习iOS已经快两年的时间了,这个路上有挫折也有喜悦,一步步走过来发现这个过程是我这一辈子的财富,我以前的老大总是对我说,年轻就是最大的资本(本人91年),现在才算是慢慢的体会到,反观自己走过的这 ...