SAM9 ISI and TCM8240MD camera

i have been working with a sam9260 ek board and a tcm8240 MD camera with eclipse and sam ice tool everything is working just fine. i manage to get to work i2c comunication and configurating the camera to start sending frames but i think i have problems with de configuration of the isi periferial because in the buffer that is supposed to have the frames there are no frames

code :

unsigned int i;

unsigned int bufferIMG[1000000];

Async async;

unsigned int numErrors;

unsigned long temp=0;

PIO_Configure(pins, PIO_LISTSIZE(pins));

TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);

printf(“-- Basic TWI EEPROM Project %s –\n\r”, SOFTPACK_VERSION);

printf(“-- %s\n\r”, BOARD_NAME);

printf(“-- Compiled: %s %s –\n\r”, DATE, TIME);

// Configure TWI

// In IRQ mode: to avoid problems, the priority of the TWI IRQ must be max.

// In polling mode: try to disable all IRQs if possible.

// (in this example it does not matter, there is only the TWI IRQ active)

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TWI;

TWI_ConfigureMaster(AT91C_BASE_TWI, TWCK, BOARD_MCK);

TWID_Initialize(&twid, AT91C_BASE_TWI);

AIC_ConfigureIT(AT91C_ID_TWI, 0, ISR_Twi);

AIC_EnableIT(AT91C_ID_TWI);

//CONFIG RST_CAM PIN

PIO_Configure(&ISI_RST, 1); // Configura Pin reset para camara como salida

PIO_Clear(&ISI_RST); // Camara en reset

// Erase page #0 and #1

memset(pData, 0, PAGE_SIZE);

printf(“-I- 2.0 Filling page #0 with zeroes …\n\r”);

TWID_Write(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);

// Wait at least 10 ms

for (i=0; i < 1000000; i++);

printf(“-I- Filling page #1 with zeroes …\n\r”);

TWID_Write(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, 0);

// Wait at least 10 ms

for (i=0; i < 1000000; i++);

// Synchronous operation

printf(“-I- Read/write on page #0 (polling mode)\n\r”);

// Write checkerboard pattern in first page

for (i=0; i < PAGE_SIZE; i++) {

// Even

if ((i & 1) == 0) {

pData = 0xA5;
}
// Odd
else {
pData = 0x5A;
}
}
TWID_Write(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Read back data
memset(pData, 0, PAGE_SIZE);
TWID_Read(&twid, AT24C_ADDRESS, 0x0000, 2, pData, PAGE_SIZE, 0);
// Compare
numErrors = 0;
for (i=0; i < PAGE_SIZE; i++) {
// Even
if (((i & 1) == 0) && (pData != 0xA5)) {
printf(“-E- Data mismatch at offset #%u: expected 0xA5, read 0x%02X\n\r”, i, pData);
numErrors++;
}
// Odd
else if (((i & 1) == 1) && (pData != 0x5A)) {
printf(“-E- Data mismatch at offset #%u: expected 0x5A, read 0x%02X\n\r”, i, pData);
numErrors++;
}
}
printf(“-I- %u comparison error(s) found\n\r”, numErrors);
// Asynchronous operation
printf(“-I- Read/write on page #1 (IRQ mode)\n\r”);
// Write checkerboard pattern in first page
for (i=0; i < PAGE_SIZE; i++) {
// Even
if ((i & 1) == 0) {
pData = 0xA5;
}
// Odd
else {
pData = 0x5A;
}
}
memset(&async, 0, sizeof(async));
async.callback = (void *) TestCallback;
TWID_Write(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, &async);
while (!ASYNC_IsFinished(&async));
printf(“finish sending\n\r”);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Read back data
memset(pData, 0, PAGE_SIZE);
memset(&async, 0, sizeof(async));
async.callback = (void *) TestCallback;
TWID_Read(&twid, AT24C_ADDRESS, 0x0100, 2, pData, PAGE_SIZE, &async);
while (!ASYNC_IsFinished(&async));
// Compare
numErrors = 0;
for (i=0; i < PAGE_SIZE; i++) {
// Even
if (((i & 1) == 0) && (pData != 0xA5)) {
printf(“-E- Data mismatch at offset #%u: expected 0xA5, read 0x%02X\n\r”, i, pData);
numErrors++;
}
// Odd
else if (((i & 1) == 1) && (pData != 0x5A)) {
printf(“-E- Data mismatch at offset #%u: expected 0x5A, read 0x%02X\n\r”, i, pData*);*
numErrors++;
}
}
printf(“-I- %u comparison error(s) found\n\r”, numErrors);
printf(" -I- Setting up PCK1 Clock\n\r");
//Configura reloj programable PCK1
AT91C_BASE_PMC->PMC_PCKR[1] = 0x5;//0x1; // fuente reloj main, sin divisor
// Habilita reloj PCK1
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK1;
// Espera que esté listo reloj PCK1
while((AT91C_BASE_PMC->PMC_SCSR & AT91C_PMC_PCK1) == 0);
// DESPUES DE ACTIVADO RELOJ SE DEBE ESPERAR >1ms ANTES DE ACTIVAR RESET
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
PIO_Set(&ISI_RST); // Camara en reset
printf(“CAM TEST I2C\n\r”);
for (i=0; i < 1000000; i++);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Wait at least 10 ms
for (i=0; i < 1000000; i++);
// Wait at least 10 ms
memset(pData,0x0F, PAGE_SIZE);
TWID_Read(&twid,TCM8240MD_ADDRESS,0x00, 1, pData, 7, 0);
for (i=0;i<7;i++)
{printf(“Read ->%d- %X \n\r”,i,pData*);}*
//pData[0]=0xC1;
//TWID_Write(&twid, TCM8240MD_ADDRESS, 0x03, 1, pData, 1, 0);
//AT91C_BASE_HISI->ISI_IER =0x;
memset(bufferIMG,0,1000000);
pData[0]=0x00;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x02,1,pData,1,0); //Set Camera Active (I assume you did this?)
pData[0]=0x00;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x0B,1,pData,1,0);// White Line OFF
pData[0]=0x20;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x58,1,pData,1,0);// Exposure Time
pData[0]=0x00;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x05,1,pData,1,0);// Frame Rate Quarter
pData[0]=0xFF;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x1A,1,pData,1,0);// HCOUNT = 0x3FF = 1023
pData[0]=0xB3;
TWID_Write(&twid,TCM8240MD_ADDRESS,0x1B,1,pData,1,0);// VCOUNT = 0x21B = 539
pData[0]=0x4A;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x11,1,pData,1,0);// VCOUNT = 0x21B = 539
pData[0]=0x33;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x14,1,pData,1,0);// // Changed b/c of PICSIZE
pData[0]=0x0D;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x04,1,pData,1,0);// RGB 352x288 OUT ON
pData[0]=0x0B;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x1F,1,pData,1,0);// // SPCOUNT = 0xBC3 = 3011 // Doesn’t match formula?
pData[0]=0xC3;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x1E,1,pData,1,0);// SPCOUNT[7:0]
pData[0]=0x1E ;
TWID_Write(&twid,TCM8240MD_ADDRESS, 0x0E,1,pData,1,0);// SPCOUNT[7:0]
AT91C_BASE_ISI->ISI_SR =0x00000000;
//AT91C_BASE_ISI->ISI_CR1 =0x00009010;
AT91C_BASE_ISI->ISI_CR1 =0x00009000;
AT91C_BASE_ISI->ISI_CR2 =0x01609120;
AT91C_BASE_ISI->ISI_CDBA =bufferIMG;
////////////////////////////////////END
can some one help with these has someo ne manage to make isi work with these cam?
Thx for the help :wink:

If you use the atmel isi driver you need to make sure it does not use has_emb_sync. That is, you want your isi to use hsync/vsync with pure data on the databus. No embedded start or stop of frame indications.

Then it should work if you have the right data-format.

I just wish I could configure the cams registers correctly. My images are pink while the test color bar images are perfect…