MT9V034攝像頭學習筆記(一)

最近在做智能車,從龍邱買了兩個MT9V034攝像頭使用,結果坑爹的龍邱只給了攝像頭的IO採集程序,配置攝像頭的程序,KV58DMA採集都沒有寫,這就需要自己研究了。因爲坑爹的龍邱不給完整的庫函數,今天只能先實現了攝像頭的IIC通信了。
MT9V034使用的就是標準的IIC通信協議,我把代碼貼出來
SCCB_Probe(0x5C)
可以查詢攝像頭是否存在,返回值爲0說明攝像頭存在。
MT9V034的地址爲0x5C固定的。
主要是通過函數
SCB_RegRead(0x5C,0x00,&data);
調用讀取寄存器0x00 :Chip Version寄存器,這個寄存器是量0x1324 4900
如果對,表明通信成功。
我這裏是成功了的。
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:void SCCB_Star(void)
* 功能說明:SCCB讀取字節函數
* 參數說明:
* 函數返回:讀取字節
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
void SCCB_Star(void)
{
SCL_Out;
SDA_Out;
SCCB_Wait();
SDA_High;
SCL_High;asm (“nop”);asm (“nop”);
SCCB_Wait();
SDA_Low;
SCCB_Wait();
SCL_Low;asm (“nop”);asm (“nop”);

}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:void SCCB_Stop(void)
* 功能說明:SCCB讀取字節函數
* 參數說明:
* 函數返回:讀取字節
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
void SCCB_Stop(void)
{
SCL_Out;
SDA_Out;

SCCB_Wait();
SDA_Low;
SCCB_Wait();
SCL_High;asm (“nop”);asm (“nop”);
SCCB_Wait();
SDA_High;
SCCB_Wait();
}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:uint8 SCCB_SendByte(uint8 Data)
* 功能說明:SCCB讀取字節函數
* 參數說明:
* 函數返回:讀取字節
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
uint8 SCCB_SendByte(uint8 Data)
{
uint8 i;
uint8 Ack;
SDA_Out;
for( i=0; i<8; i++)
{
if(Data & 0x80) SDA_High;
else SDA_Low;
Data <<= 1;
SCCB_Wait();
SCL_High;asm (“nop”);asm (“nop”);
SCCB_Wait();
SCL_Low;asm (“nop”);asm (“nop”);
SCCB_Wait();
}
SDA_High;
SDA_In;
SCCB_Wait();

SCL_High;asm (“nop”);asm (“nop”);
SCCB_Wait();
Ack = SDA_Data;
SCL_Low;asm (“nop”);asm (“nop”);
SCCB_Wait();

return Ack;
}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:uint8 SCCB_ReadByte(void)
* 功能說明:SCCB讀取字節函數
* 參數說明:
* 函數返回:讀取字節
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
uint8 SCCB_ReadByte(void)
{
uint8 i;
uint8_t byte;
SCL_Out;
SDA_In; //使能輸入

for( i=0; i<8; i++)
{
SCL_Low;asm (“nop”);asm (“nop”);
SCCB_Wait();
SCL_High;asm (“nop”);asm (“nop”);
SCCB_Wait();

byte = (byte<<1)|(SDA_Data & 1);

}

SCL_Low;
SDA_Out;

return byte;
}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:static void SCCB_Ack(void)
* 功能說明:IIC有回覆信號
* 參數說明:
* 函數返回:void
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
static void SCCB_Ack(void)
{
SCL_Out;
SDA_Out;

SCL_Low;
SDA_Low;
SCCB_Wait();
SCL_High;
SCCB_Wait();
SCL_Low;
SCCB_Wait();

}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:static void SCCB_NAck(void)
* 功能說明:IIC無回覆信號
* 參數說明:
* 函數返回:void
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
static void SCCB_NAck(void)
{
SCL_Out;
SDA_Out;

SCL_Low;
SCCB_Wait();
SDA_High;
SCCB_Wait();
SCL_High;
SCCB_Wait();
SCL_Low;
SCCB_Wait();

}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)
* 功能說明:向攝像頭寫入數據
* 參數說明:
* 函數返回:void
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)
{
uint8 i;
uint8 Ack;

SCCB_Star();
Ack = SCCB_SendByte(Device);
if( Ack )
{
    return Ack;
}

Ack = SCCB_SendByte(Address);
if( Ack )
{
    return Ack;
}

Ack = SCCB_SendByte((uint8)(Data>>8));
Ack = SCCB_SendByte((uint8)Data);
if( Ack )
{
    return Ack;
}

SCCB_Stop();
return  Ack;

}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)
* 功能說明:讀取攝像頭寄存器的數據
* 參數說明:
* 函數返回:void
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)
{
uint8 i;
uint8 Ack = 0;

Device = Device<<1;
SCCB_Star();
Ack += SCCB_SendByte(Device);

Ack += SCCB_SendByte(Address);

SCCB_Star();
Ack += SCCB_SendByte(Device + 1);

*Data = SCCB_ReadByte();
SCCB_Ack();
*Data = *Data<<8;

*Data += SCCB_ReadByte();
SCCB_NAck();

SCCB_Stop();

return  Ack;

}
/***************************************************************
* 河南科技大學一隊
*
* 函數名稱:int SCCB_Probe(uint8_t chipAddr)
* 功能說明:查詢地址下的器件是否存在
* 參數說明:
* 函數返回:void
* 修改時間:2018年3月4日
* 備 注:
***************************************************************/
int SCCB_Probe(uint8_t chipAddr)
{
uint8_t err;

err = 0;
chipAddr <<= 1;

SCCB_Star();
err = SCCB_SendByte(chipAddr);
SCCB_Stop();

return err;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章