static int ov7670_detect(struct i2c_client *client) { unsigned char v; int ret; ret = ov7670_init(client); if (ret < 0) return ret; ret = ov7670_read(client, REG_MIDH, &v); if (ret < 0) return ret; if (v != 0x7f) /* OV manuf. id. */ return -ENODEV; ret = ov7670_read(client, REG_MIDL, &v); if (ret < 0) return ret; if (v != 0xa2) return -ENODEV; /* * OK, we know we have an OmniVision chip...but which one? */ ret = ov7670_read(client, REG_PID, &v); if (ret < 0) return ret; if (v != 0x76) /* PID + VER = 0x76 / 0x73 */ return -ENODEV; ret = ov7670_read(client, REG_VER, &v); if (ret < 0) return ret; if (v != 0x73) /* PID + VER = 0x76 / 0x73 */ return -ENODEV; return 0; }
int main(void) { uint8_t addr1, addr2; /* i2c addresses */ uint16_t x, y; char buf[128]; /* temporary string buffer for various stuff */ /* uart stuff */ char rcvbuf[32], c; uint8_t rcvbufpos = 0; init_board(); ov7670_init(); printf("Camtest says hi!\n"); printf("System clock: [%d]\n", SystemCoreClock); UART0_PrintString("Camtest says hi!\r\n"); while (1) { c = UART0_Getchar(); if (c == EOF) { continue; } else if ((c >= 32) && (c <= 126)) { rcvbuf[rcvbufpos++] = c; } else if (c == 13) { rcvbuf[rcvbufpos++] = 0; rcvbufpos = 0; if (strcmp(rcvbuf, "getimage") == 0) { ov7670_readframe(); UART0_PrintString("OK\r\n"); } else if (strlen(rcvbuf) >= 9 && strncmp(rcvbuf, "getline ", 8) == 0) { y = atoi(rcvbuf + 8); for (x = 0; x < 160; x ++) { UART0_Sendchar(qqvgaframe1[x + (y * 160)]); UART0_Sendchar(qqvgaframe2[x + (y * 160)]); } } else if (strlen(rcvbuf) == 9 && strncmp(rcvbuf, "regr 0x", 7) == 0) { addr1 = strtoul(rcvbuf + 7, NULL, 16); sprintf(buf, "0x%.2x 0x%.2x\r\n", addr1, ov7670_get(addr1)); printf("%s", buf); UART0_PrintString(buf); } else if (strlen(rcvbuf) == 14 && strncmp(rcvbuf, "regw 0x", 7) == 0) { strncpy(buf, rcvbuf + 7, 2); buf[2] = 0; addr1 = strtoul((char *) buf, NULL, 16); addr2 = strtoul(rcvbuf + 12, NULL, 16); ov7670_set(addr1, addr2); sprintf(buf, "0x%.2x 0x%.2x\r\n", addr1, addr2); UART0_PrintString(buf); } else { UART0_PrintString("ERR\r\n"); printf("Unknown command: [%s]\n", rcvbuf); } } } return 0; }
void setup() { SYSTEMConfigPerformance(SYSCLK); // Initialize hardware UART2 and establish communication at 9600 bps UARTInit(9600); // Init i2c I2CInit(); // if (I2CInit((uint32_t) I2CMASTER) == 0) { // printf("Fatal error!\n"); // while (1); // } ov7670_init(); // включить таймер //T1CON = 0x8030; //OpenTimer2( T2_ON | T2_SOURCE_INT | T2_PS_1_8, 0x0008); //OpenTimer2( T2_ON | T2_SOURCE_INT | T2_PS_1_256, 0xFFFF); // This statement says: turn on timer2 | have it use an internal clock source | have it // use a prescaler of 1:256, and use a period of 0xFFFF or 2^16 cycles // Timer2 as configured would trigger an interrupt at a frequency of (80MHZ/256/65535), or 4.77 // times a second. //ConfigIntTimer2( T2_INT_ON | T2_INT_PRIOR_2); // This statement configured the timer to produce an interrupt with a priority of 2 //INTEnableSystemMultiVectoredInt(); // Use multi-vectored interrupts OpenTimer2(T2_ON | T2_PS_1_8, 0); OpenOC4( OC_ON | OC_TIMER_MODE32 | OC_TIMER2_SRC | OC_CONTINUE_PULSE | OC_LOW_HIGH , 0, 0 ); }