您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF518做CMOS图像采集问题
本帖共有761个阅读者
发表帖子 发表投票 回复主题
BF518做CMOS图像采集问题
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518做CMOS图像采集问题

我现在用的BF518做图像采集,I2C也用的PF口模拟,代码是根据BF533的CMOS驱动代码改的,接口、定时器和PPI都配置好了,CMOS用的OV7725,编译时出现下面错误:

1 catastrophic error detected in the compilation of ".\cmos.c".
Compilation terminated.
cc3089: fatal error: Compilation failed
Tool failed with exit/exception code: 1.
Build was unsuccessful.

麻烦andy看下  谢谢恩


^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/8/16 9:52:13
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你检查你的代码是不是 }或{多了一个,没匹配上。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/8/16 10:33:26
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

andy,我用BF518初始化摄像头(OV7725),在BF533的CMOS驱动程序中改了两版代码,分别是TWI接口和PF口模拟的,编译都没错,描述如下,请指正:

1、TWI接口

   a、我把D:\visual dsp++ 5.0\Blackfin\Examples\ADSP-BF518F EZ-Board\Power_On_Self_Test路径下的twi_interface.c的代码复制到i2c.c中,发现需要重新定义Delay函数,也不知道Reset_TWI函数在哪里怎么使用?

   b、删掉了cmos.c,在main.c中定义寄存器和寄存器值,如下:

      unsigned char CameraConfig[] = {
      reg1, value1,
      reg2, value2,
      reg3, value3,
      ……
      }    

      然后直接在主函数中调用TWI_MasterMode_Write( OV7725_ADDRESS>>1, CameraConfig, 71, 2);完成摄像头初始化,请问这样对吗?

      还有,TWI_MasterMode_Write函数是通用的么,我直接写OV7725是直接调用还是要更改?

2、模拟I2C

     a、在i2c.c代码中主要修改了寄存器的名称,在cmos.c中修改从机设备地址,PF口,以及我要写入的寄存器和值。

        没有用#define  do  while(0)那一段代码,因为不知道为什么老报错(改了寄存器之后),我是在具体函数中直接使用寄存器,

        主要是将FIO_FLAG_S改为PORTFIO_SET,将FIO_FLAG_D改为PORTFIO,将FIO_FLAG_C改为PORTFIO_CLEAR,

        然后output,input的寄存器也改为BF518的,

        其中的函数实现都没有改动。

     b、根据要用到的接口配置其功能和属性。

     我主要做了以上修改,不知道对不对。





「该帖子被 unconscious 在 2013-08-22 13:39:30 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/8/16 14:14:01
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
1.给你一个BF51x配置OV9650的,你把地址改改,寄存器改改,看能直接用不。
TWI_MasterMode_Write 都是通用的,一般不需要改。
你可以用示波器测量时钟,检测配置IIC后摄像头出来的时钟频率变化。

/********************************************************
*
*   北京四维卓信电子有限公司
*
*  【OpenADSP开源社区】
*
********************************************************/
#include <cdefBF518.h>
#include <ccblkfn.h>

#define OV9650_ADDRESS 0x60
#define SETTINGNUM 126
#define PRESCALE_VALUE 10
#define RESET_TWI 0
#define CLKDIV_HI 17
#define CLKDIV_LO 8
#define WDSIZE_16 0x0004
#define WDSIZE_32 0x0008
#define DLEN_8 0x0
#define PACK_EN 0x200000
#define PORT_EN 0x1

unsigned short CMOSConfig[] = {

0x12,0x80,
0x11,0x81,
0x6b,0x0a,
0x6a,0x3e,
0x3b,0x09,
0x13,0xe0,
0x01,0x80,
0x02,0x80,
0x00,0x00,
0x10,0x00,
0x13,0xe5,
0x39,0x43,
0x38,0x12,
0x37,0x00,
0x35,0x91,
0x0e,0x20,
0x1e,0x34,
0xA8,0x80,
0x12,0x40,
0x04,0x00,
0x0c,0x04,
0x0d,0x80,
0x18,0xc6,
0x17,0x26,
0x32,0xad,
0x03,0x00,
0x1a,0x3d,
0x19,0x01,
0x3f,0xa6,
0x14,0x1a,
0x15,0x02,
0x41,0x12,
0x42,0x08,
0x1b,0x00,
0x16,0x06,
0x33,0xe2,
0x49,0x60,
0x34,0x16,
0x96,0x04,
0x3a,0x00,
0x8e,0x00,
0x3c,0x77,
0x8B,0x06,
0x94,0x88,
0x95,0x88,
0x40,0xc1,
0x29,0x3f,
0x0f,0x42,
0x3d,0x92,
0x69,0x40,
0x5C,0xb9,
0x5D,0x96,
0x5E,0x10,
0x59,0xc0,
0x5A,0xaf,
0x5B,0x55,
0x43,0xf0,
0x44,0x10,
0x45,0x68,
0x46,0x96,
0x47,0x60,
0x48,0x80,
0x5F,0xe0,
0x60,0x8c,
0x61,0x20,
0xa5,0xd9,
0xa4,0x74,
0x8d,0xc2,
0x13,0xe7,
0x4f,0x3a,
0x50,0x3d,
0x51,0x03,
0x52,0x12,
0x53,0x26,
0x54,0x38,
0x55,0x40,
0x56,0x40,
0x57,0x40,
0x58,0x0d,
0x8C,0x23,
0x3E,0x02,
0xa9,0xb8,
0xaa,0x92,
0xab,0x0a,
0x8f,0xdf,
0x90,0x00,
0x91,0x00,
0x9f,0x00,
0xa0,0x00,
0x3A,0x01,
0x24,0x80,
0x25,0x70,
0x26,0xd3,
0x2a,0x10,
0x2b,0x40,
0x6c,0x40,
0x6d,0x30,
0x6e,0x4b,
0x6f,0x60,
0x70,0x70,
0x71,0x70,
0x72,0x70,
0x73,0x70,
0x74,0x60,
0x75,0x60,
0x76,0x50,
0x77,0x48,
0x78,0x3a,
0x79,0x2e,
0x7a,0x28,
0x7b,0x22,
0x7c,0x04,
0x7d,0x07,
0x7e,0x10,
0x7f,0x28,
0x80,0x36,
0x81,0x44,
0x82,0x52,
0x83,0x60,
0x84,0x6c,
0x85,0x78,
0x86,0x8c,
0x87,0x9e,
0x88,0xbb,
0x89,0xd2,
0x8a,0xe6
};

void mdelay(void)
{
int j,i;
for(i=30;i>0;i--)
{
for(j=30000;j>0;j--)
{
j=j;
}
}
}
/****************************************************************************
* 名称 : Reset_TWI
* 功能 : 复位 TWI接口
* 入口参数 :无
* 返回值 :无
****************************************************************************/
void Reset_TWI(void)
{
     //RESET_TWI CONTROLLER
*pTWI_CONTROL = RESET_TWI;
ssync();

//CLEAR ALL ERRONOUS CONDITIONS BEFORE ENABLING TWI
*pTWI_MASTER_STAT = BUFWRERR | BUFRDERR | LOSTARB | ANAK | DNAK;
ssync();

//CLEAR ALL INTERRUPTS BEFORE ENABLING TWI
*pTWI_INT_STAT = SINIT | SCOMP | SERR | SOVF | MCOMP | MERR | XMTSERV | RCVSERV;
ssync();

//FLUSH THE FIFOs - BOTH TX AND RX.
*pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
ssync();
}

/****************************************************************************
* 名称 : TWI_MasterMode_Write
* 功能 : TWI接口写数据
* 入口参数 :无
* 返回值 :无
****************************************************************************/
void TWI_MasterMode_Write(unsigned short DeviceAddr, unsigned short *TWI_Data_Pointer, unsigned short TX_Count, unsigned short TWI_TX_Length)
{
int i, j;
//FLUSH THE FIFOs - BOTH TX AND RX.
*pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
ssync();
*pTWI_MASTER_STAT = BUFWRERR | BUFRDERR | LOSTARB | ANAK | DNAK;
ssync();
    *pTWI_FIFO_CTL = 0; // Clear the bit manually
*pTWI_CONTROL = TWI_ENA | PRESCALE_VALUE; // PRESCALE = fsclk/10MHz
*pTWI_CLKDIV = ((CLKDIV_HI) << 8) | (CLKDIV_LO); // For 100KHz SCL speed: CLKDIV = (1/100KHz)/(1/10MHz) = 100 -> SCL symetric: CLKHI = 50, CLKLOW = 50
*pTWI_MASTER_ADDR = DeviceAddr; // Target address (7-bits plus the read/write bit the TWI controls
for (i = 0; i < TX_Count; i++)
{
mdelay();
    // # of configurations to send to the sensor
*pTWI_XMT_DATA8 = *TWI_Data_Pointer++; // Pointer to an array and load a value where a list of data is located
*pTWI_MASTER_CTL = (TWI_TX_Length<<6) | MEN;// | FAST; // Start transmission
for (j = 0; j < (TWI_TX_Length-1); j++)
{
// # of transfers before stop condition
while (*pTWI_FIFO_STAT == XMTSTAT) // wait to load the next sample into the TX FIFO
ssync();

*pTWI_XMT_DATA8 = *TWI_Data_Pointer++; // Load the next sample into the TX FIFO. Pointer to an array where a list of data is located
ssync();
}
while ((*pTWI_INT_STAT & MCOMP) == 0) // Wait until transmission complete and MCOMP is set
ssync();
*pTWI_INT_STAT = XMTSERV | MCOMP; // service TWI for next transmission
//delay();
}
asm("nop;");
asm("nop;");
asm("nop;");

}
/****************************************************************************
* 名称 :Init_aic23b
* 功能 : 音频模块的内部初始化
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void iic_init(void)
{
Reset_TWI();
TWI_MasterMode_Write( OV9650_ADDRESS>>1, CMOSConfig, SETTINGNUM, 2);
}


2.
你可以将下面代码中return ret;上打个断点,如果运行配置时没运行到此断点,可以认为IIC配置成功,如果运行到,说明代码修改错误,或者你的摄像头芯片没有响应,检查硬件。另外也可以通过示波器看配置前后的输出时钟对比判断。

int ov9653_write(unsigned char addr, unsigned char dat)
{
int ret = -1;
i2c_start(&mcu_i2c);
//send slave address
if(i2c_write(&mcu_i2c, OV9653_ADDRESS, 1)){
i2c_stop(&mcu_i2c);
return ret;
}
//send sub-address to device
if(i2c_write(&mcu_i2c, addr, 1)){
i2c_stop(&mcu_i2c);
return ret;
}
//send data to device
i2c_write(&mcu_i2c, dat, 1);
i2c_stop(&mcu_i2c);
return 0;
}

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/8/22 20:53:45
unconscious(论坛新手)
unconscious
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢andy

1、我用你上面的TWI程序试了,测试PJ的data口输出不对。

2、我用的AD-EZICE下载程序,没有用仿真器调试。

   用PF11,12口模拟I2C,我改了BF533的CMOS驱动程序,没有输出。i2c.c中代码实现我没改,就该了寄存器名称,我不知道是哪里有问

   题,这两个脚的引脚配置如下:

    *pPORTF_FER    |= PF11|PF12;  
    *pPORTF_MUX  = 0x0095;

    *pPORTFIO_INEN        = 0;  
    *pPORTFIO_DIR        = 0x1800;
    *pPORTFIO_EDGE        = 0x0000;
    *pPORTFIO_MASKA_SET    = 0x00ff;
    *pPORTFIO_POLAR        = 0x00ff;

    还有,i2c.c中我改的寄存器是把FIO_FLAG_D换成PORTFIO,FIO_FLAG_S换成PORTFIO_SET,FIO_FLAG_C换成PORTFIO_CLEAR,这几个不是很  

    确定。

   请问这样对吗?还有些什么问题需要注意?谢谢。

  



「该帖子被 unconscious 在 2013-08-23 15:22:45 编辑过」

^_^
等级:论坛新手 参考IP地址:*.*.*.*
2013/8/23 14:14:54
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
当使用IO 功能时,
PORTF_FER 对应IO接口位设置为0,无需设置MUX寄存器。
寄存器更换是正确的。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/8/23 23:11:10
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159262 Call, 1 Queries, Processed in 0.031006 second(s),