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

Committer:
hazheng
Date:
Thu Mar 02 04:22:56 2017 +0000
Revision:
30:ff7f83ad6369
Child:
32:5badeff825dc
Added OV2640 programs. Added CamRegBuf, which is a more general version of OV7725RegBuf.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hazheng 30:ff7f83ad6369 1 #include "CamRegBuf.h"
hazheng 30:ff7f83ad6369 2
hazheng 30:ff7f83ad6369 3 #include "PinAssignment.h"
hazheng 30:ff7f83ad6369 4 #include "Core.h"
hazheng 30:ff7f83ad6369 5 #include "SWUSBServer.h"
hazheng 30:ff7f83ad6369 6
hazheng 30:ff7f83ad6369 7 #include "CamRegDefinitions.h"
hazheng 30:ff7f83ad6369 8
hazheng 30:ff7f83ad6369 9 CamRegBuf::CamRegBuf(SW::Core & core, uint8_t writeAddr, uint8_t readAddr) :
hazheng 30:ff7f83ad6369 10 m_writeAddr(writeAddr),
hazheng 30:ff7f83ad6369 11 m_readAddr(readAddr),
hazheng 30:ff7f83ad6369 12 m_core(core),
hazheng 30:ff7f83ad6369 13 m_sccbCtrl(I2C(PIN_ORB_SDA, PIN_ORB_SCL))
hazheng 30:ff7f83ad6369 14 {
hazheng 30:ff7f83ad6369 15
hazheng 30:ff7f83ad6369 16 }
hazheng 30:ff7f83ad6369 17
hazheng 30:ff7f83ad6369 18 CamRegBuf::~CamRegBuf()
hazheng 30:ff7f83ad6369 19 {
hazheng 30:ff7f83ad6369 20
hazheng 30:ff7f83ad6369 21 }
hazheng 30:ff7f83ad6369 22
hazheng 30:ff7f83ad6369 23 //Blocking method. Do not use during the running state!!
hazheng 30:ff7f83ad6369 24 void CamRegBuf::SCCBWrite(uint8_t RegAddr, uint8_t Data)
hazheng 30:ff7f83ad6369 25 {
hazheng 30:ff7f83ad6369 26 m_sccbCtrl.lock();
hazheng 30:ff7f83ad6369 27 m_sccbCtrl.frequency(CAM_REG_I2CFREQ);
hazheng 30:ff7f83ad6369 28
hazheng 30:ff7f83ad6369 29 m_sccbCtrl.start();
hazheng 30:ff7f83ad6369 30
hazheng 30:ff7f83ad6369 31 m_sccbCtrl.write(m_writeAddr);
hazheng 30:ff7f83ad6369 32 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 33 m_sccbCtrl.write(RegAddr);
hazheng 30:ff7f83ad6369 34 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 35 m_sccbCtrl.write(Data);
hazheng 30:ff7f83ad6369 36 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 37
hazheng 30:ff7f83ad6369 38 m_sccbCtrl.stop();
hazheng 30:ff7f83ad6369 39
hazheng 30:ff7f83ad6369 40 m_sccbCtrl.unlock();
hazheng 30:ff7f83ad6369 41 }
hazheng 30:ff7f83ad6369 42
hazheng 30:ff7f83ad6369 43 //Blocking method. Do not use during the running state!!
hazheng 30:ff7f83ad6369 44 uint8_t CamRegBuf::SCCBRead(const uint8_t RegAddr)
hazheng 30:ff7f83ad6369 45 {
hazheng 30:ff7f83ad6369 46 m_sccbCtrl.lock();
hazheng 30:ff7f83ad6369 47 m_sccbCtrl.frequency(CAM_REG_I2CFREQ);
hazheng 30:ff7f83ad6369 48
hazheng 30:ff7f83ad6369 49 m_sccbCtrl.start();
hazheng 30:ff7f83ad6369 50
hazheng 30:ff7f83ad6369 51 m_sccbCtrl.write(m_writeAddr);
hazheng 30:ff7f83ad6369 52 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 53 m_sccbCtrl.write(RegAddr);
hazheng 30:ff7f83ad6369 54 m_sccbCtrl.stop();
hazheng 30:ff7f83ad6369 55 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 56
hazheng 30:ff7f83ad6369 57 m_sccbCtrl.start();
hazheng 30:ff7f83ad6369 58 m_sccbCtrl.write(m_readAddr);
hazheng 30:ff7f83ad6369 59 wait_us(CAM_REG_WRITEWAIT);
hazheng 30:ff7f83ad6369 60 char readValue = m_sccbCtrl.read(CAM_REG_NOACK);
hazheng 30:ff7f83ad6369 61
hazheng 30:ff7f83ad6369 62 m_sccbCtrl.stop();
hazheng 30:ff7f83ad6369 63
hazheng 30:ff7f83ad6369 64 m_sccbCtrl.unlock();
hazheng 30:ff7f83ad6369 65
hazheng 30:ff7f83ad6369 66 return readValue;
hazheng 30:ff7f83ad6369 67 }
hazheng 30:ff7f83ad6369 68
hazheng 30:ff7f83ad6369 69
hazheng 30:ff7f83ad6369 70 //Blocking method. Do not use during the running state!!
hazheng 30:ff7f83ad6369 71 void CamRegBuf::ReadRegisters()
hazheng 30:ff7f83ad6369 72 {
hazheng 30:ff7f83ad6369 73 for(int i = 0; i <= 0xff; ++i)
hazheng 30:ff7f83ad6369 74 {
hazheng 30:ff7f83ad6369 75 char buf[10];
hazheng 30:ff7f83ad6369 76 sprintf(buf, "%#x-%#x", i, SCCBRead(i));
hazheng 30:ff7f83ad6369 77 m_core.GetUSBServer().PushUnreliableMsg('D', buf);
hazheng 30:ff7f83ad6369 78
hazheng 30:ff7f83ad6369 79 wait(0.1);
hazheng 30:ff7f83ad6369 80 }
hazheng 30:ff7f83ad6369 81 }
hazheng 30:ff7f83ad6369 82
hazheng 30:ff7f83ad6369 83 void CamRegBuf::WriteRegSet(const struct sensor_reg * reglist)
hazheng 30:ff7f83ad6369 84 {
hazheng 30:ff7f83ad6369 85 unsigned int i = 0;
hazheng 30:ff7f83ad6369 86 while ((reglist[i].reg != 0xff) | (reglist[i].val != 0xff))
hazheng 30:ff7f83ad6369 87 {
hazheng 30:ff7f83ad6369 88 SCCBWrite(reglist[i].reg, reglist[i].val);
hazheng 30:ff7f83ad6369 89 ++i;
hazheng 30:ff7f83ad6369 90 }
hazheng 30:ff7f83ad6369 91 }