问答题      试题二

     阅读以下关于某嵌入式处理器和存储器方面的说明,回答下列问题。

     [说明]

     在某嵌入式系统设计中,需要使用嵌入式主处理器对外围模拟视频信号进行采集、编码、存储和网络传输。图1为李工设计的该嵌入式系统的原理框图:采用两片TVP5146芯片进行两路模拟视频数据采集,在该处理器外围采用MAX3232芯片进行串口扩展,以方便系统调试,同时在该原理图中还设计了相应的Flash存储器接口,DDR存储器,网络及电源等电路。

     在该电路设计中,视频采集芯片TVP5146需要主处理器通过I2C接口进行采集模式、亮度、对比度、增益等参数的调节,但是主处理器只有一个I2C接口,因此需要将两个TVP5146挂载的同一个I2C总线上,如图2所示TVP5146的I2C芯片地址选择如表1所示,当进行I2C读时,I2C地址的最低位是1,当进行写操作时,I2C地址最低位是0,A0由外围电路的高低电平决定,高电平为1,低电平为0。

    
问答题 (答案用十六进制表示,比如0xAA)

     根据图2及表1所示,对图2中的TVP5146(1)和TVP5146(2)两个芯片分别进行I2C读写操作时,其对应的地址依次是:

     TVP5146(1)读操作时的I2C地址: ____(1)____

     TVP5146(1)写操作时的12C地址: ____(2)____

     TVP5146(2)读操作时的12C地址: ____(3)____

     TVP5146(2)写操作时的I2C地址: ____(4)____
【正确答案】 (1)0xB9 (2)0xB8 (3)0xBB (4)0xBA
【答案解析】    本题考查嵌入式系统设计,涉及嵌入式软件和硬件基础知识的应用,尤其是嵌入式处理器外设控制及操作方面。

     本问题主要考查嵌入式系统软硬件协同设计中外设控制器TVP5146(I2C设备)的操作访问以及串口配置的基本软硬件应用知识。

     I2C(Inter—Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在1980年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

     I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

     (1)开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

     (2)结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

     (3)应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

     I2C规程运用主/从双向通信。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL,为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。写操作分为字节写和页面写两种操作,对于页面写,根据芯片的一次装载的字节不同有所不同。读操作有三种基本操作:当前地址读、随机读和顺序读。

     目前很多的处理器都集成了I2C接口,同时外围的控制设备也具有I2C从接口。对于从设备的访问需要依赖于I2C地址,同时挂载在同一个总线上面的从设备的I2C地址必须互不相同。通常一个嵌入式系统中可能包含多个I2C从设备,需要对每个设备配置相应的地址。不同的从设备其对应的I2C地址会有多种不同配置方法,有些是出厂固定,有些是可以通过外部地址线来配置。      该题目中的地址线即通过外部的A0地址来进行配置。按照其给出的电路连接方式,即可确定不同I2C设备的地址。

     TVP5146(1)读操作时的I2C地址:0xB9

     TVP5146(1)写操作时的I2C地址:0xB8

     TVP5146(2)读操作时的I2C地址:0xBB

     TVP5146(2)写操作时的I2C地址:0xBA
问答题 (答案用十六进制表示,比如0xAA) 在图2原理图设计中,主处理器的串口控制器的时钟为27M,在进行串口调试时,李工需要将串口配置为9600bps的波特率,需要对串口控制器的DLL(Divisor Latches Low寄存器)和DLH(Divisor Latches High寄存器)进行配置,DLL和DLH的寄存器分别如图2-3和图2-4所示。
【正确答案】 (1)0xFC或者0xFD (2)0x0A
【答案解析】 本题考查嵌入式系统中的硬件驱动配置,要求考生能够正确配置串口的波特率。 在图2原理图设计中,主处理器的串口控制器的时钟为27M,在进行串口调试时,需要将串口配置为9600bps的波特率,需要对串口控制器的DLL(Divisor Latches Low寄存器)和DLH(Divisor Latches High寄存器)进行配置,同时该题目给出了DLL和DLH的寄存器定义。由定义可以看出来,其DLH和DLL分别为16位寄存器,但是只有低8位是有效的。 在该题目中给出了对应的串口控制器的时钟,其波特率配置寄存器DLL和DLH的配置实际就是依据时钟和需要配置的波特率数值进行计算。在实际的嵌入式系统的驱动程序设计中,对于驱动的设计也就是如此。其计算方法为: (1)9600bps的波特率则意味着每个比特位数传输所需要的时间为1/9600秒。 (2)串口控制器的时钟为27M,说明其对应的时钟周期时间为1/(27*1000*1000)秒。 (3)因此,传输每个比特位所需要的时钟周期数目为:(1/9600)/(1/(27*1000*1000))=2812.5。 2815.2换算为十六进制为AFCH或者是AFDH,因此对应的DLH设置为高8位,0x0A,对应的DLL设置为低8位,为0xFC或者0xFD。
问答题     (答案用十六进制表示,比如0xAA)

     在李工对TVP5146进行配置时,需要编写I2C的读写函数,在进行I2C的读写操作时,需要对I2C的控制寄存器、数据寄存器以及状态寄存器进行配置和查询。具体的写操作流程为:先配置控制寄存器为写模式,再检查状态寄存器,如果准备就绪,则向数据寄存器写数据,写完之后进行状态寄存器查询状态,根据状态退出写操作。具体的读操作流程为:先配置控制寄存器为读模式,再检查状态寄存器,如果准备就绪,则从数据寄存器中读出,然后退出。李工所选用的处理器对应的I2C控制寄存器、数据寄存器、状态寄存器各自的定义如表2表3和表4所示。

    
【正确答案】 (1)*pdata=I2C_DATA (2)0x8003 (3)I2C_DATA=wdata (4)I2C_STAT&Ox80
【答案解析】    本问题考查I2C设备的读写操作过程,要求考生能够正确的根据给出的寄存器,以及对应的逻辑要求,补全相关代码。

     对I2C的操作过程实际上就是对外部设备的操作过程。这里的I2C读写函数只是给出了原子性的读写实现方法,至于操作哪类I2C设备,即读、写哪个I2C设备的哪些地址,这需要在外部逻辑实现中考虑。

     在I2C的读操作中,其逻辑过程为从I2C_DATA寄存器中获取准备好的I2C数据,其核心在于等待I2C控制寄存器准备好数据,实现方法为查询对应的状态寄存器的某个比特位。同时,在读操作中,需要首先将I2C控制寄存器修改为读控制状态。

     在I2C的写操作中,逻辑过程为:先将I2C控制寄存器配置为写控制状态,将要写出的数据写到I2C_DATA寄存器中,然后等待写完毕,等待的方法为查询寄存器状态,待状态表明写完毕后,此次写操作才算完成。