完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在适配一个新的CIS,这颗输出的格式是raw,大小为480*270,所以dma node size 为2880,图片fb_size为129600,程序将它计算为9次拷贝,一次的大小为14400,我在esp32-camera的基础上修改了很多内容,目前的问题是出在cam_hal中的cam_task,程序期待的是有9次IN_SUC_EOF中断,但是每次只收到8次,也就是在came_task中只拷贝了8次,所以得到的大小为115200(离正确的129600差14400),测量过sensor的波形,其pclk为6.4MHZ,一共有270个行同步信号,每个行同步信号内有480个pclk信号.
我使用的是esp32s3-eye,主程序如下: `extern "C" void app_main() { #if CONFIG_CAMERA_MODULE_ESP_EYE || CONFIG_CAMERA_MODULE_ESP32_CAM_BOARD /* IO13, IO14 is designed for JTAG by default, * to use it as generalized input, * firstly declair it as pullup input */ gpio_config_t conf; conf.mode = GPIO_MODE_INPUT; conf.pull_up_en = GPIO_PULLUP_ENABLE; conf.pull_down_en = GPIO_PULLDOWN_DISABLE; conf.intr_type = GPIO_INTR_DISABLE; conf.pin_bit_mask = 1LL << 13; gpio_config(&conf); conf.pin_bit_mask = 1LL << 14; gpio_config(&conf); #endif camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = CAMERA_PIN_D0; config.pin_d1 = CAMERA_PIN_D1; config.pin_d2 = CAMERA_PIN_D2; config.pin_d3 = CAMERA_PIN_D3; config.pin_d4 = CAMERA_PIN_D4; config.pin_d5 = CAMERA_PIN_D5; config.pin_d6 = CAMERA_PIN_D6; config.pin_d7 = CAMERA_PIN_D7; config.pin_xclk = CAMERA_PIN_XCLK; config.pin_pclk = CAMERA_PIN_PCLK; config.pin_vsync = CAMERA_PIN_VSYNC; config.pin_href = CAMERA_PIN_HREF; config.pin_sscb_sda = CAMERA_PIN_SIOD; config.pin_sscb_scl = CAMERA_PIN_SIOC; config.pin_pwdn = CAMERA_PIN_PWDN; config.pin_reset = CAMERA_PIN_RESET; config.xclk_freq_hz = 24000000; config.pixel_format = PIXFORMAT_GRAYSCALE; config.frame_size = FRAMESIZE_480X270; config.jpeg_quality = 12; config.fb_count = 2; config.fb_location = CAMERA_FB_IN_PSRAM; config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { ESP_LOGE(TAG, "Camera init failed with error 0x%x", err); return; } vTaskDelay(2000 / portTICK_RATE_MS); while (1) { ESP_LOGW(TAG, "Taking picture..."); camera_fb_t *pic = esp_camera_fb_get(); ESP_LOGW(TAG, "pic addr: %p ", pic->buf); // use pic->buf to access the image ESP_LOGW(TAG, "Picture taken! Its size was: %zu bytes", pic->len); esp_camera_fb_return(pic); // vTaskDelay(5000 / portTICK_RATE_MS); } }` 为了进一步调试,我修改了cam_hal中的buf_size检查,将尺寸不合规的frame的en也置为0,得到了如下输出: I (00:00:09.711) cam_hal: FB-SIZE: 115200 != 129600 W (00:00:09.712) example:take_picture: pic addr: 0x3d8009c8 W (00:00:09.712) example:take_picture: Picture taken! Its size was: 115200 bytes W (00:00:09.712) example:take_picture: Taking picture... I (00:00:09.741) cam_hal: FB-SIZE: 115200 != 129600 W (00:00:09.741) example:take_picture: pic addr: 0x3d82040c W (00:00:09.741) example:take_picture: Picture taken! Its size was: 115200 bytes W (00:00:09.742) example:take_picture: Taking picture... I (00:00:09.770) cam_hal: FB-SIZE: 115200 != 129600 W (00:00:09.770) example:take_picture: pic addr: 0x3d8009c8 W (00:00:09.771) example:take_picture: Picture taken! Its size was: 115200 bytes W (00:00:09.771) example:take_picture: Taking picture... I (00:00:09.799) cam_hal: FB-SIZE: 115200 != 129600 看起来像最后一个包的时候,程序还没来得及读到14400个字节,v信号就来了。实在想不出来问题出在哪。 当程序运行到这一行时的cam_obj: ` frame_buffer_event->len += ll_cam_memcpy(cam_obj, &frame_buffer_event->buf[frame_buffer_event->len], &cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size], cam_obj->dma_half_buffer_size);` |
|
相关推荐
1个回答
|
|
从您的描述来看,这个问题可能是由于DMA传输过程中的某些设置不正确或者中断处理逻辑出现问题导致的。以下是一些建议和可能的解决方案:
1. 检查DMA设置:确保DMA传输的配置正确,包括传输大小、传输次数等。您提到的DMA节点大小为2880,但是实际需要传输的总大小为129600。请确保DMA配置正确,以便在9次传输中完成整个图像数据的拷贝。 2. 检查中断处理逻辑:您提到程序期待有9次IN_SUC_EOF中断,但实际上只收到了8次。这可能是由于中断处理逻辑中的某些问题导致的。请检查中断处理函数,确保在每次中断触发时都能正确处理并更新相关变量。 3. 检查图像数据拷贝逻辑:在came_task中,您提到只拷贝了8次数据。请检查数据拷贝逻辑,确保每次拷贝都能正确地将数据从DMA缓冲区复制到目标缓冲区。此外,检查拷贝次数的计数逻辑,确保在9次拷贝完成后,程序能够正确地结束。 4. 检查CIS配置:由于您正在适配一个新的CIS,确保CIS的配置正确,包括输出格式、分辨率等。如果CIS配置不正确,可能会导致图像数据传输出现问题。 5. 检查时钟和同步信号:您提到测量过sensor的波形,pclk为6.4MHz,共有270个行同步信号。请确保这些参数与您的ESP32-S3-Eye硬件和软件配置相匹配,以确保图像数据传输的稳定性。 6. 调试和日志:在开发过程中,添加调试信息和日志记录可以帮助您更好地了解程序的运行情况。通过观察日志,您可以更容易地找到问题所在。 |
|
|
|
只有小组成员才能发言,加入小组>>
541浏览 6评论
454浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
434浏览 5评论
436浏览 4评论
409浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 15:23 , Processed in 0.754710 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号