MT 9 V 034カメラ学習ノート(一)
5600 ワード
最近スマートカーを作っていて、龍邱からMT 9 V 034カメラを2つ買って使ったが、結局坑父の龍邱はカメラのIO採集プログラムだけをあげて、カメラを配置するプログラムは、KV 58 DMA採集も書いていないので、自分で研究する必要がある.坑父の龍邱は完全なライブラリ関数を与えないため、今日はカメラのIIC通信を先に実現するしかない.MT 9 V 034は標準的なIIC通信プロトコルを使用しています.コードをSCCBに貼り付けます.Probe(0 x 5 C)は、カメラが存在するかどうかを調べることができ、戻り値が0の場合、カメラが存在することを示します.MT 9 V 034のアドレスは0 x 5 C固定です.主に関数SCB_を介してRegRead(0x5C,0x00,&data); 読み出しレジスタ0 x 00:Chip Versionレジスタが呼び出され、このレジスタは量0 x 1324 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(); } /*************************************************************** * 河南科学技術大学一隊**関数名称:uint 8 SCCB_SendByte(uint 8 Data)*機能説明:SCCB読み出しバイト関数*パラメータ説明:*関数戻り:読み出しバイト*修正時間:2018年3月4日*備考:*********************************************************************************/uint 8 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; } /*************************************************************** * 河南科学技術大学一隊**関数名称:uint 8 SCCB_ReadByte(void)*機能説明:SCCB読み出しバイト関数*パラメータ説明:*関数戻り:読み出しバイト*修正時間:2018年3月4日*備考:**************************************************************************/uint 8 SCCB_ReadByte(void){uint 8 i;uint 8_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();
}
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;
}/*************************************************************************河南科技大学一隊*関数名:static void SCCB_NAck(void)*機能説明:IIC無返信信号*パラメータ説明:*関数戻り:void*修正時間:2018年3月4日*備考:**********************************************************************/static void SCCB_NAck(void) { SCL_Out; SDA_Out;
}/*****************************************************************************************************************************************************************************************************************************************************河南科学技術大学一隊*関数名:uint 8_t SCB_RegWrite(uint 8 Device,uint 8 Address,uint 16 Data)*機能説明:カメラにデータを書き込む*パラメータ説明:*関数戻り:void*修正時間:2018年3月4日*備考:******************************************************************/uint 8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data) { uint8 i; uint8 Ack;
}/*****************************************************************************************************************************************************************************************************************************************************河南科学技術大学一隊*関数名:uint 8_t SCB_RegRead(uint 8_t Device,uint 8_t Address,uint 16_t*Data)*機能説明:カメラレジスタのデータを読み取る*パラメータ説明:*関数戻り:void*修正時間:2018年3月4日*備考:**************************************************************/uint 8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data) { uint8 i; uint8 Ack = 0;
}/*********************************************************************************河南科技大学一隊*関数名称:int SCCB_Probe(uint 8_t chipAddr)*機能説明:問い合わせ先のデバイスが存在するかどうか*パラメータ説明:*関数返却:void*修正時間:2018年3月4日*備考:**************************************************************************/int SCCB_Probe(uint8_t chipAddr) { uint8_t err;
}
}/*************************************************************************************************************************************************************************************************************************************************************河南科学技術大学一隊*関数名称: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(); } /*************************************************************** * 河南科学技術大学一隊**関数名称:uint 8 SCCB_SendByte(uint 8 Data)*機能説明:SCCB読み出しバイト関数*パラメータ説明:*関数戻り:読み出しバイト*修正時間:2018年3月4日*備考:*********************************************************************************/uint 8 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; } /*************************************************************** * 河南科学技術大学一隊**関数名称:uint 8 SCCB_ReadByte(void)*機能説明:SCCB読み出しバイト関数*パラメータ説明:*関数戻り:読み出しバイト*修正時間:2018年3月4日*備考:**************************************************************************/uint 8 SCCB_ReadByte(void){uint 8 i;uint 8_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();
}/*****************************************************************************************************************************************************************************************************************************************************河南科学技術大学一隊*関数名:uint 8_t SCB_RegWrite(uint 8 Device,uint 8 Address,uint 16 Data)*機能説明:カメラにデータを書き込む*パラメータ説明:*関数戻り:void*修正時間:2018年3月4日*備考:******************************************************************/uint 8_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;
}/*****************************************************************************************************************************************************************************************************************************************************河南科学技術大学一隊*関数名:uint 8_t SCB_RegRead(uint 8_t Device,uint 8_t Address,uint 16_t*Data)*機能説明:カメラレジスタのデータを読み取る*パラメータ説明:*関数戻り:void*修正時間:2018年3月4日*備考:**************************************************************/uint 8_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(uint 8_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;
}