Tedd OKANO / MARY_CAMERA
Revision:
2:ee71ffdf317e
Parent:
0:f4584dba3bac
Child:
3:e5752853eb26
--- a/MARY_CAMERA.cpp	Fri Feb 14 14:19:49 2014 +0000
+++ b/MARY_CAMERA.cpp	Mon Feb 17 05:57:10 2014 +0000
@@ -1,6 +1,9 @@
 #include    "mbed.h"
 #include    "MARY_CAMERA.h"
 
+#define PARAM_NUM       99
+#define CAM_I2C_ADDR    0x42
+
 const char param[2][PARAM_NUM] = {
     {
         0x01,0x02,0x03,0x0c,0x0e,0x0f,0x11,0x12,0x15,0x16,0x17,0x18,0x19,0x1a,0x1e,0x21,0x22,
@@ -25,10 +28,19 @@
 #define     RESET_PULSE_WIDTH   100     //  mili-seconds
 #define     RESET_RECOVERY_TIME 100     //  mili-seconds
 
+#define     COMMAND_WRITE                   0x00
+#define     COMMAND_READ                    0x80
+#define     COMMAND_ADDR_INCREMENT          0x20
 
-#define     PIXEL_PER_LINE  176
-#define     BYTE_PER_PIXEL  2
-#define     BYTE_PER_LINE   (PIXEL_PER_LINE * BYTE_PER_PIXEL)
+#define     MEMORY_ADDR_LOW__REGISTER       0x0
+#define     MEMORY_ADDR_MID__REGISTER       0x1
+#define     MEMORY_ADDR_HIGH_REGISTER       0x2
+#define     CAMERA_DATA_REGISTER            0x8
+#define     CONTROL_DATA_REGISTER           0x3
+#define     STATUS_REGISTER                 0x4
+
+#define     CONTROL__PAUSE_BUFFER_UPDATE    0x01
+#define     CONTROL__RESUME_BUFFER_UPDATE   0x00
 
 
 
@@ -37,14 +49,12 @@
     PinName spi_miso,
     PinName spi_sck,
     PinName spi_cs,
-    PinName cam_vsync,
     PinName cam_reset,
     PinName i2c_sda,
     PinName i2c_scl
-) : 
-spi( spi_mosi, spi_miso, spi_sck ),
+) :
+    spi( spi_mosi, spi_miso, spi_sck ),
     cs( spi_cs ),
-    vsync( cam_vsync ),
     reset( cam_reset ),
     i2c( i2c_sda, i2c_scl )
 {
@@ -59,7 +69,6 @@
  */
 void MARY_CAMERA::init( void )
 {
-    vsync   = 0;
     cs      = 1;
 
     reset = 0;
@@ -70,17 +79,27 @@
 
 
     for ( int i = 0; i < PARAM_NUM; i++ ) {
+#if 1
         i2c.start();
         i2c.write( CAM_I2C_ADDR );
         i2c.write( param[ 0 ][ i ] );
         i2c.write( param[ 1 ][ i ] );
         i2c.stop();
+#else
+
+        char    s[ 2 ];
+
+        s[ 0 ]  = param[ 0 ][ i ];
+        s[ 1 ]  = param[ 1 ][ i ];
+
+        i2c.write( CAM_I2C_ADDR, s, 2 );
+
+#endif
         wait_ms( 20 );
     }
 
-    spi.format(8);
+    spi.format( 8 );
     spi.frequency( SPI_FREQUENCY );
-    vsync   = 0;
 }
 
 void MARY_CAMERA::transfer_a_line( short *p, int line_number, int x_offset, int n_of_pixels )
@@ -104,14 +123,16 @@
     return ( send_spi( COMMAND_READ | reg | ((reg == CAMERA_DATA_REGISTER) ? COMMAND_ADDR_INCREMENT : 0x00) ) );
 }
 
+#define TIMING_ADJUST   100
+
 void MARY_CAMERA::open_transfer( void )
 {
     write_register( CONTROL_DATA_REGISTER, CONTROL__PAUSE_BUFFER_UPDATE );
 
-    vsync   = 0;
-
     read_register( STATUS_REGISTER );
-    while ( !(read_register( STATUS_REGISTER ) & 0x1) ); //  wait until LSB becomes '1'
+    while ( !(read_register( STATUS_REGISTER ) & 0x1) ) { //  wait until LSB becomes '1'
+        wait_us( TIMING_ADJUST );
+    }
 }
 
 void MARY_CAMERA::close_transfer( void )
@@ -119,17 +140,20 @@
     write_register( CONTROL_DATA_REGISTER, CONTROL__RESUME_BUFFER_UPDATE );
 
     read_register( STATUS_REGISTER );
-    while ( read_register( STATUS_REGISTER ) & 0x1 ); //  wait until LSB becomes '0'
-
-    vsync   = 1;
+    while ( read_register( STATUS_REGISTER ) & 0x1 ) { //  wait until LSB becomes '0'
+        wait_us( TIMING_ADJUST );
+    }
 }
 
 
 void MARY_CAMERA::set_address( int address )
 {
     write_register( MEMORY_ADDR_LOW__REGISTER, (address >>  0) & 0xFF );
+        wait_us( TIMING_ADJUST );
     write_register( MEMORY_ADDR_MID__REGISTER, (address >>  8) & 0xFF );
+        wait_us( TIMING_ADJUST );
     write_register( MEMORY_ADDR_HIGH_REGISTER, (address >> 16) & 0xFF );
+        wait_us( TIMING_ADJUST );
 }
 
 int MARY_CAMERA::send_spi( char data )
@@ -139,9 +163,6 @@
     cs  = 0;
     tmp = spi.write( data );
     cs  = 1;
-
+    
     return ( tmp );
 }
-
-
-