/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2016,逐飞科技
* All rights reserved.
* 技术讨论QQ群:179029047
*
* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途,
* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。
*
* @file SEEKFREE_MT9V032.c
* @brief 总钻风(灰度摄像头)函数库
* @company 成都逐飞科技有限公司
* @author Go For It(1325536866)
* @version v1.0
* @Software IAR 7.2 or MDK 5.17
* @Target core MK60DN512VLL10
* @Taobao https://seekfree.taobao.com/
* @date 2016-02-25
* @note
MT9V032接线定义:
------------------------------------
模块管脚 单片机管脚
// SDA(51的RX) C17
// SCL(51的TX) C16
// 场中断 C6
// 行中断 未使用,因此不接
// 像素中断 C18
// 数据口 C8-C15
------------------------------------
默认分辨率是 188*120
默认FPS 50帧
********************************************************************************************************************/
#include "MT9V032.h"
#define MT9V032_COF_UART UART3
uint8 image[ROW][COL]; //初始灰度数组
uint8 receive[3];
uint8 receive_num = 0;
uint8 uart_receive_flag = 1;
//需要配置到摄像头的数据
int16 MT9V032_CFG[CONFIG_FINISH][2]=
{
{AUTO_EXP, 30}, //自动曝光设置 范围1-63 0为关闭 如果自动曝光开启 EXP_TIME命令设置的数据将会变为最大曝光时间,也就是自动曝光时间的上限
//一般情况是不需要开启这个功能,因为比赛场地光线一般都比较均匀,如果遇到光线非常不均匀的情况可以尝试设置该值,增加图像稳定性
{EXP_TIME, 300}, //曝光时间 摄像头收到后会自动计算出最大曝光时间,如果设置过大则设置为计算出来的最大曝光值
{FPS, 150}, //图像帧率 摄像头收到后会自动计算出最大FPS,如果过大则设置为计算出来的最大FPS
{SET_COL, COL}, //图像列数量 范围1-752 K60采集不允许超过188
{SET_ROW, ROW}, //图像行数量 范围1-480
{LR_OFFSET, 0}, //图像左右偏移量 正值 右偏移 负值 左偏移 列为188 376 752时无法设置偏移 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移
{UD_OFFSET, 0}, //图像上下偏移量 正值 上偏移 负值 下偏移 行为120 240 480时无法设置偏移 摄像头收偏移数据后会自动计算最大偏移,如果超出则设置计算出来的最大偏移
{GAIN, 32}, //图像增益 范围16-64 增益可以在曝光时间固定的情况下改变图像亮暗程度
{INIT, 0} //摄像头开始初始化
};
//从摄像头内部获取到的配置数据
int16 GET_CFG[CONFIG_FINISH-1][2]=
{
{AUTO_EXP, 0}, //自动曝光设置
{EXP_TIME, 0}, //曝光时间
{FPS, 0}, //图像帧率
{SET_COL, 0}, //图像列数量
{SET_ROW, 0}, //图像行数量
{LR_OFFSET, 0}, //图像左右偏移量
{UD_OFFSET, 0}, //图像上下偏移量
{GAIN, 0}, //图像增益
};
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V032摄像头串口中断函数
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note 该函数在ISR文件 串口3中断程序被调用
//-------------------------------------------------------------------------------------------------------------------
void mt9v032_cof_uart_interrupt(void)
{
uart_getchar(MT9V032_COF_UART,(char *)&receive[receive_num]);
receive_num++;
if(1==receive_num && 0XA5!=receive[0]) receive_num = 0;
if(3 == receive_num)
{
receive_num = 0;
uart_receive_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 获取摄像头内部配置信息
// @param NULL
// @return void
// @since v1.0
// Sample usage: 调用该函数前请先初始化uart2
//-------------------------------------------------------------------------------------------------------------------
void get_config(void)
{
uint16 temp, i;
uint8 send_buffer[4];
for(i=0; i<CONFIG_FINISH-1; i++)
{
send_buffer[0] = 0xA5;
send_buffer[1] = GET_STATU;
temp = GET_CFG[i][0];
send_buffer[2] = temp>>8;
send_buffer[3] = (uint8)temp;
uart_putbuff(MT9V032_COF_UART,send_buffer,4);
//等待接受回传数据
while(!uart_receive_flag);
uart_receive_flag = 0;
GET_CFG[i][1] = receive[1]<<8 | receive[2];
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 获取摄像头固件版本
// @param NULL
// @return void
// @since v1.0
// Sample usage: 调用该函数前请先初始化uart2
//-------------------------------------------------------------------------------------------------------------------
//uint16 get_version(void)
//{
// uint16 temp;
// uint8 send_buffer[4];
// send_buffer[0] = 0xA5;
// send_buffer[1] = GET_STATU;
// temp = GET_VERSION;
// send_buffer[2] = temp>>8;
// send_buffer[3] = (uint8)temp;
//
// uart_putbuff(MT9V032_COF_UART,send_buffer,4);
//
// //等待接受回传数据
// while(!uart_receive_flag);
// uart_receive_flag = 0;
//
// return ((uint16)(receive[1]<<8) | receive[2]);
//}
//-------------------------------------------------------------------------------------------------------------------
// @brief 单独设置摄像头曝光时间
// @param light 设置曝光时间越大图像越亮,摄像头收到后会根据分辨率及FPS计算最大曝光时间如果设置的数据过大,那么摄像头将会设置这个最大值
// @return uint16 当前曝光值,用于确认是否正确写入
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint16 set_exposure_time(uint16 light)
{
uint16 temp;
uint8 send_buffer[4];
send_buffer[0] = 0xA5;
send_buffer[1] = SET_EXP_TIME;
temp = light;
send_buffer[2] = temp>>8;
send_buffer[3] = (uint8)temp;
uart_putbuff(MT9V032_COF_UART,send_buffer,4);
//等待接受回传数据
while(!uart_receive_flag);
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
return temp;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 对摄像头内部寄存器进行写操作
// @param addr 摄像头内部寄存器地址
// @param data 需要写入的数据
// @return uint16 寄存器当前数据,用于确认是否写入成功
// @since v1.0
// Sample usage:
//-----------------------