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;

}

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