View previous topic :: View next topic |
Author |
Message |
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
Using I2C to interface with SCCB bus |
Posted: Fri Jun 04, 2010 1:37 pm |
|
|
Hi , Guys I did some some reading and most ppl said it possible to read and write to omnivisions SCCB protocol with standard i2c.
I have tried to do this but I am unsuccessful, has anyone got experience using this protocol with a CCS i2c command set ?
Any help will be greatly appreciated.
Note I have my tried my code on a little temp sensor on the Picdem 2 dev kits and it works but it is not working on the camera module. I'm reading a constant -1. _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 04, 2010 5:15 pm |
|
|
Quote: |
I have tried to do this but I am unsuccessful.
|
1. Post a link to the full data sheet for the product. This data sheet
should show the SCCB bus timing, all registers and any information
needed to talk to the product (using the SCCB bus).
2. Post your SCCB driver routines. For example, the CCS file 24256.c
has the driver routines for a 24LC256 eeprom. You should have a file
similar to that (containing code that you wrote).
3. Post your test program that calls the driver routines. This should
have the #include for the PIC, #fuses, #use delay, #use i2c, etc.,
and it should have a main(). It should do something to test that the
driver is working. The results of the test should be displayed in a
terminal window on the PIC, using printf. Or, perhaps the device
should just do something. Describe your test and how it works.
4. Make the code be as short as possible (no useless CCS Wizard code).
5. The posted code should be complete. For example, if we copy and
paste your code into an MPLAB project, it should compile with no errors.
6. Post a description of the hardware connections between the PIC and
the SCCB bus device. Describe any external components, such as
pull-up resistors, etc. Give the component values.
7. Post the type of PIC board that you are using with the SCCB bus
device ? You mentioned a PicDem2 "kit". Is it one of these boards
in the links below ? Tell us which one.
This is the original PicDem2-Plus:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010072
This is the new "Rohs" version.
http://www.microchipdirect.com/ProductSearch.aspx?Keywords=DM163022
It looks different in the prototype area. Notice the two silver "bars" in
that area of the photograph.
8. Post what you are currently seeing in the SCCB bus test when you
run the test program. Post why you think it's failing. Then post the
result that you would like to see. Give details.
9. Post your CCS compiler version. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1935 Location: Norman, OK
|
|
Posted: Fri Jun 04, 2010 5:50 pm |
|
|
...
Last edited by dyeatman on Sat Jun 05, 2010 7:29 am; edited 1 time in total |
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
|
Posted: Sat Jun 05, 2010 2:40 am |
|
|
Hi, I have added all the items you requested
1a) SCCB specification
http://www.ovt.com/download_document.php?type=document&DID=63
1b) ov5620 data sheet
http://www.express-hitech.com/resource/datasheet/OV5620.pdf
this data sheet is preliminary but I have compared the interested areas with my confidential one and its similar.
2&3&4&5)
Code: | #include "16F877A.h"
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=n, stop=1)
//sets up the I2C pins
#define Device_SDA PIN_C4
#define Device_SCL PIN_C3
//Configures the I2C
#use i2c(master,sda=Device_SDA,scl=Device_SCL)
void main()
{
while(TRUE)
{
while(input_state(PIN_B0)==0)
{
//variable to camera id in
signed int8 value = 0x0;
//i2c routine
i2c_start();
i2c_write(0x60);
i2c_write(0x1C);
//i2c_start();
i2c_write(0x61);
value = i2c_read(0x0);
i2c_stop();
printf("camera ID: %d",value);
output_high(pin_B1);
delay_ms(1000);
}
}
} | From the code above the second i2c start is commented out because in the sccb specification for a read you need only need start+deviceid(W)(X)+deviceaddr(X)+deviceid(R)(X)+devicedata(X)+stop
The X's refers to dont care bits, thus a second start to reverse the direction is not specified.
So the above code works when I push the B0 button the code runs 'while = 1', setups the i2c and does a read then prints to the uart and computer.
Finally pin b1 goes high to show me I have run thorough the code.
6)I made a pcb in which the camera slides in to make its pins more accessible. The camera uses 2.8v so I used a lvl translator between the pic which runs on 3.3v and the camera. I have tested the i2c data and clk one both sides of the lvl translator and all signals are translated and looks good. On the camera board I use 4k7 pullups.
MY end application is a camera system used on a satellite so I am using a actel fpga for all the parallel interconnect between the camera my sram and final storage (this is just some extra info and not necessary for the task at hand)
7) Yes im using the second board on this web page http://www.microchipdirect.com/ProductSearch.aspx?Keywords=DM163022
8)When I run the test i receive a -1 in place where I should receive a manufacturers id of 7F or at least the high byte of the ID. I have tested the code above by using the second i2c_start command and reading the temperature sensor on the pic dem board and displaying it on the uart and it works nice using putty.
9) Lastly im using ccs 4.104 running under a xp addon for windows 7 because i could not get the ICD's to work under win 7 64bit
Thx allot I i can add more information please let me know
Regards
Jacques _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
|
Posted: Sun Jun 06, 2010 3:19 am |
|
|
Was in contact with the design engineer and he said I need to feed the camera with a active clk for the internal sccb engine to function.
I am going to try it and post my results.
Added power down and reset but I'm still reading a -1. _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jun 06, 2010 10:12 pm |
|
|
This document gives a sample protocol to read the manufacturer ID
word from the OV6120, which is similar camera. Look on page 15.
http://www.kanecomputing.co.uk/pdfs/d_module%20to%20cmos%20image%20sensor.pdf
I've implemented that protocol in the program below. I changed the
device addresses to 0x60 and 0x61, because the OV5620 data sheet
says to use those addresses. The manufacturer ID is the same for
both the OV6120 and OV5620. It's 0x7FA2.
If this code doesn't work then post a link to your schematic which
shows the PIC, the OV5620, and the level shifter circuit (with all
components).
Code: |
#include <16F877A.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)
#define OV5620_WRITE_ADDR 0x60
#define OV5620_READ_ADDR 0x61
#define OV5620_ID_REG 0x1C
int16 read_manufacturer_id(void)
{
int8 lsb;
int8 msb;
int16 retval;
i2c_start();
i2c_write(OV5620_WRITE_ADDR);
i2c_write(OV5620_ID_REG);
i2c_stop();
delay_us(2); // Bus Free time (OV5620 data sheet, pg. 11)
i2c_start();
i2c_write(OV5620_READ_ADDR);
msb = i2c_read();
lsb = i2c_read(0);
i2c_stop();
retval = make16(msb, lsb);
return(retval);
}
//===============================
void main()
{
int16 id;
delay_ms(1); // Reset settling time (OV5620 data sheet, pg. 10)
id = read_manufacturer_id();
printf("Mfr id = %lx \n\r", id); // Should be 0x7FA2
while(1);
}
|
|
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
:) |
Posted: Mon Jun 07, 2010 3:35 am |
|
|
Thank you kind SiR
And it works.....
thx thx _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
Checking for ACK |
Posted: Wed Oct 20, 2010 10:49 am |
|
|
Hi Guys, How Can I check for an Ack in the above code?
Thx _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
Checking for ACK |
Posted: Wed Oct 20, 2010 12:18 pm |
|
|
Hi Can I try something like this:
Code: |
if(!i2c_write(OV5620_WRITE_ADDR))
{
i2c_start();
i2c_write(OV5620_WRITE_ADDR);
i2c_write(OV5620_ID_REG);
i2c_stop();
} |
before I send the camera a new command.
Because at the moment I am only reading 0xFF :(
I don't know what happened between my last post when it worked until now.
Kindest Regards _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
|
Posted: Wed Oct 20, 2010 1:09 pm |
|
|
I will be back at my university lab tomorrow, to see if I can get a peep from my camera.
Thanks for the assistance _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 20, 2010 1:14 pm |
|
|
Make sure you have 4.7K pull-up resistors installed on SCL and SDA.
Also check the camera's menu, to make sure the i2c interface is enabled. |
|
|
jacqueskleynhans
Joined: 10 Apr 2008 Posts: 109 Location: Cape Town, South Africa
|
|
Posted: Wed Oct 20, 2010 1:47 pm |
|
|
HI PCM,
I am using the older original picdem2 plus board (As far as I could remember that board has 4k7 pull ups.) through a level shifter(don't really know if this is needed) to shift the voltage from 3.3v to 2.8v used by the OV5620 camera sensor (i2c).
Also the camera is using SCCB interface but the code you helped on in the top of this post got me to read back the manufactures ID so I know it works but now I can't get it to work. Hopefully its a magic loose wire that I'll plug in and voila.
The ack checking routine is quite interesting and I will definitely utilise it in future projects of mine.
I have viewed the I2C from the level shifter to the camera and everything looks corrects as the line is being release for the ack but then the camera does nothing its like throwing rock at a wall i2c commands at pins. I have tested the camera... Got a little dev kit or more like a interface to usb board with it so I know it works software is kinda [censored] but it works.
I have this one
http://www.electronics123.com/s.nl/it.A/id.2787/.f
So thats it _________________ "THE ONLY EASY DAY WAS YESTERDAY" |
|
|
|