Re-commitiing with pins for F401RE setup.
Dependencies: SDFileSystem mbed
main.cpp@3:2f9cbbda52e8, 2015-04-06 (annotated)
- Committer:
- mcgoverna
- Date:
- Mon Apr 06 22:17:20 2015 +0000
- Revision:
- 3:2f9cbbda52e8
- Parent:
- 2:2b3a04c086da
- Child:
- 4:3bbf0941481f
Current. Works
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcgoverna | 3:2f9cbbda52e8 | 1 | 0/******************************************************************************************************* |
mcgoverna | 1:43abfc6827c6 | 2 | This code uses the LS-Y202 camera module to take an image, and save it an SD card. |
mcgoverna | 1:43abfc6827c6 | 3 | The SD card is interfaced via an SD card shield. |
mcgoverna | 1:43abfc6827c6 | 4 | |
mcgoverna | 1:43abfc6827c6 | 5 | Porting example Arduino code for camera module: |
mcgoverna | 0:c88af26224b8 | 6 | http://learn.linksprite.com/jpeg-camera/tutorial-of-using-linksprite-2mp-uart-jpeg-camera-with-arduino/ |
mcgoverna | 1:43abfc6827c6 | 7 | ********************************************************************************************************/ |
mcgoverna | 0:c88af26224b8 | 8 | |
mcgoverna | 0:c88af26224b8 | 9 | #include "mbed.h" |
mcgoverna | 1:43abfc6827c6 | 10 | #include "SDFileSystem.h" // for SD card interface |
mcgoverna | 1:43abfc6827c6 | 11 | #include "stdio.h" |
mcgoverna | 1:43abfc6827c6 | 12 | #include "stdlib.h" |
mcgoverna | 0:c88af26224b8 | 13 | |
mcgoverna | 1:43abfc6827c6 | 14 | Serial pc(USBTX, USBRX); // tx, rx, communicate with PC |
mcgoverna | 1:43abfc6827c6 | 15 | Serial cam(D8, D2); // tx, rx, (Camera to) Nucleo |
mcgoverna | 1:43abfc6827c6 | 16 | SDFileSystem sd(D11, D12, D13, D10, "sd"); // mosi, miso, sclk, cs, name |
mcgoverna | 0:c88af26224b8 | 17 | |
mcgoverna | 1:43abfc6827c6 | 18 | uint8_t ZERO = 0x00; |
mcgoverna | 1:43abfc6827c6 | 19 | uint8_t incomingbyte; |
mcgoverna | 1:43abfc6827c6 | 20 | long int addr_var = 0x0000; |
mcgoverna | 1:43abfc6827c6 | 21 | uint8_t MH, ML; |
mcgoverna | 1:43abfc6827c6 | 22 | bool EndFlag=0; |
mcgoverna | 1:43abfc6827c6 | 23 | |
mcgoverna | 1:43abfc6827c6 | 24 | ///// UART FIFO Buffer functions //////////////////////////////////////////////////// |
mcgoverna | 1:43abfc6827c6 | 25 | volatile int rx_in=0; // FIFO buffer end |
mcgoverna | 1:43abfc6827c6 | 26 | volatile int rx_out=0; // FIFO buffer beginning |
mcgoverna | 1:43abfc6827c6 | 27 | const int buffer_size = 255; // |
mcgoverna | 1:43abfc6827c6 | 28 | char rx_buffer[buffer_size+1]; // actual FIFO buffer |
mcgoverna | 0:c88af26224b8 | 29 | |
mcgoverna | 1:43abfc6827c6 | 30 | // Interrupt when UART recieve |
mcgoverna | 1:43abfc6827c6 | 31 | void cam_Rx_interrupt() { |
mcgoverna | 1:43abfc6827c6 | 32 | // Loop just in case more than one character is in UART's receive FIFO buffer |
mcgoverna | 1:43abfc6827c6 | 33 | // Stop if buffer full |
mcgoverna | 1:43abfc6827c6 | 34 | while ((cam.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) { |
mcgoverna | 1:43abfc6827c6 | 35 | rx_buffer[rx_in] = cam.getc(); |
mcgoverna | 1:43abfc6827c6 | 36 | rx_in = (rx_in + 1) % buffer_size; |
mcgoverna | 1:43abfc6827c6 | 37 | } |
mcgoverna | 1:43abfc6827c6 | 38 | return; |
mcgoverna | 1:43abfc6827c6 | 39 | } |
mcgoverna | 1:43abfc6827c6 | 40 | |
mcgoverna | 1:43abfc6827c6 | 41 | // Read and throw away camera return (ACK) bytes |
mcgoverna | 1:43abfc6827c6 | 42 | // Currently coded for five bytes, |
mcgoverna | 1:43abfc6827c6 | 43 | // but may want to allow calling with an input parameter. |
mcgoverna | 1:43abfc6827c6 | 44 | void read_ack() { |
mcgoverna | 1:43abfc6827c6 | 45 | char ack_bytes[7]; // |
mcgoverna | 1:43abfc6827c6 | 46 | int i = 0; // loop counter |
mcgoverna | 1:43abfc6827c6 | 47 | |
mcgoverna | 1:43abfc6827c6 | 48 | // wait for 5 ack bytes |
mcgoverna | 1:43abfc6827c6 | 49 | while((rx_in >= rx_out) && (rx_in - rx_out < 5) || (rx_in < rx_out) && (rx_in + buffer_size - rx_out < 5)); |
mcgoverna | 1:43abfc6827c6 | 50 | |
mcgoverna | 1:43abfc6827c6 | 51 | __disable_irq(); // disable interrupt while reading to ack_bytes buffer |
mcgoverna | 1:43abfc6827c6 | 52 | |
mcgoverna | 1:43abfc6827c6 | 53 | for(i=0; i<5; i++) { // fill buffer and throw away |
mcgoverna | 1:43abfc6827c6 | 54 | ack_bytes[i] = rx_buffer[rx_out]; |
mcgoverna | 1:43abfc6827c6 | 55 | rx_out = (rx_out + 1) % buffer_size; |
mcgoverna | 1:43abfc6827c6 | 56 | } |
mcgoverna | 1:43abfc6827c6 | 57 | ack_bytes[i+1] = NULL; // add null to end for print string |
mcgoverna | 1:43abfc6827c6 | 58 | |
mcgoverna | 1:43abfc6827c6 | 59 | pc.printf("\n\rAck bytes: %s\n\r", ack_bytes); |
mcgoverna | 1:43abfc6827c6 | 60 | |
mcgoverna | 1:43abfc6827c6 | 61 | __enable_irq(); // |
mcgoverna | 1:43abfc6827c6 | 62 | return; |
mcgoverna | 1:43abfc6827c6 | 63 | } |
mcgoverna | 1:43abfc6827c6 | 64 | |
mcgoverna | 1:43abfc6827c6 | 65 | char get_byte(){ // get a byte from UART buffer |
mcgoverna | 1:43abfc6827c6 | 66 | char p; |
mcgoverna | 1:43abfc6827c6 | 67 | while(rx_in == rx_out);// wait for byte |
mcgoverna | 1:43abfc6827c6 | 68 | __disable_irq(); // disable interrupts |
mcgoverna | 1:43abfc6827c6 | 69 | p = rx_buffer[rx_out]; // get byte |
mcgoverna | 1:43abfc6827c6 | 70 | rx_out = (rx_out + 1) % buffer_size; // update buffer start |
mcgoverna | 1:43abfc6827c6 | 71 | __enable_irq(); // enable interrrupts |
mcgoverna | 1:43abfc6827c6 | 72 | return p; // return byte |
mcgoverna | 1:43abfc6827c6 | 73 | } |
mcgoverna | 1:43abfc6827c6 | 74 | /////////////////////////////////////////////////////////////////////////////// |
mcgoverna | 1:43abfc6827c6 | 75 | |
mcgoverna | 1:43abfc6827c6 | 76 | // Camera Functions /// |
mcgoverna | 0:c88af26224b8 | 77 | void SendResetCmd() |
mcgoverna | 0:c88af26224b8 | 78 | { |
mcgoverna | 1:43abfc6827c6 | 79 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 80 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 81 | cam.putc(0x26); |
mcgoverna | 1:43abfc6827c6 | 82 | cam.putc(ZERO); |
mcgoverna | 0:c88af26224b8 | 83 | } |
mcgoverna | 0:c88af26224b8 | 84 | |
mcgoverna | 1:43abfc6827c6 | 85 | /************************************* |
mcgoverna | 1:43abfc6827c6 | 86 | Set ImageSize : |
mcgoverna | 1:43abfc6827c6 | 87 | <1> 0x22 : 160*120 |
mcgoverna | 1:43abfc6827c6 | 88 | <2> 0x11 : 320*240 |
mcgoverna | 1:43abfc6827c6 | 89 | <3> 0x00 : 640*480 |
mcgoverna | 1:43abfc6827c6 | 90 | <4> 0x1D : 800*600 |
mcgoverna | 1:43abfc6827c6 | 91 | <5> 0x1C : 1024*768 |
mcgoverna | 1:43abfc6827c6 | 92 | <6> 0x1B : 1280*960 |
mcgoverna | 1:43abfc6827c6 | 93 | <7> 0x21 : 1600*1200 |
mcgoverna | 1:43abfc6827c6 | 94 | ************************************/ |
mcgoverna | 1:43abfc6827c6 | 95 | void SetImageSizeCmd(char Size) |
mcgoverna | 0:c88af26224b8 | 96 | { |
mcgoverna | 1:43abfc6827c6 | 97 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 98 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 99 | cam.putc(0x54); |
mcgoverna | 1:43abfc6827c6 | 100 | cam.putc(0x01); |
mcgoverna | 1:43abfc6827c6 | 101 | cam.putc(Size); |
mcgoverna | 0:c88af26224b8 | 102 | } |
mcgoverna | 0:c88af26224b8 | 103 | |
mcgoverna | 1:43abfc6827c6 | 104 | /************************************* |
mcgoverna | 1:43abfc6827c6 | 105 | Set BaudRate : |
mcgoverna | 1:43abfc6827c6 | 106 | <1> 0xAE : 9600 |
mcgoverna | 1:43abfc6827c6 | 107 | <2> 0x2A : 38400 |
mcgoverna | 1:43abfc6827c6 | 108 | <3> 0x1C : 57600 |
mcgoverna | 1:43abfc6827c6 | 109 | <4> 0x0D : 115200 |
mcgoverna | 1:43abfc6827c6 | 110 | <5> 0xAE : 128000 |
mcgoverna | 1:43abfc6827c6 | 111 | <6> 0x56 : 256000 |
mcgoverna | 1:43abfc6827c6 | 112 | *************************************/ |
mcgoverna | 2:2b3a04c086da | 113 | void SetBaudRateCmd(char baudrateHigh, char baudrateLow) |
mcgoverna | 0:c88af26224b8 | 114 | { |
mcgoverna | 1:43abfc6827c6 | 115 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 116 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 117 | cam.putc(0x24); |
mcgoverna | 1:43abfc6827c6 | 118 | cam.putc(0x03); |
mcgoverna | 1:43abfc6827c6 | 119 | cam.putc(0x01); |
mcgoverna | 2:2b3a04c086da | 120 | cam.putc(baudrateHigh); |
mcgoverna | 2:2b3a04c086da | 121 | cam.putc(baudrateLow); |
mcgoverna | 0:c88af26224b8 | 122 | } |
mcgoverna | 0:c88af26224b8 | 123 | |
mcgoverna | 0:c88af26224b8 | 124 | void SendTakePhotoCmd() |
mcgoverna | 0:c88af26224b8 | 125 | { |
mcgoverna | 1:43abfc6827c6 | 126 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 127 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 128 | cam.putc(0x36); |
mcgoverna | 1:43abfc6827c6 | 129 | cam.putc(0x01); |
mcgoverna | 1:43abfc6827c6 | 130 | cam.putc(ZERO); |
mcgoverna | 0:c88af26224b8 | 131 | } |
mcgoverna | 0:c88af26224b8 | 132 | |
mcgoverna | 0:c88af26224b8 | 133 | void SendReadDataCmd() |
mcgoverna | 0:c88af26224b8 | 134 | { |
mcgoverna | 1:43abfc6827c6 | 135 | MH=addr_var/0x100; |
mcgoverna | 1:43abfc6827c6 | 136 | ML=addr_var%0x100; |
mcgoverna | 1:43abfc6827c6 | 137 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 138 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 139 | cam.putc(0x32); |
mcgoverna | 1:43abfc6827c6 | 140 | cam.putc(0x0c); |
mcgoverna | 1:43abfc6827c6 | 141 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 142 | cam.putc(0x0a); |
mcgoverna | 1:43abfc6827c6 | 143 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 144 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 145 | cam.putc(MH); |
mcgoverna | 1:43abfc6827c6 | 146 | cam.putc(ML); |
mcgoverna | 1:43abfc6827c6 | 147 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 148 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 149 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 150 | cam.putc(0x20); |
mcgoverna | 1:43abfc6827c6 | 151 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 152 | cam.putc(0x0a); |
mcgoverna | 1:43abfc6827c6 | 153 | addr_var+=0x20; |
mcgoverna | 0:c88af26224b8 | 154 | } |
mcgoverna | 0:c88af26224b8 | 155 | |
mcgoverna | 0:c88af26224b8 | 156 | void StopTakePhotoCmd() |
mcgoverna | 0:c88af26224b8 | 157 | { |
mcgoverna | 1:43abfc6827c6 | 158 | cam.putc(0x56); |
mcgoverna | 1:43abfc6827c6 | 159 | cam.putc(ZERO); |
mcgoverna | 1:43abfc6827c6 | 160 | cam.putc(0x36); |
mcgoverna | 1:43abfc6827c6 | 161 | cam.putc(0x01); |
mcgoverna | 1:43abfc6827c6 | 162 | cam.putc(0x03); |
mcgoverna | 0:c88af26224b8 | 163 | } |
mcgoverna | 0:c88af26224b8 | 164 | |
mcgoverna | 1:43abfc6827c6 | 165 | int main(void) |
mcgoverna | 0:c88af26224b8 | 166 | { |
mcgoverna | 2:2b3a04c086da | 167 | pc.baud(128000); // for PC terminal display/communications |
mcgoverna | 1:43abfc6827c6 | 168 | pc.printf("\n\rStarting...\n\r"); // |
mcgoverna | 1:43abfc6827c6 | 169 | |
mcgoverna | 1:43abfc6827c6 | 170 | cam.attach(&cam_Rx_interrupt, Serial::RxIrq); // attach ISR to cam UART recieve |
mcgoverna | 1:43abfc6827c6 | 171 | |
mcgoverna | 1:43abfc6827c6 | 172 | uint8_t a[32]; |
mcgoverna | 1:43abfc6827c6 | 173 | int j, count, ii; |
mcgoverna | 2:2b3a04c086da | 174 | cam.baud(38400); |
mcgoverna | 1:43abfc6827c6 | 175 | wait(0.200); |
mcgoverna | 0:c88af26224b8 | 176 | SendResetCmd();//Wait 2-3 second to send take picture command |
mcgoverna | 1:43abfc6827c6 | 177 | wait(2.000); |
mcgoverna | 2:2b3a04c086da | 178 | // baud bytes = ((27E6 / baudrate) * 16 ) - 256 |
mcgoverna | 2:2b3a04c086da | 179 | // 0x2A, 0xF2 = 38400 |
mcgoverna | 2:2b3a04c086da | 180 | // 0x1C, 0x4C = 57600 |
mcgoverna | 2:2b3a04c086da | 181 | // 0x0D, 0xA6 = 115200 |
mcgoverna | 2:2b3a04c086da | 182 | // 0x0C, 0x2F = 128000 ??? (0xAE from DS) ??? |
mcgoverna | 2:2b3a04c086da | 183 | // 0x56, 0x = 256000 ??? (0x56 from DS) |
mcgoverna | 2:2b3a04c086da | 184 | SetBaudRateCmd(0x0D, 0xA6); |
mcgoverna | 1:43abfc6827c6 | 185 | wait(0.100); |
mcgoverna | 2:2b3a04c086da | 186 | cam.baud(115200); |
mcgoverna | 1:43abfc6827c6 | 187 | wait(0.100); |
mcgoverna | 2:2b3a04c086da | 188 | // 0x22 = 160*120, 0x11 = 320*240, 0x00 = 640*480, 0x1D = 800*600 |
mcgoverna | 2:2b3a04c086da | 189 | // 0x1C = 1024*768, 0x1B = 1280*960, 0x21 = 1600*1200 |
mcgoverna | 3:2f9cbbda52e8 | 190 | SetImageSizeCmd(0x1D); |
mcgoverna | 1:43abfc6827c6 | 191 | wait(0.100); |
mcgoverna | 0:c88af26224b8 | 192 | SendTakePhotoCmd(); |
mcgoverna | 1:43abfc6827c6 | 193 | wait(3); |
mcgoverna | 1:43abfc6827c6 | 194 | |
mcgoverna | 1:43abfc6827c6 | 195 | // Open SD card dir and file |
mcgoverna | 1:43abfc6827c6 | 196 | mkdir("/sd/mydir", 0777); |
mcgoverna | 1:43abfc6827c6 | 197 | FILE *fp = fopen("/sd/mydir/sdtest.jpg", "w"); |
mcgoverna | 1:43abfc6827c6 | 198 | if(fp == NULL) { |
mcgoverna | 1:43abfc6827c6 | 199 | error("\n\rCould not open file for write\n\r"); |
mcgoverna | 1:43abfc6827c6 | 200 | } |
mcgoverna | 1:43abfc6827c6 | 201 | |
mcgoverna | 1:43abfc6827c6 | 202 | rx_in = rx_out; // reset FIFO |
mcgoverna | 1:43abfc6827c6 | 203 | |
mcgoverna | 1:43abfc6827c6 | 204 | while(!EndFlag) // loop until end of image data |
mcgoverna | 0:c88af26224b8 | 205 | { |
mcgoverna | 1:43abfc6827c6 | 206 | j=0; // reset counters (this is done 32 bytes at a time) |
mcgoverna | 0:c88af26224b8 | 207 | count=0; |
mcgoverna | 1:43abfc6827c6 | 208 | SendReadDataCmd(); // |
mcgoverna | 1:43abfc6827c6 | 209 | read_ack(); // throw away ack/response bytes from read_data command |
mcgoverna | 1:43abfc6827c6 | 210 | while(rx_in == rx_out); // wait for data |
mcgoverna | 1:43abfc6827c6 | 211 | // data comes in 32 byte packets |
mcgoverna | 1:43abfc6827c6 | 212 | while((count < 32)) // fill 'a' buffer one byte at a time |
mcgoverna | 0:c88af26224b8 | 213 | { |
mcgoverna | 1:43abfc6827c6 | 214 | a[count] = get_byte(); |
mcgoverna | 1:43abfc6827c6 | 215 | if((a[count-1]==0xFF)&&(a[count]==0xD9)) |
mcgoverna | 1:43abfc6827c6 | 216 | { //tell if the picture is finished |
mcgoverna | 1:43abfc6827c6 | 217 | EndFlag=1; // end of image |
mcgoverna | 1:43abfc6827c6 | 218 | count++; |
mcgoverna | 1:43abfc6827c6 | 219 | break; |
mcgoverna | 1:43abfc6827c6 | 220 | } |
mcgoverna | 1:43abfc6827c6 | 221 | count++; |
mcgoverna | 1:43abfc6827c6 | 222 | } |
mcgoverna | 1:43abfc6827c6 | 223 | |
mcgoverna | 1:43abfc6827c6 | 224 | pc.printf("count: %d \n\r", count); |
mcgoverna | 1:43abfc6827c6 | 225 | |
mcgoverna | 1:43abfc6827c6 | 226 | // print data to PC |
mcgoverna | 1:43abfc6827c6 | 227 | for(j=0; j<count; j++) |
mcgoverna | 0:c88af26224b8 | 228 | { |
mcgoverna | 1:43abfc6827c6 | 229 | if(a[j]<0x10) pc.printf("0"); |
mcgoverna | 1:43abfc6827c6 | 230 | pc.printf("%x", a[j]); |
mcgoverna | 1:43abfc6827c6 | 231 | pc.printf(" "); |
mcgoverna | 0:c88af26224b8 | 232 | } |
mcgoverna | 1:43abfc6827c6 | 233 | pc.printf("\n\r"); |
mcgoverna | 1:43abfc6827c6 | 234 | |
mcgoverna | 1:43abfc6827c6 | 235 | // send data to SD card |
mcgoverna | 0:c88af26224b8 | 236 | for(ii=0; ii<count; ii++) |
mcgoverna | 1:43abfc6827c6 | 237 | fputc(a[ii],fp); |
mcgoverna | 1:43abfc6827c6 | 238 | |
mcgoverna | 1:43abfc6827c6 | 239 | read_ack();// throw away ack/response from end of read_data dat packet |
mcgoverna | 0:c88af26224b8 | 240 | } |
mcgoverna | 1:43abfc6827c6 | 241 | |
mcgoverna | 1:43abfc6827c6 | 242 | fclose(fp); |
mcgoverna | 1:43abfc6827c6 | 243 | pc.printf("\n\rFinished writing data to file\n\r"); |
mcgoverna | 0:c88af26224b8 | 244 | while(1); |
mcgoverna | 1:43abfc6827c6 | 245 | |
mcgoverna | 0:c88af26224b8 | 246 | } |
mcgoverna | 1:43abfc6827c6 | 247 |