SmartWheels self-driving race car. Designed for NXP Cup. Uses FRDM-KL25Z, area-scan camera, and simple image processing to detect and navigate any NXP spec track.

Dependencies:   TSI USBDevice mbed-dev

Fork of SmartWheels by haofan Zheng

Revision:
29:f87d8790f57d
Parent:
28:271fc8445e89
Child:
32:5badeff825dc
diff -r 271fc8445e89 -r f87d8790f57d Hardwares/ArduCAM.cpp
--- a/Hardwares/ArduCAM.cpp	Mon Feb 27 21:43:59 2017 +0000
+++ b/Hardwares/ArduCAM.cpp	Wed Mar 01 16:31:36 2017 +0000
@@ -1,10 +1,129 @@
 #include "ArduCAM.h"
 
+#include "GlobalVariable.h"
+#include "SWUSBServer.h"
+
 extern SPI g_spi_port;
 
+DigitalOut cam_cs(PIN_ACC_CS);
+
+DigitalOut testLED2(LED_RED, 1);
+
+/*
+inline static uint8_t ardu_cam_spi_io(int address, int value = 0x00)
+{
+    //g_spi_port.lock();
+    
+    cam_cs = 0;
+    g_spi_port.write(address);
+    uint8_t result = g_spi_port.write(value);
+    cam_cs = 1;
+    
+    //g_spi_port.unlock();
+    
+    return result;
+}
+*/
+
+//Write ArduChip internal registers
+void ardu_cam_write_reg(uint8_t addr, uint8_t data)
+{
+    ardu_cam_bus_write(addr | 0x80, data);
+}
+ 
+//Read ArduChip internal registers
+uint8_t ardu_cam_read_reg(uint8_t addr)
+{
+    uint8_t data;
+    data = ardu_cam_bus_read(addr & 0x7F);
+    return data;
+}
+
 bool ardu_cam_init()
 {
+    uint8_t VerNum = ardu_cam_read_reg(0x40);
+    VerNum = ardu_cam_read_reg(0x40);
+    
+    char buf[20];
+    sprintf(buf, "Ardu Ver %#x", VerNum);
+    g_core.GetUSBServer().PushReliableMsg('D', buf);
+    
+    ardu_cam_write_reg(ARDUCHIP_TEST1, ARDUCHIP_TEST_MSG);
+    uint8_t testV = ardu_cam_read_reg(ARDUCHIP_TEST1);
+    if(VerNum != 0x61 || testV != ARDUCHIP_TEST_MSG)
+    {
+        g_core.GetUSBServer().PushReliableMsg('D', "CameraInit Fa");
+        return false;
+    }
+    g_core.GetUSBServer().PushReliableMsg('D', "CameraInit Su");
+    
+    ardu_cam_set_mode(MCU2LCD_MODE);
+    ardu_cam_start_capture();
+    
+    wait(0.1);
+    ardu_cam_set_mode(CAM2LCD_MODE);
     
     
-    return false;
-}
\ No newline at end of file
+    unsigned char tempV = ardu_cam_read_reg(ARDUCHIP_MODE);
+    sprintf(buf, "Ardu Stat %#x", tempV);
+    g_core.GetUSBServer().PushReliableMsg('D', buf);
+    
+    tempV = ardu_cam_read_reg(ARDUCHIP_CAP_CTRL);
+    sprintf(buf, "Ardu FS1 %#x", tempV);
+    g_core.GetUSBServer().PushReliableMsg('D', buf);
+    
+    return true;
+}
+
+void ardu_cam_set_mode(uint8_t mode)
+{
+    //ardu_cam_bus_io(ARDUCHIP_MODE, mode);
+    switch(mode)
+    {
+        case MCU2LCD_MODE:
+            ardu_cam_write_reg(ARDUCHIP_MODE, MCU2LCD_MODE);
+            break;
+        case CAM2LCD_MODE:
+            ardu_cam_write_reg(ARDUCHIP_MODE, CAM2LCD_MODE);
+            break;
+        //case LCD2MCU_MODE:
+            //ardu_cam_write_reg(ARDUCHIP_MODE, LCD2MCU_MODE);
+            //break;
+        default:
+            ardu_cam_write_reg(ARDUCHIP_MODE, CAM2LCD_MODE);
+            break;
+    }
+}
+
+void ardu_cam_start_capture()
+{
+    ardu_cam_write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK);
+    ardu_cam_write_reg(ARDUCHIP_CAP_CTRL, 0x05);
+    ardu_cam_write_reg(ARDUCHIP_FIFO, FIFO_START_MASK);
+}
+
+int ardu_cam_bus_write(int address, int value)
+{
+    // take the SS pin low to select the chip:
+    cam_cs = 0;
+    //  send in the address and value via SPI:
+    g_spi_port.write(address);
+    g_spi_port.write(value);
+    // take the SS pin high to de-select the chip:
+    cam_cs = 1;
+    
+    return value;
+}
+ 
+uint8_t ardu_cam_bus_read(int address)
+{ 
+    uint8_t value = 0;
+    // take the SS pin low to select the chip:
+    cam_cs = 0;
+    //  send in the address and value via SPI:
+    g_spi_port.write(address);
+    value = g_spi_port.write(0x00);
+    // take the SS pin high to de-select the chip:
+    cam_cs = 1;
+    return value;
+}