再议IIC协议与设计【3】 --SCCB总线介绍

SCCB (Serial Camera Control Bus) 是由OmniVision公司所定义的串行相机控制总线。用于控制OmniVision公司生产的Camera Sensor。本文通过对SCCB总线进行粗略的描述,并完成使用Xilinx的KC705中Microblaze完成对相机OV4689的配置。


第一部分 SCCB总线介绍


1. 总线描述

SCCB总线是的标准定义是一个3-wire制的串行总线(如图1),在实际的应用中,为了适应更小封装的sensor尺寸,现在的相机,一般情况下都使用2-wire来代替3-wire SCCB总线,其中SCCB_E信号被舍弃。在下面的描述中,我们就直接对2-wire串行总线进行描述。


再议IIC协议与设计【3】 --SCCB总线介绍_第1张图片

图 1 SCCB 3-wire


需要说明的是,Camera Sensor在实际的通信传输中,只能作为从机来使用。并且2-wire的SCCB在实际的通信中,与IIC总线有很大的相似度。唯一不同的是SCCB在数据传输的过程中,在第9个SCL周期中的定义与IIC总线不同。


2. 总线信号定义


SIO_C

SIO_C信号是由主设备驱动的,是单向,高电平有效的控制信号。它表示了每一个传输位。在总线空闲时,主设备必须驱动SIO_C为1。在传输开始之后,SIO_C被驱动为逻辑0时,数据开始传输。在数据传输期间,SIO_C的逻辑1指示单个发送位。因此,只有当SIO_C被驱动为0时,SIO_D才能发生变化。单个发送位的周期被定义为tcyc,tcyc的最小值为10us.即时钟频率大于等于100KHz。可以看到,SIO_C信号与IIC的SCL信号是完全相同的。

 

SIO_D

SIO_D信号是双向数据信号,可以由主设备或从设备来驱动。当总线空闲时,它保持浮动或者处于三态。信号的保持是由主设备和从设备共同来决定的。这与IIC的SDA比较类似。不过需要说明的是,“处于浮动或者三态”这是在3-wire中的定义,当我们在使用2-wire的时候,为了与IIC的SDA线保持一致,将SIO_D在空闲时的状态定义为逻辑1.


3. SCCB传输方式


注意 : 以下讨论主要针对于Camera Sensor 的 Register Address为8bit,16bit在后面的部分介绍

一个基本的数据传输元素被成为一个phase。SCCB所定义的传输方式分为以下三种:

  • 3-phase写传输周期
  • 2-phase写传输周期
  • 2-phase读传输周期


3.1 传输周期


一个pahse包含总共9bit,9bit是由8bit有序的数据传输和第9bit组成(如图2)。第9bit被称之为Don`t-Care位或者一个NA位(注意这与IIC不同)。这取决于数据的传输操作是写(write)还是读(read).在一个传输中包含的最大phase数为3个。每个phase中先发送MSB。

再议IIC协议与设计【3】 --SCCB总线介绍_第2张图片

图 2 Transmission Phase


3.2 3phase写传输周期


3-phase写传输周期是一个完全的写周期,主机可以将一个字节的数据写入到特定的从设备中。IDaddress表示主设备将要访问的特定的从设备。sub-address表示从设备的寄存器地址,写入的数据包含一个8bit的主机要发送给从机目标地址的数据。这3个phase的第9bit是Don`t-Case bit.

再议IIC协议与设计【3】 --SCCB总线介绍_第3张图片

图 3 3-phase write


3.3 2phase写传输周期


2-phase写传输周期之后是2-phase读传输周期。发出2-phase写传输周期的目的是用于主设备来从特定的从设备的特定子地址处为接下来的2-phase读传输周期确定地址。2-phase写传输的第9bit为Don`t-Care bit。

再议IIC协议与设计【3】 --SCCB总线介绍_第4张图片

图 4 2-phase write


3.4 2phase读传输周期


在2-phase读传输周期之前必须有3-phase或2-phase写传输周期。2-phase读传输周期不识别sub-address。2-phase写传输周期包含8bit读取数据和第9位Don`t-Care bit 或者NA bit。主机必须以逻辑1来驱动NA bit。

再议IIC协议与设计【3】 --SCCB总线介绍_第5张图片

图 5 2-phase read


3.5 phase中bit9解释


3.5.1 Phase1—ID address

Phase 的bit9 必须是Don`t-Care bit或者NA bit. SIO_D_OE_M_和SIO_D_OE_S_分别是主器件和从设备的内部低有效的IO信号(如图6)。SIO_D_OE_S_事件发生在SIO_D_OE_M_的转换之前。主机声明ID address,但不需要声明第9bit,主机必须在Don`t-Care bit期间屏蔽SIO_D的输入,并强制输入为0以避免传输未知的总线状态。主机持续声明接下来的phases,无论从机是否对bit9(Don`t-Care)进行相应。

SIO_D_OE_S_由从机来控制,并且保持其状态为逻辑1或者驱动其为逻辑0.在Don`t-Care bit的传输期间,总线可以处于浮动状态或者竞争状态(2-wire定义为逻辑1)。在这种情况下,从机的责任是避免传输未知的总线状态。

再议IIC协议与设计【3】 --SCCB总线介绍_第6张图片

图 6 Phase 1 SIO_D bit9


3.5.2 Phase 2 –sub-address/Read Data

主机或者从机可以声明一个phase 2传输,由主机声明的phase 2传输用来确定主机需要访问的从设备的子地址。由从机声明的phase 2指示主机将接受的读取数据。根据先前的3-phase或2-phase写入传输周期,从机识别该读取数据的子地址(sub-address)。

当主机声明2-phase时,bit9被定义为Don`t-Care bit,SIO_D_OE_M_和SIO_D_OE_S_与图6中的定义相同,详细时序见下图7:

再议IIC协议与设计【3】 --SCCB总线介绍_第7张图片

图 7 Phase 2 bit 9 (Write)


当从设备声明phase 2 传输时,bit9被定义为一个NA bit,SIO_D_OE_M_从phase1的bit 9被取消置位并被重新置位为NA bit。在NA bit期间,主机以逻辑1来驱动SIO_D。同时,SIO_D_OE_S_被声明。所选择的从设备负责在读取数据周期期间驱动SIO_D。由于NA bit周期内在SIO_D_OE_M_有效之前SIO_D_OE_S_变为无效,当主器件试图驱动NA bit,就会发生SIO_D的总线浮动,具体时序见下图8:

再议IIC协议与设计【3】 --SCCB总线介绍_第8张图片

图 8 Phase 2 bit 9 (Read)


3.5.3 phase 3 – write data

只有主设备可以声明phase 3传输。phase 3传输包括主机实际打算写给从机的数据。phase3传输的bit9被定义为Don`t-Care bit,由主设备声明。SIO_D_OE_M_ 和SIO_D_OE_S_与phase 1传输中的定义相同,如图6.


3.5.4 Don`t-Care Bit

Don`t-Care bit是由主设备发送传输(ID Address, sub-address, write data)的第9bit.主机将继续声明传输phases直到传输周期完成。主机还假设在数据传输期间没有发生传输错误,Don`t-Care bit的目的是指示传输的完成。所以,主机是不会检测传输的数据是不是在传输的过程中发生了错误,这与IIC总线是相同的。

当总线上有多个从设备时,从设备可以通过两种方式来影响Don`t-Care bit。如果从机1被选择并且要将数据写入该特定从机,则从机1将驱动SIO_D的Don`t-Care bit为逻辑0。在这种情况下,SIO_D信号在Don`t-Care bit的开始可能会发生冲突,而可能在Don`t-Care bit的末尾浮动。或者,从机可能不会响应当前phase的Don`t-Care bit,SIO_D总线在整个Don`t-Care bit保持浮动。在2-wire中,可以保持为1.

主机不会对数据传输进行错误检查。从机将会记录Don`t-Care bit的状态到内部寄存器,例如:一个从设备定义了一个1字节的寄存器为Don`t-Care状态寄存器,并且该寄存器的default值为0xFF,假设在数据的传输过程中没有发生错误。寄存器的值将保持不会改变。如果从机没有接受到Don`t-Care bit,寄存器的值将会变成0xFE。(通过这种设计方法,可以检测SCCB传输的过程中,是不是发生了数据传输的错误,这个方法同样也适用于IIC总线。)主机查询Don`t-Care状态寄存器以检测在数据传输过程中是否发生了错误。主机将向目标从设备的Don`t-Care状态寄存器发出额外的读取传输,以检测该值。

虽然在以上的讨论中,我们知道可以通过这种方式检测到数据传输过程中是否发生了错误传输。但是在实际的设计中,不推荐这样的方法。为了代码的重用性,推荐直接使用IIC控制程序来实现SCCB传输,一般可以将数据写入,然后再读出来以验证是否发生数据读写错误。


以上部分主要为比较早的版本的SCCB协议的翻译,以下是sub-Address,即Sensor的Register Address为16bit的读写时序。请在设计的时候主要参考此部分设计。


第二部分 OV4689的时序

4 OV4689读写时序


4.1 数据传输类型

message type : 7-bit Slave Address  16-bit Sub-Address, 8-bit Data

 再议IIC协议与设计【3】 --SCCB总线介绍_第9张图片

图 9 信号类型


4.2 读写操作

OV4689支持四种不同类型的读操作和两种不同类型的写操作,但常用的读写操作之需要考虑以下几种

再议IIC协议与设计【3】 --SCCB总线介绍_第10张图片

图 10 SCCB读写时序


附:OV4689 1080p 30Hz 2-Lane寄存器配置表

// RES_1920x1080_30fps_1008Mbps
// input extclk 27MHz
100 99 1920 1080
102 3601 bb8

0x0103 0x01; 0x3638 0x00; 
0x0300 0x00; 0x0301 0x00; 0x0302 0x21; 0x0303 0x00; 0x0304 0x03; 0x030a 0x00; 0x030b 0x00; 0x030c 0x00; 0x030d 0x28; 0x030e 0x00; 
0x030f 0x08; 0x0311 0x00; 0x0312 0x01; 0x031e 0x00; 0x3000 0x20; 0x3002 0x00; 0x3018 0x32; 0x3019 0x0c; 0x3020 0x93; 0x3021 0x03; 
0x3022 0x01; 0x3031 0x0a; 0x303f 0x0c;
0x3305 0xf1; 0x3307 0x04; 0x3309 0x29; 0x3500 0x00; 0x3501 0x4c; 0x3502 0x00; 0x3503 0x04; 0x3504 0x00; 0x3505 0x00; 0x3506 0x00; 
0x3507 0x00; 0x3508 0x00; 0x3509 0x80; 0x350a 0x00; 0x350b 0x00; 0x350c 0x00; 0x350d 0x00; 0x350e 0x00; 0x350f 0x80; 0x3510 0x00; 
0x3511 0x00; 0x3512 0x00; 0x3513 0x00; 0x3514 0x00; 0x3515 0x80; 0x3516 0x00; 0x3517 0x00; 0x3518 0x00; 0x3519 0x00; 0x351a 0x00; 
0x351b 0x80; 0x351c 0x00; 0x351d 0x00; 0x351e 0x00; 0x351f 0x00; 0x3520 0x00; 0x3521 0x80; 0x3522 0x08; 0x3524 0x08; 0x3526 0x08; 
0x3528 0x08; 0x352a 0x08; 0x3602 0x00; 0x3603 0x40; 0x3604 0x02; 0x3605 0x00; 0x3606 0x00; 0x3607 0x00; 0x3609 0x12; 0x360a 0x40; 
0x360c 0x08; 0x360f 0xe5; 0x3608 0x8f; 0x3611 0x00; 0x3613 0xf7; 0x3616 0x58; 0x3619 0x99; 0x361b 0x60; 0x361c 0x7a; 0x361e 0x79; 
0x361f 0x02; 0x3632 0x00; 0x3633 0x10; 0x3634 0x10; 0x3635 0x10; 0x3636 0x15; 0x3646 0x86; 0x364a 0x0b; 0x3700 0x17; 0x3701 0x22; 
0x3703 0x10; 0x370a 0x37; 0x3705 0x00; 0x3706 0x63; 0x3709 0x3c; 0x370b 0x01; 0x370c 0x30; 0x3710 0x24; 0x3711 0x0c; 0x3716 0x00; 
0x3720 0x28; 0x3729 0x7b; 0x372a 0x84; 0x372b 0xbd; 0x372c 0xbc; 0x372e 0x52; 0x373c 0x0e; 0x373e 0x33; 0x3743 0x10; 0x3744 0x88; 
0x3745 0xc0; 0x374a 0x43; 0x374c 0x00; 0x374e 0x23; 0x3751 0x7b; 0x3752 0x84; 0x3753 0xbd; 0x3754 0xbc; 0x3756 0x52; 0x375c 0x00; 
0x3760 0x00; 0x3761 0x00; 0x3762 0x00; 0x3763 0x00; 0x3764 0x00; 0x3767 0x04; 0x3768 0x04; 0x3769 0x08; 0x376a 0x08; 0x376b 0x20; 
0x376c 0x00; 0x376d 0x00; 0x376e 0x00; 0x3773 0x00; 0x3774 0x51; 0x3776 0xbd; 0x3777 0xbd; 0x3781 0x18; 0x3783 0x25; 0x3798 0x1b; 
0x3800 0x01; 0x3801 0x88; 0x3802 0x00; 0x3803 0xe0; 0x3804 0x09; 0x3805 0x17; 0x3806 0x05; 0x3807 0x1f; 0x3808 0x07; 0x3809 0x80; 
0x380a 0x04; 0x380b 0x38; 0x380c 0x06; 0x380d 0xb8; 0x380e 0x09; 0x380f 0x14; 0x3810 0x00; 0x3811 0x08; 0x3812 0x00; 0x3813 0x04; 
0x3814 0x01; 0x3815 0x01; 0x3819 0x01; 0x3820 0x00; 0x3821 0x06; 0x3829 0x00; 0x382a 0x01; 0x382b 0x01; 0x382d 0x7f; 0x3830 0x04; 
0x3836 0x01; 0x3837 0x00; 0x3841 0x02; 0x3846 0x08; 0x3847 0x07; 0x3d85 0x36; 0x3d8c 0x71; 0x3d8d 0xcb; 0x3f0a 0x00; 0x4000 0xf1; 
0x4001 0x40; 0x4002 0x04; 0x4003 0x14; 0x400e 0x00; 0x4011 0x00; 0x401a 0x00; 0x401b 0x00; 0x401c 0x00; 0x401d 0x00; 0x401f 0x00; 
0x4020 0x00; 0x4021 0x10; 0x4022 0x06; 0x4023 0x13; 0x4024 0x07; 0x4025 0x40; 0x4026 0x07; 0x4027 0x50; 0x4028 0x00; 0x4029 0x02; 
0x402a 0x06; 0x402b 0x04; 0x402c 0x02; 0x402d 0x02; 0x402e 0x0e; 0x402f 0x04; 0x4302 0xff; 0x4303 0xff; 0x4304 0x00; 0x4305 0x00; 
0x4306 0x00; 0x4308 0x02; 0x4500 0x6c; 0x4501 0xc4; 0x4502 0x40; 0x4503 0x01; 0x4601 0x77; 0x4800 0x04; 0x4813 0x08; 0x481f 0x40; 
0x4829 0x78; 0x4837 0x10; 0x4b00 0x2a; 0x4b0d 0x00; 0x4d00 0x04; 0x4d01 0x42; 0x4d02 0xd1; 0x4d03 0x93; 0x4d04 0xf5; 0x4d05 0xc1; 
0x5000 0xf3; 0x5001 0x11; 0x5004 0x00; 0x500a 0x00; 0x500b 0x00; 0x5032 0x00; 0x5040 0x00; 0x5050 0x0c; 0x5500 0x00; 0x5501 0x10; 
0x5502 0x01; 0x5503 0x0f; 0x8000 0x00; 0x8001 0x00; 0x8002 0x00; 0x8003 0x00; 0x8004 0x00; 0x8005 0x00; 0x8006 0x00; 0x8007 0x00; 
0x8008 0x00; 
0x3638 0x00; 
0x0100 0x01


以上部分,SCCB总线介绍完毕。下篇文章主要介绍基于KC705的Microblaze软核的SCCB设计。

你可能感兴趣的:(Interface)