查看: 8659|回复: 0

CSI和FlexIO模块的使用与示例

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3938

    主题

    7559

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40221
    最后登录
    2025-9-9
    发表于 2020-7-16 12:38:43 | 显示全部楼层 |阅读模式
    CSI和FlexIO模块的使用与示例


    为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
    本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
    点此回顾往期内容:
    GPIO详解
    FAST GPIO模块详解与使用示例
    ADC模块和QTIMER模块
    PIT模块详解与使用示例
    UART模块详解与使用示例




    各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天分享CSI和FLEXIO两个模块的使用,主要讲解如何利用这两个模块分别驱动灰度摄像头和彩色摄像头,分别实现图像采集。
    感谢恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。
    接下来进入我们今天分享的主题----“CSI模块详解与使用示例”&“FLEXIO模块详解与使用示例”:

    CSI模块详解与使用示例


    1. CSI功能


    CSI(CMOS Sensor Interface)是专用的图像传感器接口,RT1064的CSI接口支持8位、10位、16位并行接口。CSI模块内嵌DMA因此不需要占用MCU的DMA外设。


    2. CSI库函数


    以下函数均位于zf_csi.c和zf_csi.h:
    1.png
    csi_init函数参数
    2.png
    csi_add_empty_buffer函数参数
    3.png
    csi_get_full_buffer函数参数
    4.png
    CSI使用示例


    CSI灰度摄像头采集(以逐飞总钻风摄像头采集为例)
    1. #include "headfile.h"
    2.   
    3. int main(void)
    4. {
    5.     DisableGlobalIRQ();
    6.     board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口  
    7.       
    8.     ips200_init();      //初始化2寸 并口屏幕  
    9.     mt9v03x_csi_init();//使用CSI接口采集总钻风  
    10.       
    11.     EnableGlobalIRQ(0);
    12.   
    13.     while(1)
    14.     {
    15.         if(mt9v03x_csi_finish_flag)//采集完成标志位  
    16.         {
    17.             mt9v03x_csi_finish_flag = 0;
    18.             //显示图像  
    19.             ips200_displayimage032(mt9v03x_csi_image[0],MT9V03X_CSI_W,MT9V03X_CSI_H);
    20.         }
    21.     }
    22. }
    复制代码
    编程要点1:CSI底层函数不需要自己调用,直接调用摄像头初始化函数即可。
    编程要点2:关于CACHE一致性问题,摄像头驱动文件已经做好了,用户只需要直接使用图像数组即可。
    编程要点3:有细心童鞋问总钻风CSI不是有两个buffer?mt9v03x_csi1_image和mt9v03x_csi2_image两个数组,但是为啥在显示图像的时候并不是使用这两个数组呢,这是因为两个buffer在使用的时候需要用户手动的去切换,可能不是很方便,因此我们在编写驱动的时候特意定义了一个指向数组的指针mt9v03x_csi_image,在采集完成的中断里进行动态切换,用户使用时当做普通的二维数组使用即可,请勿使用sizeof计算mt9v03x_csi_image大小。因为这仅仅是一个指针而已。在第四章中的摄像头小节中有更详细的讲解。
    CSI彩色摄像头采集(以逐飞凌瞳彩摄采集为例)
    1. #include "headfile.h"

    2. int main(void)
    3. {
    4.     DisableGlobalIRQ();
    5.     board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口
    6.       
    7.     ips200_init();      //初始化2寸 并口屏幕
    8.     scc8660_csi_init();//使用CSI接口采集总钻风
    9.              
    10.     EnableGlobalIRQ(0);
    11.           
    12.     while(1)
    13.     {
    14.         if(scc8660_csi_finish_flag)//采集完成标志位
    15.         {
    16.             scc8660_csi_finish_flag = 0;
    17.             //显示图像
    18.             ips200_displayimage8660_zoom(scc8660_csi_image[0],SCC8660_CSI_PIC_W,SCC8660_CSI_PIC_H,SCC8660_CSI_PIC_W,SCC8660_CSI_PIC_H);
    19.         }
    20.     }
    21. }
    复制代码
    编程要点:与上面总钻风采集要点一致,请参考上一步

    FLEXIO模块


    1. FLEXIO功能


    FLEXIO(Flexible I/O)是一种高度可配置的模块,提供众多功能。可支持UART、I2C、SPI、I2S、Camera IF、Motorola 68K/Intel 8080 bus、PWM/Waveform generation协议等等。本章节主要FLEXIO实现摄像头采集的功能。


    2. FLEXIO库函数


    以下函数位于zf_camera.c和zf_camera.h:
    5.png
    flexio_camera函数参数
    6.png
    flexio_enable函数参数
    7.png
    flexio_dma_init函数参数
    8.png
    FLEXIO使用示例



    1. 摄像头采集
    1. #include "headfile.h"
    2.   
    3. #define TEST_ROW    120//定义图像高度  
    4. #define TEST_COL    188//定义图像宽度  
    5.   
    6. //定义图像数组大小  务必4字节对齐  
    7. AT_DTCM_SECTION_ALIGN(uint8 image_test[TEST_ROW][TEST_COL],4);
    8.   
    9. void camera_dma(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
    10. {
    11.     //dma完成中断
    12.     //L1CACHE_CleanInvalidateDCacheByRange((uint32)image_test[0],TEST_COL*TEST_ROW);
    13.     //如果数据存放在TCM则可以不需要这句话  
    14. }
    15.   
    16. void GPIO2_Combined_0_15_IRQHandler(void)
    17. {
    18.     //场中断
    19.     dma_restart(image_test[0]);//重新加载目的地址
    20. }
    21.   
    22.   
    23. int main(void)
    24. {
    25.     DisableGlobalIRQ();
    26.     board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口
    27.       
    28.     dma_mux_init();//dma复用初始化

    29.     //设置C8-C15为数据引脚  C5为像素时钟引脚  C6为行引脚
    30.     flexio_camera(FLEXIO2_D08_C8, FLEXIO2_D05_C5, FLEXIO2_D06_C6);
    31.     //设置存储图像的地址 图像字节数 dma回调函数
    32.     flexio_dma_init(image_test[0], TEST_COL*TEST_ROW, camera_dma);
    33.     //使能flexio
    34.     flexio_enable_rxdma();
    35.       
    36.     //初始化IO中断   用于接收场中断信号
    37.     gpio_interrupt_init(C7, FALLING, GPIO_INT_CONFIG);
    38.     //设置场中断优先级 范围0-15 越小优先级越高
    39.     NVIC_SetPriority(GPIO2_Combined_0_15_IRQn,0);
    40.       
    41.     EnableGlobalIRQ(0);
    42.     while(1)
    43.     {
    44.       
    45.     }
    46. }
    复制代码
    编程要点1:定义的图像数组必须4字节对齐。
    编程要点2:采集的图像列宽最好是4的倍数。
    编程要点3:flexio camera接口并不包含场信号,场信号需要自己开IO中断来实现。
    编程要点4:建议用户使用seekfree_peripheral文件夹下已编写好的总钻风或者凌瞳驱动来直接采集摄像头数据。




    本期逐飞科技“基于RT1064的智能车应用入门指导”之“CSI模块详解与使用示例”&“FLEXIO模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足及建议请及时联系“逐飞科技”:
    逐飞科技__智能车③部:824575535;
    AI电磁组交流群--逐飞科技:1077051054;
    我们将尽快完善。感谢关注“逐飞科技”,下期再见!




    文章出处:恩智浦MCU加油站

    qiandao qiandao
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-9 13:04 , Processed in 0.081246 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表