 |
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
|
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看下 谢谢恩
 ^_^
|
等级:  |
 2013/8/16 9:52:13
|
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
|
这家伙很懒,什么也没有留下!
|
等级:  |
 2013/8/16 10:33:26
|
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
|
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 编辑过」  ^_^
|
等级:  |
 2013/8/16 14:14:01
|
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
|
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; } 这家伙很懒,什么也没有留下!
|
等级:  |
 2013/8/22 20:53:45
|
头衔:社区公民
帮派:无帮无派
帖数:67
金钱:746
积分:86
注册时间:2013/8/2
|
谢谢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 编辑过」  ^_^
|
等级:  |
 2013/8/23 14:14:54
|
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
|
当使用IO 功能时, PORTF_FER 对应IO接口位设置为0,无需设置MUX寄存器。 寄存器更换是正确的。 这家伙很懒,什么也没有留下!
|
等级:  |
 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), |
 |