Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.
Revision 13:bf45f592c2b6, committed 2015-07-13
- Comitter:
- dflet
- Date:
- Mon Jul 13 08:20:40 2015 +0000
- Parent:
- 12:7d75ba5deed1
- Child:
- 14:90603ea1e85b
- Commit message:
- WIP commit 14 i2c not working correctly.
Changed in this revision
--- a/FreeRTOS/FreeRTOSConfig.h Sun Jul 12 09:13:56 2015 +0000 +++ b/FreeRTOS/FreeRTOSConfig.h Mon Jul 13 08:20:40 2015 +0000 @@ -86,8 +86,8 @@ #define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) (20 * 1024) ) -#define configMAX_TASK_NAME_LEN ( 16 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) (48 * 1024) ) +#define configMAX_TASK_NAME_LEN ( 24 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1//0
--- a/camera_app/camera_app.cpp Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/camera_app.cpp Mon Jul 13 08:20:40 2015 +0000
@@ -272,6 +272,8 @@
//
I2CInit();
+ getCamId();
+
//
// Initialize camera sensor
//
@@ -362,11 +364,11 @@
// HttpDebug("frame size = 0x%x \r\n",g_frame_size_in_bytes);
uint8_t* Image = reinterpret_cast<uint8_t*>(&g_image.g_image_buffer);
-#if 0
+//#if 0
for(int i =0;i< 10;i++){
HttpDebug("0x%x ",Image[i]);
}
-#endif//if 0
+//#endif//if 0
//
// Create JPEG Header
//
--- a/camera_app/mt9d111/i2cconfig.cpp Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/i2cconfig.cpp Mon Jul 13 08:20:40 2015 +0000
@@ -50,7 +50,7 @@
#include "myBoardInit.h"
I2C i2c(PB_9, PB_8);
-
+int fail_count;
//*****************************************************************************
//
@@ -63,7 +63,7 @@
uint32_t I2CInit()
{
// Uart_Write((uint8_t*)"I2CInit \n\r");
- i2c.frequency (100000);
+ i2c.frequency (400000);
return 0;
}
@@ -84,30 +84,31 @@
//! \return 0: Success, < 0: Failure.
//
//****************************************************************************
-uint32_t I2CBufferRead(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferRead(int32_t ucDevAddr, uint8_t *ucBuffer,
int32_t ulSize, unsigned char ucFlags)
{
// Uart_Write((uint8_t*)"I2CBufferRead \n\r");
// uint32_t ulNdx;
- bool err;
-/* if(ucFlags == I2C_SEND_START){
+ int ack;
+// if(ucFlags == I2C_SEND_START){
i2c.start();
- }
-*/
+// }
+
// Set I2C slave address
- err = i2c.read(0xBB, ucBuffer, ulSize);
-/*
+ ack = i2c.read(ucDevAddr, (char*)ucBuffer, ulSize);
+ wait_us(20);
if(ucFlags == I2C_SEND_STOP){
i2c.stop();
}
-*/
+
// for(int i = 0;i<ulSize;i++){
// printf("0x%x ",ucBuffer[i]);
// }
// printf("\r\n");
-// if(err){
-// return 1;
-// }
+ if(ack != 0){
+ printf("NAK returned\r\n");
+ return -1;
+ }
return 0;
}
@@ -128,30 +129,58 @@
//
//****************************************************************************
-uint32_t I2CBufferWrite(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferWrite(int32_t ucDevAddr, uint8_t *ucBuffer,
int32_t ulSize,unsigned char ucFlags)
{
// Uart_Write((uint8_t*)"I2CBufferWrite \n\r");
// uint32_t ulNdx;
- bool err;
-/* if(ucFlags == I2C_SEND_START){
+
+ int ack;
+// if(ucFlags == I2C_SEND_START){
i2c.start();
- }
-*/
+// }
+
// Set I2C slave address
- err = i2c.write(ucDevAddr, ucBuffer, ulSize);
-/*
+ ack = i2c.write(ucDevAddr, (char*)ucBuffer, ulSize);
+ wait_us(20);
if(ucFlags == I2C_SEND_STOP){
i2c.stop();
}
+ fail_count++;
+/*
+ for(int i = 0;i<ulSize;i++){
+ printf("0x%x ",ucBuffer[i]);
+ }
+ printf("\r\n");
*/
-// if(!err){
-// return 1;
-// }
+ if(ack != 0){
+ printf("NAK returned on write %d\r\n",fail_count);
+ return -1;
+ }
return 0;
}
+void I2CBufferWriteByte(char dat){
+
+ int ack, ack2 = 0;
+
+// i2c.start();
+ ack = i2c.write((int)dat);
+ wait_us(20);
+ if(ack == 1){
+ ack2 = i2c.write((int)0x00);
+ wait_us(20);
+// i2c.stop();
+ }else{
+// i2c.stop();
+ printf("NAK received\r\n");
+ }
+ if(ack2 != 1){
+ printf("NAK received\r\n");
+ }
+}
+
//*****************************************************************************
//
// Close the Doxygen group.
--- a/camera_app/mt9d111/i2cconfig.h Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/i2cconfig.h Mon Jul 13 08:20:40 2015 +0000
@@ -60,11 +60,11 @@
// APIs
//******************************************************************************
uint32_t I2CInit(void);
-uint32_t I2CBufferRead(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferRead(int32_t ucDevAddr, uint8_t *ucBuffer,
int32_t ulSize,unsigned char ucFlags);
-uint32_t I2CBufferWrite(int32_t ucDevAddr, char *ucBuffer,
+int32_t I2CBufferWrite(int32_t ucDevAddr, uint8_t *ucBuffer,
int32_t ulSize,unsigned char ucFlags);
-
+void I2CBufferWriteByte(char dat);
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
--- a/camera_app/mt9d111/mt9d111.cpp Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/mt9d111.cpp Mon Jul 13 08:20:40 2015 +0000
@@ -44,17 +44,19 @@
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
+#include "mbed.h"
#include "mt9d111.h"
#include "i2cconfig.h"
#include "cc3100_sl_common.h"
#include "cli_uart.h"
+#include "HttpDebug.h"
#define RET_OK 0
#define RET_ERROR -1
#define SENSOR_PAGE_REG 0xF0
-#define CAM_I2C_SLAVE_ADDR 0xBA//((0xBA >> 1))//Write
-//#define CAM_I2C_SLAVE_ADDR 0xBB((0xBB >> 1))//Read
+#define CAM_I2C_SLAVE_WRITE 0x5D//((0xBA >> 1))//Write
+#define CAM_I2C_SLAVE_READ 0x5E//((0xBB >> 1))//Read
#ifndef ENABLE_JPEG
static const s_RegList preview_on_cmd_list[]= {
@@ -290,6 +292,27 @@
{1, 0xC8, 0x0005 }, // SEQ_CMD
};
+void getCamId(){
+
+ uint16_t Id = 0;
+ uint8_t ucBuffer[20];
+
+ ucBuffer[0] = 0x00;
+ ucBuffer[1] = 0x00;
+// i2c.start();
+ I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,1,1);
+// I2CBufferWrite(CAM_I2C_SLAVE_WRITE,);
+// i2c.stop();
+// i2c.start();
+// I2CBufferWriteByte();
+ I2CBufferRead(CAM_I2C_SLAVE_READ,ucBuffer,2,1);
+// i2c.stop();
+ Id = (uint16_t)ucBuffer[0] << 8 | (uint16_t)ucBuffer[1];
+
+ HttpDebug("\r\nCamera ID = 0x%x\r\n",Id);
+
+}
+
//*****************************************************************************
//
//! This function initilizes the camera sensor
@@ -418,7 +441,7 @@
unsigned int ulNdx;
unsigned short usTemp;
unsigned char i;
- char ucBuffer[20];
+ uint8_t ucBuffer[20];
unsigned int ulSize;
int lRetVal = -1;
@@ -433,6 +456,7 @@
{
// PageAddr == 100, insret a delay equal to reg value
wait_ms(pRegLst->usValue);// * 80000/3);
+// HttpDebug("usValue = 0x%x \n\r",pRegLst->usValue);
}
else if(pRegLst->ucPageAddr == 111)
{
@@ -440,35 +464,37 @@
do
{
ucBuffer[0] = pRegLst->ucRegAddr;
- lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,1);
+ printf("pRegLst->ucRegAddr = 0x%x \r\n",pRegLst->ucRegAddr);
+ lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,1,I2C_SEND_STOP);
ASSERT_ON_ERROR(lRetVal);
- if(I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,1))
+ if(0 != I2CBufferWrite(CAM_I2C_SLAVE_READ,ucBuffer,2,I2C_SEND_STOP))
{
- Uart_Write((uint8_t*)"\n\rError reading ucBuffer \n\r");
+ Uart_Write((uint8_t*)"\n\rError reading pRegLst->ucRegAddr \n\r");
return RET_ERROR;
}
usTemp = ucBuffer[0] << 8;
usTemp |= ucBuffer[1];
- usTemp = pRegLst->usValue;//Temp debug
+// usTemp = pRegLst->usValue;//Temp debug
}while(usTemp != pRegLst->usValue);
}
else
{
// Set the page
- ucBuffer[0] = SENSOR_PAGE_REG;
+ ucBuffer[0] = SENSOR_PAGE_REG;//0xF0
ucBuffer[1] = 0x00;
- ucBuffer[2] = (unsigned char)(pRegLst->ucPageAddr);
- if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,3,I2C_SEND_STOP))
+ ucBuffer[2] = pRegLst->ucPageAddr;
+ printf("pRegLst->ucRegAddr = 0x%x \r\n",pRegLst->ucRegAddr);
+ if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 3, I2C_SEND_STOP))
{
Uart_Write((uint8_t*)"\n\rError writing SENSOR_PAGE_REG \n\r");
return RET_ERROR;
}
ucBuffer[0] = SENSOR_PAGE_REG;
- lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,1,I2C_SEND_STOP);
+ lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_WRITE, ucBuffer, 1, I2C_SEND_STOP);
ASSERT_ON_ERROR(lRetVal);
- lRetVal = I2CBufferRead(CAM_I2C_SLAVE_ADDR,ucBuffer,2,I2C_SEND_STOP);
+ lRetVal = I2CBufferWrite(CAM_I2C_SLAVE_READ, ucBuffer, 2, I2C_SEND_STOP);
ASSERT_ON_ERROR(lRetVal);
ucBuffer[0] = pRegLst->ucRegAddr;
@@ -498,7 +524,7 @@
ucBuffer[2] = (unsigned char)(pRegLst->usValue & 0xFF);
}
- if(0 != I2CBufferWrite(CAM_I2C_SLAVE_ADDR,ucBuffer,
+ if(0 != I2CBufferWrite(CAM_I2C_SLAVE_WRITE,ucBuffer,
ulSize,I2C_SEND_STOP))
{
Uart_Write((uint8_t*)"\n\rError i2c write \n\r");
--- a/camera_app/mt9d111/mt9d111.h Sun Jul 12 09:13:56 2015 +0000
+++ b/camera_app/mt9d111/mt9d111.h Mon Jul 13 08:20:40 2015 +0000
@@ -19,6 +19,8 @@
unsigned short usValue;
} s_RegList;
+void getCamId(void);
+
/*!
\brief This function initilizes the camera sensor
--- a/main.cpp Sun Jul 12 09:13:56 2015 +0000 +++ b/main.cpp Mon Jul 13 08:20:40 2015 +0000 @@ -114,12 +114,12 @@ // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4); /* RCC_MCODIV_1 16MHz mco1 output on pin PA_8 (cam xclk) */ - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); +// HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); /* RCC_MCODIV_1 8MHz mco2 output on pin PC_9 (cam xclk) */ /* RCC_MCODIV_2 4MHz mco2 output on pin PC_9 (cam xclk) */ /* RCC_MCODIV_4 2MHz mco2 output on pin PC_9 (cam xclk) */ -// HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_HSE, RCC_MCODIV_1); + HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_HSE, RCC_MCODIV_1); //Used for ov7670 test /* RCC_MCODIV_4 24MHz mco2 output on pin PC_9 (cam xclk) */
--- a/utils/app_config.h Sun Jul 12 09:13:56 2015 +0000 +++ b/utils/app_config.h Mon Jul 13 08:20:40 2015 +0000 @@ -6,7 +6,7 @@ #define SPAWN_TASK_PRIORITY 7//9 #define HTTP_SERVER_APP_TASK_PRIORITY 1//1 #define CAMERA_SERVICE_PRIORITY 1 -#define OSI_STACK_SIZE 16 * 1024 +#define OSI_STACK_SIZE 8 * 1024