sc网卡接口扩展.docx
27页精品名师归纳总结s3c2440供应了一个摄像接口,使开发人员很简单的实现摄像、照相等功 能摄像接口包括 8 位来自摄像头的输入数据信号,一个输出主时钟信号,三个来自摄像头的输入同步时钟信号和一个输出复位信号摄像接口的主时钟信 号由 USB PLL 产生,它的频率为 96MHz ,再经过分频处理后输出给摄像头, 摄像头再依据该时钟信号产生三个同步时钟信号(像素时钟、帧同步时钟和行 同步时钟),反过来再输入回 s3c2440s3c2440仅仅供应了一个摄像接口,因此要实现其功能,仍需要摄像头在 这里,我们使用 OV9650OV9650 内部有大量的寄存器需要配置,这就需要另外的数据接口 OV9650 的数据接口称为 SCCB(串行摄像掌握总线),它由两条数据线组成:一个是用于传输时钟信号的 SIO_C,另一个是用于传输数据信号的 SIO_DSCCB 的传输协议与 IIC 的极其相像,只不过 IIC 在每传输完一个字节后,接收数据的一方要发送一位的确认数据,而 SCCB 一次要传输 9 位数据,前 8 位为有用数据,而第 9 位数据在写周期中是 Don’-tCare 位(即不必关怀位),在读周期中是 NA 位。
SCCB定义数据传输的基本单元为相( phase),即一个相传输一个字节数据 SCCB 只包括三种传输周期,即 3 相写传输周期(三个相依次为设备从的址,内存的址,所写数据), 2 相写传输周期(两个相依次为设备从的址,内存的址)和 2 相读传输周期(两个相依次为设备从的址,所读数据)当需要写操作时,应用 3 相写传输周期,当需要读操作时,依次应用 2 相写传输周期和 2 相读传输周期因此 SCCB 一次只能读或写一个字节下面我们就用 s3c2440的 IIC 总线接口分别与 OV9650 的SIO_C 和 SIO_D 相连接来实现 SCCB 的功能具体的读、写函数为://配置 IIC 接口rGPEUP = 0xc000 //上拉无效rGPECON = 0xa0000000 //GPE15:IICSDA , GPE14: IICSCL//IIC 中断void irq IicISR〔void〕{rSRCPND |= 0x1<<27rINTPND |= 0x1<<27 flag = 0}可编辑资料 -- -- -- 欢迎下载精品名师归纳总结//写操作//输入参数分别为要写入的内存的址和数据void Wr_SCCB〔unsigned char wordAddr, unsigned char data〕{//3 相写传输周期//写 OV9650 设备从的址字节flag =1。
rIICDS =0x60 //OV9650 设备从的址为 0x60rIICSTAT = 0xf0 rIICCON &= ~0x10 while〔flag == 1〕 delay〔100〕//写 OV9650 内存的址字节flag = 1rIICDS = wordAddr rIICCON &= ~0x10 while〔flag〕delay〔100〕//写具体的数据字节flag = 1rIICDS = datarIICCON &= ~0x10 while〔flag〕delay〔100〕rIICSTAT = 0xd0 //停止位rIICCON = 0xe3 //为下一次数据传输做预备delay〔100〕}//读操作可编辑资料 -- -- -- 欢迎下载精品名师归纳总结//参数分别为要读取的内存的址和数据void Rd_SCCB 〔unsigned char wordAddr,unsigned char *data〕{unsigned char temp//2 相写传输周期//写入 OV9650 设备从的址字节flag =1rIICDS = 0x60rIICSTAT = 0xf0 。
rIICCON &= ~0x10 while〔flag〕delay〔100〕//写入内存的址字节flag = 1rIICDS = wordAddr rIICCON &= ~0x10 while〔flag〕delay〔100〕rIICSTAT = 0xd0 //停止位rIICCON = 0xe3 //为下一次数据传输做预备delay〔100〕//2 相读传输周期//写入 OV9650 设备从的址字节flag = 1rIICDS = 0x60rIICSTAT = 0xb0 rIICCON &= ~0x10 while 〔flag〕delay〔100〕可编辑资料 -- -- -- 欢迎下载精品名师归纳总结//读取一个无用字节flag = 1temp = rIICDSrIICCON &= ~〔〔1<<7〕|〔1<<4〕〕 while〔flag〕delay〔100〕//读取数据flag = 1data= rIICDSrIICCON &= ~〔〔1<<7〕|〔1<<4〕〕 while〔flag〕delay〔100〕rIICSTAT = 0x90 //停止位rIICCON = 0xe3。
//为下一次传输做预备delay〔100〕}当然我们也可以用两个通用 IO 口来模拟 SCCB总线,下面我们给出具体的程序,其中 GPE15 为 SIO_D,GPE14 为 SIO_Cdefine CLOCK_LOW〔〕 〔rGPEDAT&=〔~〔1<<14〕〕〕 // 时钟信号低#define CLOCK_HIGH〔〕 〔rGPEDAT|=〔1<<14〕〕 // 时钟信号高#define DATA_LOW〔〕 〔rGPEDAT&=〔~〔1<<15〕〕〕 // 数据信号低#define DATA_HIGH〔〕 〔rGPEDAT|=〔1<<15〕〕 // 数据信号高//配置 IOrGPEUP = 0xc000 //上拉无效rGPECON = 5<<28 //GPE15为 SIO_D,GPE14为 SIO_C,都为输出void delay〔int a〕{int k可编辑资料 -- -- -- 欢迎下载精品名师归纳总结for〔k=0k++〕}//启动 SCCBvoid inline SCCB_start〔void〕{CLOCK_HIGH〔〕 DATA_HIGH〔〕 。
delay〔10〕DATA_LOW〔〕 delay〔10〕CLOCK_LOW〔〕 delay〔10〕}//终止 SCCBvoid inline SCCB_end〔void〕{DATA_LOW〔〕 delay〔10〕CLOCK_HIGH〔〕 delay〔10〕DATA_HIGH〔〕 delay〔10〕}//SCCB 发送一个字节void inline SCCB_sendbyte〔unsigned char data〕{int i=0//并行数据转串行输出,串行数据输出的次序为先高位再低位for〔i=0i++〕{if〔data & 0x80〕可编辑资料 -- -- -- 欢迎下载精品名师归纳总结elseDATA_HIGH〔〕 DATA_LOW〔〕 可编辑资料 -- -- -- 欢迎下载精品名师归纳总结delay〔10〕CLOCK_HIGH〔〕 delay〔10〕CLOCK_LOW〔〕 delay〔10〕DATA_LOW〔〕 delay〔10〕data <<= 1}//第 9 位, Don’ t Care DATA_HIGH〔〕 delay〔10〕CLOCK_HIGH〔〕 。
delay〔10〕CLOCK_LOW〔〕 delay〔10〕}// SCCB 接收一个字节void inline SCCB_receivebyte〔unsigned char *data〕{int i=0int svalue=0int pvalue = 0rGPECON = 1<<28 //把 GPE15输出转变为输入//串行数据转并行输入,高位在前for〔i=7 i>=0i--〕可编辑资料 -- -- -- 欢迎下载精品名师归纳总结{CLOCK_HIGH〔〕 delay〔10〕svalue = rGPEDAT>>15CLOCK_LOW〔〕 delay〔10〕pvalue |= svalue <
//启动 SCCB可编辑资料 -- -- -- 欢迎下载精品名师归纳总结SCCB_sendbyte〔0x60〕 SCCB_sendbyte〔subaddr〕 SCCB_sendbyte〔data〕//OV9650 设备从的址,写操作//设备内存的址//写数据字节可编辑资料 -- -- -- 欢迎下载精品名师归纳总结SCCB_end〔〕 /结/ 束 SCCBdelay〔20〕}可编辑资料 -- -- -- 欢迎下载精品名师归纳总结//读操作unsigned char SCCB_receivedata〔unsigned char subaddr〕{unsigned char temp//2 相写传输周期SCCB_start〔〕 //启动 SCCB可编辑资料 -- -- -- 欢迎下载精品名师归纳总结SCCB_sendbyte〔0x60〕 SCCB_sendbyte〔subaddr〕//OV9650 设备从的址,写操作//设备内存的址可编辑资料 -- -- -- 欢迎下载精品名师归纳总结SCCB_end〔〕 /结/ 束 SCCB//2 相读传输周期SCCB_start〔〕。
//启动 SCCBSCCB_sendbyte〔0x61〕 //OV9650 设备从的址,读操作SCCB_receivebyte〔&temp〕 //读字节SCCB_end〔〕 /结/ 束 SCCBreturn temp。





