Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: MARY_CAMERA.cpp
- 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 ); } - - -