精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

EMIO方式模擬SCCB時序進行讀寫操作詳解

Hx ? 作者:工程師陳翠 ? 2018-06-29 10:32 ? 次閱讀

一、SCCB介紹

SCCB是OmniVision Serial Camera Control Bus的簡稱,即OV公司的串行攝像機控制總線。OV公司定義的SCCB是一個3線結構,但是,為了縮減Sensorpin封裝,SCCB大多采用2線方式。

開始傳輸數據

EMIO方式模擬SCCB時序進行讀寫操作詳解

結束數據傳輸

EMIO方式模擬SCCB時序進行讀寫操作詳解

傳輸規則

一個基本傳輸單元稱作一個相

一個相包含總共9比特,前8比特為數據,第9比特為 Don‘t-Care bit 不關心比特,該第9比特的數據取決于

傳輸任務是讀還是寫。一個傳輸任務的最大相個數是3

EMIO方式模擬SCCB時序進行讀寫操作詳解

3相寫傳輸規則

提供些傳輸,主機能將1byte數據寫至指定從機

EMIO方式模擬SCCB時序進行讀寫操作詳解

ID Address表示指定從機的地址

Sub-address表示從機的寄存器

后面是數據,1字節數據

3個相為后一位都是Don’t-Care bits

2相寫傳輸規則

EMIO方式模擬SCCB時序進行讀寫操作詳解

2相寫傳送是在2相讀傳送前的,它的目的是指明主機要從哪個從機的哪個寄存器讀數據。

2相讀傳輸規則

EMIO方式模擬SCCB時序進行讀寫操作詳解

在2相讀前面必須有2相寫或者3相寫,否則2相讀沒有辦法讀出哪個寄存器發的數據,主機必須將NA bit置為1(否則OV攝像頭會把SIOD拉低)

“X”表示Don‘t-Care bit。意思是Master可以不關注此bit。從OV給的手冊來看,Slave也可以驅動此bit為低,然后Master來確認響應。當然,Master也可以不關注。在SCCB手冊中,這部分說的比較含糊,所以,簡單來說,在SCCB中,Master不關注是否傳輸數據有錯誤發生。說實話,為了所做的設計可靠,還是應該關注的。

二、EMIO介紹

zynq的GPIO,分為兩種,MIO(multiuse I/O)和EMIO(extendable multiuse I/O)

EMIO方式模擬SCCB時序進行讀寫操作詳解

MIO分配在bank0和bank1直接與PS部分相連,EMIO分配在bank2和接和PL部分相連。除了bank1是22-bit之外,其他的bank都是32-bit。所以MIO有53個引腳可供我們使用,而EMIO有64個引腳可供我們使用。

使用EMIO的好處就,當MIO不夠用時,PS可以通過驅動EMIO控制PL部分的引腳,接下來就來詳細介紹下EMIO的使用。

EMIO的使用和MIO的使用其實是非常相似的。區別在于,EMIO的使用相當于,是一個PS + PL的結合使用的例子。所以,EMIO需要分配引腳,以及編譯綜合生成bit文件。

三、例子

1、新建vivado 工程,create一個block design,添加zynq PS核

EMIO方式模擬SCCB時序進行讀寫操作詳解

2、運行自動連接

EMIO方式模擬SCCB時序進行讀寫操作詳解

3、雙擊PS IP進行配置,增加三個EMIO,其中兩個是SCCB的數據和時鐘,另外一個拿來做復位

EMIO方式模擬SCCB時序進行讀寫操作詳解

4、把新增的EMIO連接出來,并把時鐘接好

5、增加一個clock IP,修改輸出頻率為24Mhz,把輸出管腳接出

EMIO方式模擬SCCB時序進行讀寫操作詳解

5、create HDL wrapper,生產HDL頂層文件,雙擊打開,可以看到剛才接出來的EMIO管腳名為gpio_0_tri_io

EMIO方式模擬SCCB時序進行讀寫操作詳解

6、創建約束文件,我的攝像頭的SIOD接到了W8,SIOC接到了V8,RESET接到AB11,XCLK接到W11

EMIO方式模擬SCCB時序進行讀寫操作詳解

7、綜合,生成bit文件,導出hardware并啟動SDK,創建項目,添加如下代碼

EMIO_init.h

#ifndef EMIO_INIT_H_

#define EMIO_INIT_H_

#include“xgpiops.h”

int EMIO_SCCB_init(void);

#define SIOD_PIN 54

#define SIOC_PIN 55

#define RESET_PIN 56

#define DIRECTION_INPUT 0

#define DIRECTION_OUTPUT 1

void CLOCK_HIGH(void);

void CLOCK_LOW(void);

void DATA_HIGH(void);

void DATA_LOW(void);

void DATA_INPUT(void);

void DATA_OUTPUT(void);

int GET_DATA(void);

void SCCB_reset(void);

#endif /* EMIO_INIT_H_ */

EMIO_init.c

#include “xgpiops.h”

#include “EMIO_init.h”

static XGpioPs psGpioInstancePtr;

int EMIO_SCCB_init(void)

{

XGpioPs_Config* GpioConfigPtr;

int xStatus;

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,GpioConfigPtr-》BaseAddr);

if(XST_SUCCESS != xStatus)

print(“EMIO INIT FAILED \n\r”);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOC_PIN,DIRECTION_OUTPUT);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN,DIRECTION_OUTPUT);

XGpioPs_SetDirectionPin(&psGpioInstancePtr, RESET_PIN,DIRECTION_OUTPUT);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, SIOC_PIN,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, SIOD_PIN,1);

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, RESET_PIN,1);//

return xStatus;

}

void SCCB_reset(void)

{

XGpioPs_WritePin(&psGpioInstancePtr,RESET_PIN, 0);

usleep(50*1000);

XGpioPs_WritePin(&psGpioInstancePtr,RESET_PIN, 1);

}

void CLOCK_HIGH(void)

{

XGpioPs_WritePin(&psGpioInstancePtr,SIOC_PIN, 1);

}

void CLOCK_LOW(void)

{

XGpioPs_WritePin(&psGpioInstancePtr,SIOC_PIN, 0);

}

int GET_DATA(void)

{

return XGpioPs_ReadPin(&psGpioInstancePtr,SIOD_PIN);

}

void DATA_INPUT(void)

{

XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN,DIRECTION_INPUT);//

}

void DATA_OUTPUT(void)

{

XGpioPs_SetDirectionPin(&psGpioInstancePtr, SIOD_PIN,DIRECTION_OUTPUT);//

}

void DATA_HIGH(void)

{

XGpioPs_WritePin(&psGpioInstancePtr,SIOD_PIN, 1);

}

void DATA_LOW(void)

{

XGpioPs_WritePin(&psGpioInstancePtr,SIOD_PIN,0);

}

SCCB_ctrl.h

#ifndef SCCB_CTRL_H_

#define SCCB_CTRL_H_

void sccb_start(void);

void sccb_end(void);

void sccb_sendbyte( unsigned char value );

void sccb_senddata(unsigned char subaddr,unsigned char value);

int sccb_readdata(unsigned char addr, unsigned char *value);

#endif /* SCCB_CTRL_H_ */

SCCB_ctrl.c

#include “sleep.h”

#include “EMIO_init.h”

#define OV7670_WRITE_ADDR 0x42

#define OV7670_READ_ADDR 0x43

#define SCCB_DELAY usleep(10)

void sccb_start(void)

{

CLOCK_HIGH();

DATA_HIGH();

SCCB_DELAY;

DATA_LOW();

SCCB_DELAY;

CLOCK_LOW();

SCCB_DELAY;

}

void sccb_end(void)

{

DATA_LOW();

SCCB_DELAY;

CLOCK_HIGH();

SCCB_DELAY;

DATA_HIGH();

SCCB_DELAY;

}

int sccb_sendbyte( unsigned char value )

{

unsigned char tmp = value;

unsigned char i=0,ack;

for(i=0; i《8; i++)

{

if(tmp & 0x80 )

DATA_HIGH();

else

DATA_LOW();

SCCB_DELAY;

CLOCK_HIGH();

SCCB_DELAY;

CLOCK_LOW();

SCCB_DELAY;

tmp《《=1;

}

DATA_HIGH();

DATA_INPUT();

SCCB_DELAY;

CLOCK_HIGH();

ack = GET_DATA();

SCCB_DELAY;

CLOCK_LOW();

SCCB_DELAY;

DATA_OUTPUT();

if(ack==1)

{

return -1;

}

return 0;

}

unsigned char sccb_readbyte( unsigned char addr)

{

unsigned char i=0,data=0;

DATA_HIGH();

DATA_INPUT();

for(i=0; i《8; i++)

{

CLOCK_HIGH();

SCCB_DELAY;

data 《《= 1;

if(GET_DATA())

data |= 1;

SCCB_DELAY;

CLOCK_LOW();

SCCB_DELAY;

}

DATA_OUTPUT();

DATA_HIGH();

SCCB_DELAY;

CLOCK_HIGH();

SCCB_DELAY;

CLOCK_LOW();

SCCB_DELAY;

DATA_HIGH();

return data;

}

int sccb_readdata(unsigned char addr, unsigned char *value)

{

// 兩相寫

sccb_start();

if(sccb_sendbyte(OV7670_WRITE_ADDR) != 0)

{

sccb_end();

return -1;

}

if(sccb_sendbyte(addr) != 0)

{

sccb_end();

return -1;

}

sccb_end();

SCCB_DELAY;

// 兩相讀

sccb_start();

if(sccb_sendbyte(OV7670_READ_ADDR) != 0)

{

sccb_end();

return -1;

}

*value = sccb_readbyte(addr);

sccb_end();

return 0;

}

void sccb_senddata(unsigned char addr,unsigned char value)

{

sccb_start();

sccb_sendbyte(OV7670_WRITE_ADDR);

sccb_sendbyte(addr);

sccb_sendbyte(value);

sccb_end();

}

修改main函數,讀取PID和VER寄存器,驗證是否正確,實際上我讀取到的VER是0X73

int main()

{

unsigned char data;

init_platform();

print(“Hello World\n\r”);

EMIO_SCCB_init();

SCCB_reset();

usleep(500*1000);

while(1)

{

//讀取PID

data = 0;

if(sccb_readdata(0x0A,&data) != 0)

{

print(“error\n\r”);

}

else

{

if(data != 0x76)

print(“error\n\r”);

}

//讀取VER

data = 0;

if(sccb_readdata(0x0B,&data) != 0)

{

print(“error\n\r”);

}

else

{

if(data != 0x73)

print(“error\n\r”);

}

}

cleanup_platform();

return 0;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SCCB
    +關注

    關注

    0

    文章

    11

    瀏覽量

    11324
  • Vivado
    +關注

    關注

    19

    文章

    808

    瀏覽量

    66349
收藏 人收藏

    評論

    相關推薦

    IIC總線協議與SCCB協議的區別

    總線支持連續寫,故寫完地址之后不需要再發送起始信號;這也正是與SCCB最大的不同之處;6、無論讀寫,應答位總線都需要釋放,至于如果不釋放會不會對時序產生破壞影響還不清楚,有待驗證; (摘自百度)總結
    發表于 08-07 12:43

    ov7725的使用與OV7725 SCCB的接口時序

    ov7725介紹ov7725(OmniVsion_OV7725)是由OV(豪威科技)生產的一款CMOS的攝像頭,已經被中國財團收購。OV7725 SCCB的接口時序(OmniVision
    發表于 07-28 08:07

    如何對SCCB協議進行讀寫操作

    ov7725是什么?ov7725攝像頭是由哪些部分組成的?如何對SCCB協議進行讀寫操作
    發表于 10-20 07:09

    軟件模擬SPI時序實現25Q64讀寫操作的方法

    軟件模擬SPI時序實現25Q64讀寫操作單片機采用SPI/IIC通訊協議訪問外圍電子模塊如:顯示屏、EEPROM、FLASH、各種電子傳感器等等越來越多,掌握SPI/IIC通訊協議訪問
    發表于 11-30 07:35

    如何使用SPI?如何對SPI的操作時序進行讀寫

    nRF24L01+ 2.4GHz無線收發器的主要特性有哪些?如何使用SPI?如何對SPI的操作時序進行讀寫呢?
    發表于 12-20 06:32

    軟件模擬SPI時序是怎樣去實現25Q64讀寫操作

    軟件模擬SPI時序實現25Q64讀寫操作單片機采用SPI/IIC通訊協議訪問外圍電子模塊如:顯示屏、EEPROM、FLASH、各種電子傳感器等等越來越多,掌握SPI/IIC通訊協議訪問
    發表于 02-17 06:07

    SRAM的簡單的讀寫操作教程

    SRAM的簡單的讀寫操作教程 SRAM的讀寫時序比較簡單,作為異步時序設備,SRAM對于時鐘同步的要求不高,可以在低速下運行,下面就介紹S
    發表于 02-08 16:52 ?140次下載

    SCCB接口時序

    SCCB的總線時序與I2C基本相同,它的響應信號ACK被稱為一個傳輸單元的第9位,分為Dont care和NA。Dont care位由從機產生;NA位由主機產生,由于SCCB不支持多字節的讀寫
    發表于 03-26 16:00 ?168次下載
    <b class='flag-5'>SCCB</b>接口<b class='flag-5'>時序</b>

    DS18B20讀寫操作程序詳解

    DS18B20的初始化、讀寫操作以及程序詳解
    發表于 11-06 18:04 ?2.6w次閱讀

    EMIO方式模擬I2C時序對ADV7511進行讀寫

    創建硬件工程,很簡單,PS接出兩個EMIO和一個74.25M時鐘
    發表于 11-18 13:50 ?3953次閱讀

    SCCB的工作模式及示例代碼資料合集免費下載

    如果對OV7620的默認工作模式不滿意,就可寫SCCB。 對于SCCB操作,首先必需使能IICB,這個在OV7620上需要跳線解決。網上很多人用普通IO口模擬
    發表于 05-13 08:00 ?3次下載
    <b class='flag-5'>SCCB</b>的工作模式及示例代碼資料合集免費下載

    總線的操作時序操作方式詳解

    操作時序(timing):各信號有效的先后順序及配合關系
    的頭像 發表于 06-24 16:21 ?1.1w次閱讀
    總線的<b class='flag-5'>操作</b><b class='flag-5'>時序</b>和<b class='flag-5'>操作</b><b class='flag-5'>方式</b><b class='flag-5'>詳解</b>

    STM32入門開發: 介紹IIC總線、讀寫AT24C02(EEPROM)(采用模擬時序)

    時序的,本文采用的是模擬時序,下篇文章就介紹配置STM32的IIC硬件時序讀寫AT24C02和AT24C08。
    發表于 11-25 20:06 ?39次下載
    STM32入門開發: 介紹IIC總線、<b class='flag-5'>讀寫</b>AT24C02(EEPROM)(采用<b class='flag-5'>模擬</b><b class='flag-5'>時序</b>)

    Python對txt進行讀寫操作

    Python對txt進行讀寫操作
    的頭像 發表于 01-11 15:16 ?798次閱讀

    SCCB IIC接口設計

    SCCB協議是類似于IIC協議,它常用于OV系列攝像頭配置接口中。下圖為sio_c和sio_d的時序圖,具體的時序協議請看《SCCB接口時序
    的頭像 發表于 11-06 10:42 ?509次閱讀
    <b class='flag-5'>SCCB</b> IIC接口設計