📄 mt9t001_fxns.c
字号:
/*
* Copyright 2004 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
*/
/********************************************
Include Files
********************************************/
#include <std.h>
#include <evmdm642.h>
#include "edc.h"
#include "_iic.h"
#include "MT9T001.h"
#include "MT9T001_fxns.h"
/********************************************
Constants
********************************************/
#define MT9T001_ON_VP0 0
#define MT9T001_ON_VP1 1
#define PCA9540B_ADDRESS 0xE0 >> 1
#define PCA9540B_VP0 0x04
#define PCA9540B_VP1 0x05
// Handle to I2C
extern I2C_Handle EVMDM642_I2C_hI2C;
// EDC Required Functions
far EDC_Fxns MT9T001_Fxns = {
MT9T001_open,
MT9T001_close,
MT9T001_ctrl
};
/****************************************
MT9T001 Register Variable Declarations
****************************************/
/********************************************
MT9T001_open
- Open the Sensor for use
********************************************/
static EDC_Handle MT9T001_open(String devName, Arg optArg)
{
Int devId;
/* Check if the addresse is correct */
if(devName[0] != '/')
{
devId = -1;
}
// Sensor on VP0
else if(devName[1] == '0')
{
devId = MT9T001_ON_VP0;
MT9T001_Reset_Dev((EDC_Handle)devId);
}
// Sensor on VP1
else if(devName[1] == '1')
{
devId = MT9T001_ON_VP1;
MT9T001_Reset_Dev((EDC_Handle)devId);
}
// Invalid
else
{
devId = -1;
}
return (EDC_Handle)devId;
}
/********************************************
MT9T001_close
- Close and powerdown the sensor
********************************************/
static int MT9T001_close(EDC_Handle handle)
{
// I2C address multiplexing
MT9T001_PCA9540_Address_Multiplex(handle);
MT9T001_PowerDown(handle);
return EDC_SUCCESS;
}
/********************************************
MT9T001_ctrl
- Issue commands to the sensor
********************************************/
static int MT9T001_ctrl(EDC_Handle handle, unsigned int cmd, Arg arg)
{
Bool status = 1;
// I2C address multiplexing
status &= MT9T001_PCA9540_Address_Multiplex(handle);
switch(cmd)
{
case EDC_CONFIG:
status &= MT9T001_Config(handle, (void *)arg);
break;
case EDC_RESET:
MT9T001_Reset_Dev(handle);
break;
case EDC_START:
// Restart Frame and Enable continuous capture mode
status &= MT9T001_Begin_Capture(handle);
break;
default:
return EDC_FAILED;
//break;
} // end switch
if(status == 1)
return EDC_SUCCESS;
else
return EDC_FAILED;
}
/********************************************
MT9T001_Config
- Configure the sensor for the desired
capture resolution.
********************************************/
static Bool MT9T001_Config(EDC_Handle handle, MT9T001_Params *params)
{
int status = 1;
status &= MT9T001_PCA9540_Address_Multiplex(handle);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMH , &COMH_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMI , &COMI_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_CLKRC, &CLKRC_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMH , &COMH_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMC , &COMC_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COME , &COME_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_CHLF , &CHLF_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_VBLM , &VBLM_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_VCHG , &VCHG_reg.data, 1);
status &= MT9T001_Common_Config_Settings(handle);
if(!status)
return(FALSE);
else
return(TRUE);
}
/********************************************
MT9T001_Begin_Capture
- Restart Frame and Enable continuous
capture mode
********************************************/
int MT9T001_Begin_Capture(EDC_Handle handle)
{
int status = 1;
// I2C address multiplexing
status &= MT9T001_PCA9540_Address_Multiplex(handle);
// Enable single frame capture
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMD, &COMD_reg.data,1);
return status;
}
/********************************************
MT9T001_Reset_Dev
- Reset the sensor
********************************************/
void MT9T001_Reset_Dev(EDC_Handle devHandle)
{
// I2C address multiplexing
MT9T001_PCA9540_Address_Multiplex(devHandle);
MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMH , &COMH_reg.data, 1);
}
/********************************************
MT9T001_PowerDown
- Power down the sensor
********************************************/
void MT9T001_PowerDown(EDC_Handle devHandle)
{
COME_reg.data = 0x00;
// I2C address multiplexing
MT9T001_PCA9540_Address_Multiplex(devHandle);
MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COME , &COME_reg.data, 1);
}
/********************************************
MT9T001_Write_Verify
- Access sensor registers via I2C
This function writes to the desired
register, then reads the register back
to verify the written data.
********************************************/
Bool MT9T001_Write_Verify(I2C_Handle hI2C, Uint8 devAddress, Uint32 subAddress, Uint8 *data, Uint16 numBytes)
{
int status = 1;
typedef union DATAREAD
{
Uint16 word;
Uint8 byte[2];
} u_DATAREAD;
typedef union DATAWRITE
{
Uint16 word;
Uint8 byte[2];
} u_DATAWRITE;
u_DATAREAD dataRead = {0};
u_DATAWRITE dataWrite = {0};
Uint8 jj = 0;
dataWrite.byte[1] = data[1];
dataWrite.byte[0] = data[0];
_IIC_write_rev(hI2C, devAddress, subAddress, &dataWrite.byte[1], numBytes);
_IIC_read_rev(hI2C, devAddress, subAddress, &dataRead.byte[1], numBytes);
// compare what was written to what was read back
for(jj = 0; jj < numBytes; jj++)
{
// error
if(dataWrite.byte[jj] != dataRead.byte[jj])
status = 0;
}
return status;
}
/******************************************************
MT9T001_Common_Config_Settings
- Initialize register values that are common to all
capture modes
******************************************************/
static int MT9T001_Common_Config_Settings(EDC_Handle devHandle)
{
int status = 1;
// I2C address multiplexing
status &= MT9T001_PCA9540_Address_Multiplex(devHandle);
// write to OV2610
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMH , &COMH_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_NOFC , &NOFC_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_CLKRC, &CLKRC_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMH , &COMH_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COMC , &COMC_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_COME , &COME_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_CHLF , &CHLF_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_VBLM , &VBLM_reg.data, 1);
status &= MT9T001_Write_Verify(EVMDM642_I2C_hI2C, OV2610_ADDRESS, OV2610ADDR_VCHG , &VCHG_reg.data, 1);
// status &= MT9T001_Common_Config_Settings(handle);
return status;
}
/********************************************
MT9T001_PCA9540_Address_Multiplex()
- Perform address translation based on the handle.
The drivers are capable of handling 2 MT9T001 sensors.
Both sensors have the same i2c address. The PCA9540
performs the address multiplexing required.
********************************************/
int MT9T001_PCA9540_Address_Multiplex(EDC_Handle handle)
{
Int devID = (int)handle;
int status = 1;
switch(devID)
{
case MT9T001_ON_VP0:
// Perform address translation
_IIC_write(EVMDM642_I2C_hI2C, PCA9540B_ADDRESS, PCA9540B_VP0, NULL, 0);
status = 1;
break;
case MT9T001_ON_VP1:
// Perform address translation
_IIC_write(EVMDM642_I2C_hI2C, PCA9540B_ADDRESS, PCA9540B_VP1, NULL, 0);
status = 1;
break;
default:
status = 0;
//break;
} // end switch
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -