sc网卡接口扩展Word文档下载推荐.docx
- 文档编号:18829834
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:22
- 大小:22.33KB
sc网卡接口扩展Word文档下载推荐.docx
《sc网卡接口扩展Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《sc网卡接口扩展Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
IICSDA,GPE14:
IICSCL
//IIC中断
void__irqIicISR(void)
{
rSRCPND|=0x1<
<
27。
rINTPND|=0x1<
flag=0。
}
//写操作
//输入参数分别为要写入的内存地址和数据
voidWr_SCCB(unsignedcharwordAddr,unsignedchardata)
//3相写传输周期
//写OV9650设备从地址字节
flag=1。
rIICDS=0x60。
//OV9650设备从地址为0x60
rIICSTAT=0xf0。
rIICCON&
=~0x10。
while(flag==1)
delay(100)。
//写OV9650内存地址字节
flag=1。
rIICDS=wordAddr。
while(flag)
//写具体的数据字节
rIICDS=data。
rIICSTAT=0xd0。
//停止位
rIICCON=0xe3。
//为下一次数据传输做准备
//读操作
//参数分别为要读取的内存地址和数据
voidRd_SCCB(unsignedcharwordAddr,unsignedchar*data)
unsignedchartemp。
//2相写传输周期
//写入OV9650设备从地址字节
rIICDS=0x60。
//写入内存地址字节
//2相读传输周期
rIICSTAT=0xb0。
while(flag)
//读取一个无用字节
temp=rIICDS。
=~((1<
7)|(1<
4))。
//读取数据
*data=rIICDS。
rIICSTAT=0x90。
//为下一次传输做准备
当然我们也可以用两个通用IO口来模拟SCCB总线,下面我们给出具体的程序,其中GPE15为SIO_D,GPE14为SIO_C。
#defineCLOCK_LOW()
(rGPEDAT&
=(~(1<
14)))
//时钟信号低
#defineCLOCK_HIGH()
(rGPEDAT|=(1<
14))
//时钟信号高
#defineDATA_LOW()
15)))
//数据信号低
#defineDATA_HIGH()
15))
//数据信号高
//配置IO
rGPECON=5<
28。
//GPE15为SIO_D,GPE14为SIO_C,都为输出
voiddelay(inta)
intk。
for(k=0。
k<
a。
k++)
。
//启动SCCB
void__inlineSCCB_start(void)
CLOCK_HIGH()。
DATA_HIGH()。
delay(10)。
DATA_LOW()。
CLOCK_LOW()。
//结束SCCB
void__inlineSCCB_end(void)
//SCCB发送一个字节
void__inlineSCCB_sendbyte(unsignedchardata)
inti=0。
//并行数据转串行输出,串行数据输出的顺序为先高位再低位
for(i=0。
i<
8。
i++)
if(data&
0x80)
else
data<
=1。
//第9位,Don’tCare
//SCCB接收一个字节
void__inlineSCCB_receivebyte(unsignedchar*data)
intsvalue=0。
intpvalue=0。
rGPECON=1<
//把GPE15输出改变为输入
//串行数据转并行输入,高位在前
for(i=7。
i>
=0。
i--)
svalue=rGPEDAT>
>
15。
pvalue|=svalue<
i。
rGPECON=5<
//再把GPE15改回为输出
//第9位,N.A.
*data=pvalue&
0xff。
voidSCCB_senddata(unsignedcharsubaddr,unsignedchardata)
SCCB_start()。
SCCB_sendbyte(0x60)。
//OV9650设备从地址,写操作
SCCB_sendbyte(subaddr)。
//设备内存地址
SCCB_sendbyte(data)。
//写数据字节
SCCB_end()。
delay(20)。
unsignedcharSCCB_receivedata(unsignedcharsubaddr)
SCCB_sendbyte(0x61)。
//OV9650设备从地址,读操作
SCCB_receivebyte(&
temp)。
//读字节
returntemp。
OV9650的寄存器较多,要想配置好这些寄存器是需要花费一些精力的。
下面数组给出了一个VGA(640×
480)模式下YUV彩色空间的配置例子,括号内第一个元素表示寄存器地址,第二个元素表示要写入的数据。
constunsignedcharov9650_register[][2]={
{0x11,0x80},{0x6a,0x3e},{0x3b,0x09},{0x13,0xe0},{0x01,0x80},{0x02,0x80},{0x00,0x00},{0x10,0x00},
{0x13,0xe5},{0x39,0x43},{0x38,0x12},{0x37,0x00},{0x35,0x91},{0x0e,0xa0},{0x1e,0x04},{0xA8,0x80},
{0x12,0x40},{0x04,0x00},{0x0c,0x04},{0x0d,0x80},{0x18,0xc6},{0x17,0x26},{0x32,0xad},{0x03,0x00},
{0x1a,0x3d},{0x19,0x01},{0x3f,0xa6},{0x14,0x2e},{0x15,0x10},{0x41,0x02},{0x42,0x08},{0x1b,0x00},
{0x16,0x06},{0x33,0xe2},{0x34,0xbf},{0x96,0x04},{0x3a,0x00},{0x8e,0x00},{0x3c,0x77},{0x8B,0x06},
{0x94,0x88},{0x95,0x88},{0x40,0xc1},{0x29,0x3f},{0x0f,0x42},{0x3d,0x92},{0x69,0x40},{0x5C,0xb9},
{0x5D,0x96},{0x5E,0x10},{0x59,0xc0},{0x5A,0xaf},{0x5B,0x55},{0x43,0xf0},{0x44,0x10},{0x45,0x68},
{0x46,0x96},{0x47,0x60},{0x48,0x80},{0x5F,0xe0},{0x60,0x8c},{0x61,0x20},{0xa5,0xd9},{0xa4,0x74},
{0x8d,0x02},{0x13,0xe7},{0x4f,0x3a},{0x50,0x3d},{0x51,0x03},{0x52,0x12},{0x53,0x26},{0x54,0x38},
{0x55,0x40},{0x56,0x40},{0x57,0x40},{0x58,0x0d},{0x8C,0x23},{0x3E,0x02},{0xa9,0xb8},{0xaa,0x92},
{0xab,0x0a},{0x8f,0xdf},{0x90,0x00},{0x91,0x00},{0x9f,0x00},{0xa0,0x00},{0x3A,0x01},{0x24,0x70},
{0x25,0x64},{0x26,0xc3},{0x2a,0x00},{0x2b,0x00},{0x6c,0x40},{0x6d,0x30},{0x6e,0x4b},{0x6f,0x60},
{0x70,0x70},{0x71,0x70},{0x72,0x70},{0x73,0x70},{0x74,0x60},{0x75,0x60},{0x76,0x50},{0x77,0x48},
{0x78,0x3a},{0x79,0x2e},{0x7a,0x28},{0x7b,0x22},{0x7c,0x04},{0x7d,0x07},{0x7e,0x10},{0x7f,0x28},
{0x80,0x36},{0x81,0x44},{0x82,0x52},{0x83,0x60},{0x84,0x6c},{0x85,0x78},{0x86,0x8c},{0x87,0x9e},
{0x88,0xbb},{0x89,0xd2},{0x8a,0xe6},
}。
另外OV9650有两个只读寄存器——0x1C和0x1D,用于存放厂家ID,数据分别为0x7F和0xA2,我们可以通过读取它们来判断s3c2440是否连接了OV9650。
当确认连接了OV9650后,我们就可以把上面的那个数组写入OV9650内,如下所示。
在这里我们总是认为s3c2440连接了OV9650。
voidconfig_ov9650(void)
inti。
//读取OV9650厂商ID
i=1。
while(i)
temp=SCCB_receivedata(0x1C)。
//或Rd_SCCB(0x1C,&
if(temp==0x7F)
i=0。
temp=SCCB_receivedata(0x1D)。
//或Rd_SCCB(0x1D,&
if(temp==0xA2)
//复位所有OV9650寄存器
SCCB_senddata(0x12,0x80)。
//或Wr_SCCB(0x12,0x80)。
delay(10000)。
//配置OV9650寄存器
((sizeof(ov9650_register))/2)。
SCCB_senddata(ov9650_register[i][0],ov9650_register[i][1])。
//或Wr_SCCB(ov9650_register[i][0],ov9650_register[i][1])。
上面程序中,我们是用循环语句读取OV9650的寄存器0x1C和0x1D的,之所以这样,是为了防止只读取一次时,会有读取不正确的现象发生。
而一旦正确读取了厂商ID信息,再读写OV9650寄存器,一般就不会发生读写的错误。
下面就介绍s3c2440摄像接口的相关配置。
摄像接口有两个相互独立的DMA通道——P通道(预览通道)和C通道(编解码通道)。
P通道主要是存储用于视频显示的RGB图像数据,C通道主要是存储用于编解码的YCbCr图像数据。
在这里我们主要是把OV9650采集到的视频信息实时显示在LCD上,因此只介绍P通道的用法。
设置s3c2440摄像接口一个很重要的步骤就是设置视频尺寸大小。
我们把由OV9650采集到的视频尺寸称为源,即源水平尺寸和源垂直尺寸,其中源水平尺寸必须是8的整数倍。
这个尺寸是通过配置OV9650的相关寄存器实现的。
我们把这两个值分别放入输入源格式寄存器CISRCFMT的第16位至第28位,和第0位至第12位内,例如通过OV9650,采集的到的视频尺寸为640×
480,则把640和480分别放入寄存器CISRCFMT中的相应位置即可。
我们把实际显示的视频尺寸称为目标,即目标水平尺寸和目标垂直尺寸,这里这个尺寸就是LCD的尺寸。
我们把这两个值分别放入预览DMA目标图像格式寄存器CIPRTRGFMT的第16位至第28位,和第0位至第12位内,例如LCD的尺寸为320×
240,则把320和240分别放入寄存器CIPRTRGFMT中的相应位置即可。
另外还需要把这两个值的乘积放入预览缩放目标面积寄存器CIPRTAREA内。
源尺寸和目标尺寸往往是不一样大小的,那么可能还需要设置偏移量,即水平偏移量和垂直偏移量,应该把这两个值分别放入窗口偏移寄存器CIWDOFST的第16位至第26位,和第0位至第10位内,其中这个寄存器的第31位用于控制是否需要设置偏移量,当偏移量为0或不需要设置偏移量时,这一位应为0,否则为1。
显然,通过源尺寸、目标尺寸和偏移量的设置,可以实现被摄像物体的缩放效果。
当然,要实现这种缩放效果,还需要配置预览预缩放比例控制寄存器CIPRSCPRERATIO、预览预缩放距离格式寄
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sc 网卡 接口 扩展