esp32s3 spi camera gc6133调试
gc6133 spi只有master模式,同时需要esp32提供主时钟,需要有主时钟然后才能通过i2c进行初始化.
测试了几种方式,记录如下
spi slave模式,需要使用很大内部内存
刚开始设置esp32s3 spi为slave模式,spi 接收buf需要设置dma属性的内部内存,需要的内部内存要大于2403202,测试时使用210KB,如果不是一次读一帧数据回来,每次的数据位移还不一样,可能还会掉数据,硬件连接,通过IO8使用lcdc timer给gc6133提供主时钟,需要将IO1与IO10连接在一起,esp32s3 spi为slave模式时读取必需要用cs信号,只能单独开个任务用IO1来定时控制spi cs信号IO10,此方式读回来的数据会有错位,还需要进行数据校正,只能说勉强能用,不使用内部内存,使用外部spi psram也测试过,数据完全错乱
通过io模拟spi 接收数据
通过io模拟spi,io来控制提供给gc6133的主时钟,变被动为主动,但速度太慢,模拟速度最快只有1MHz左右,比前一种方式稳定一点,可以使用外部spi psram
直接使用spi master模式
目前测试比较靠谱的方式,500ms能读到5-7帧左右正常的图像。
IO定义
#define GC6133_PIN_SCL 20
#define GC6133_PIN_SDA 19
#define GC6133_PIN_PWDN 17
#define GC6133_PIN_RST 18
#define GC6133_PIN_MCLK 8
#define CAM_PIN_SPI_MASTER_D0 15 //d0
#define CAM_PIN_SPI_MASTER_SCK 8 //mclk
#define CAM_SPI_MASTER_NUM SPI2_HOST
首先通过io8使用ledc timer给gc6133提供主时钟,通过i2c初始化gc6133,然后将io8配置成spi master的sck这样变被动为主动,pclk和cs信号就可以不需要了。对内部内存需要不用太大可以申请小一点的内部内存,然后多次读取将数据放到spi psram内存空间,最后在进行处理。
初始化主时钟
void gc6133_enable_out_clock()
{
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODE,
.timer_num = LEDC_TIMER,
.duty_resolution = LEDC_DUTY_RES,
.freq_hz = LEDC_FREQUENCY, // Set output frequency at 5 kHz
.clk_cfg = LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_MODE,
.channel = LEDC_CHANNEL,
.timer_sel = LEDC_TIMER,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = LEDC_OUTPUT_IO,
.duty = 1,
.hpoint = 0
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}
void gc6133_disable_out_clock()
{
ledc_stop(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL, 0);
}
gc6133初始化
const reg_list_t GC6133_YUV_240X320[] =
{
/
// SYS //
/
{
0xfe, 0xa0},
{
0xfe, 0xa0},
{
0xfe, 0xa0},
{
0xf6, 0x00},
{
0xfa, 0x11},
{
0xfc, 0x12}, //clock enable
{
0xfe, 0x00}, //Page select
{
0x49, 0x70}, //AWB r gain
{
0x4a, 0x40}, //AWB g gain
{
0x4b, 0x5d}, //AWB b gain
/
ANALOG & CISCTL
/
{
0x03, 0x00},
{
0x04, 0xfa},
{
0x01, 0x41}, //hb
{
0x02, 0x12}, //vb
{
0x0f, 0x01},
{
0x0d, 0x30},
{
0x12, 0xc8},
{
0x14, 0x54}, //dark CFA
{
0x15, 0x32}, //1:sdark 0:ndark
{
0x16, 0x04},
{
0x17, 0x19},
{
0x1d, 0xb9},
{
0x1f, 0x15}, //PAD_drv 35 15 ???
{
0x7a, 0x00},
{
0x7b, 0x14},
{
0x7d, 0x36},
{
0xfe, 0x10}, //cisctl rst [4]
/
// ISP //
/
{
0x20, 0x7e},
{
0x22, 0xb8},
//{0x24, 0x54}, //output_format ycbcr
{
0x24, 0x55}, //output_format rgb
//{0x24, 0x56}, //output_format
{
0x26, 0x87}, //[5]Y_switch [4]UV_switch [2]skin_en
//{0x29, 0x10},// disable isp quiet mode
{
0x39, 0x00},//crop window
{
0x3a, 0x80},
{
0x3b, 0x01}, //width
{
0x3c, 0x40},
//{0x3b, 0x00}, //width
//{0x3c, 0xf0},
{
0x3e, 0xf0},//height
/
// BLK //
/
{
0x2a, 0x2f},
{
0x37, 0x46}, //[4:0]blk_select_row
/
// GAIN /
/
{
0x3f, 0x18}, //global gain 20160901
/
// DNDD /
/
{
0x50, 0x3c},
{
0x52, 0x4f},
{
0x53, 0x81},
{
0x54, 0x43},
{
0x56, 0x78},
{
0x57, 0xaa},//20160901
{
0x58, 0xff},//20160901
/
// ASDE /
/
{
0x5b, 0x60}, //dd&ee th
{
0x5c, 0x80}, //60/OT_th
{
0xab, 0x28},
{
0xac, 0xb5},
/
/ INTPEE
/
{
0x60, 0x45},
{
0x62, 0x68}, //20160901
{
0x63, 0x13}, //edge effect
{
0x64, 0x43},
/