配置索尼传感器

首先分析一下IMX222这颗图像CMOS

这颗芯片可以支持单字节写,读写指令可以单字节读也可以多字节读。

可以设置1080P格式

 

 

注意这里涉及到了高低位变化的处理

因为SPI 发送数据时,是高位在最前面,低位在最后面,所以这里需要涉及到高低位的转换。因为cmos芯片是低位在最高位。

比如0x02的发送,就变成了0100 0000了

 

 

u8 spi_wreg[REG_NUM][REG_BYTE]={
        { 0x02, 0x00, 0x31 }, //standby
        { 0x02, 0x01,0x01},     // vs reverse
        { 0X02, 0x02, 0xF }, //1080p
        { 0X02, 0x03, 0x4c }, //2
        { 0X02, 0x04, 0x04 }, //3
        { 0X02, 0x05, 0x65 }, //4
        { 0X02, 0x06, 0x04 }, //5
        { 0X02, 0x11, 0x00 },//6
        { 0X02, 0x12, 0x82 }, //7
        { 0X02, 0x14, 0x00 }, //8
        { 0X02, 0x15, 0x00 }, //9
        { 0X02, 0x16, 0x3C }, //10
        { 0X02, 0x17, 0x00 }, //11
        { 0X02, 0x18, 0xC0 }, //12
        { 0X02, 0x19, 0x07 }, //13
        { 0X02, 0x1A, 0x51 }, //14
        { 0X02, 0x1B, 0x04 }, //15
        { 0X02, 0x1e, 0x20 }, //gain
        { 0X02, 0x20, 0xf0 }, //16
        { 0X02, 0x21, 0x00 }, //16
        { 0X02, 0x2c, 0x00 }, //16
        { 0X02, 0x2d, 0x42 }, //clk
        { 0X02, 0x3b, 0xe1 }, //18 sync code
        { 0X02, 0x9A, 0x26 }, //22
        { 0X02, 0x9B, 0x02 }, //23
        { 0X02, 0xCE, 0x16 }, //24
        { 0X02, 0xCF, 0x82 }, //25
        { 0X02, 0xD0, 0x00 }, //26
        { 0X02, 0x00, 0x00 }, //27
};

配置列表如图所示:可以考虑使用二维数组的方式进行初始化。

比如:写一个for循环进行初始化

int initIMX222(XSpiPs *spipsptr){
    int i;
    int status;
    for(i=0;i<REG_NUM;i++){
        spi_wreg[i][0]=msb2lsb(spi_wreg[i][0]);
        spi_wreg[i][1]=msb2lsb(spi_wreg[i][1]);
        spi_wreg[i][2]=msb2lsb(spi_wreg[i][2]);
    }
    for(i=0;i<REG_NUM;i++){
        status = XSpiPs_PolledTransfer(spipsptr,spi_wreg[i],NULL,REG_BYTE);
        if(status != XST_SUCCESS){
            return status;
        }
    }
    return status;
}

 

其中 msb2lsb 是高低位转换的函数

u8 msb2lsb(u8 data){
    u8 tmp=0;
    int i;
    for(i=0;i<8;i++){
        if((data&0x01)==0x01){
            tmp = tmp | (0x01<<(7-i));
        }
        data=data>>1;
    }
    return tmp;
};

解释一下这个函数作用,首先data为8bit  然后进入for循环,判断最低位与上0x01,如果低位为1的话,把1左移7-i位,之后data右移1位,这样反复循环进行操作

 

GPIO初始化,可以参考GPIO的例子。有两个可以参考的

参考xgpiops_polled_example的例子

static int GpioOutputExample(void);
static int GpioInputExample(u32 *DataRead);
int GpioPolledExample(u16 DeviceId, u32 *DataRead);

一般要配置GPIO的话,需要设置GPIO输出方向,然后在使能输出,最后在设置GPIO的输出。

 

然后这里涉及到了GPIO BANK的使用,bank 0 和 bank 1为MIO ,bank2 和 bank 3为EMIO,

bank 0 有32个pin  ,bank 1有22个pin  ,所以要使用emio的话,是从54号引脚开始的。这样就理解了怎么使用MIO 以及EMIO

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值